
如你所知,C 和 C++ 中 for 语句的语法是:
for ( init-clause ; 条件表达式 ; 迭代表达式 )
地点:
全部都是可选的;如果省略condition-expr,就好像它是1,因此:
for (;;) { // 永远
// ...
}
永远循环(大概是通过break、return、goto、exit()、longjmp()、abort()之一退出,或者在C++中是throw)。
C++ 也有基于范围的 for 循环,但那是另一个故事了。
最初,init-clause只能是一个语句或表达式;从 C99 开始,它也可以是一个声明:
for ( 无符号 i = 0; i < m; ++i ) {
这很好,因为它限制了循环体中声明的变量的范围。也可以声明多个变量:
for ( 无符号 i = 0, j = 0; i < m && j < n; ++i, ++j ) {
但是如果你想声明多个类型不同的变量怎么办?你不能。相反,您被迫在循环外声明不同类型的变量:迭代表达式 可以使用逗号运算符来计算多个子表达式。 (实际上,任何表达式都可以使用逗号运算符来计算多个子表达式。)
即使是像 C 这样相对较小的语言,我仍然在学习新技术,尽管我已经使用 C 超过 35 年了。事实证明,你
可以在init-clause中声明多个类型不同的变量.
诀窍是使用本地匿名结构:
for ( struct { size_t i; node_t *p; } 循环 = { 0, list->head };
循环.p->数据; ++loop.i,loop.p =loop.p->下一个 ) {
当然,你可以将循环命名为你想要的任何名称; iter 或者 it 都是合理的选择。
当然,它看起来很奇怪,而且必须引用循环有点难看——但你可以做到。它可能更有用的一个地方是,如果循环是宏的一部分,那么丑陋的地方就会被隐藏起来。
但是仅仅因为你能做到,你就应该吗?这是有争议的。毕竟,在循环外声明不同类型的变量并不那么可怕。 这是与所有变量都限制在循环范围内的重要性的权衡。 在 C 语言中,这通常并不那么重要。 然而,在 C++ 中,如果至少一个循环变量属于具有析构函数的类型,并且它在循环终止后立即运行很重要,那么这可能证明使用结构体是合理的。 当然,C++ 具有可以替代使用的结构化绑定:
for ( auto [i, p] = std::make_tuple( 0, list->head );
p->数据; ++i, p = p->下一个 ) {
结论
以上就是在“for”循环初始化子句中声明多个变量的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号