介绍
如你所知,C 和 C++ 中 for 语句的语法是:
for ( init-clause ; 条件表达式 ; 迭代表达式 )
地点:
init-clause 用于初始化(准备)循环的开始;condition-expr 在每次迭代之前进行评估:如果为零,则循环退出;iteration-expr 在每次迭代后进行评估。
全部都是可选的;如果省略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 ) {
登录后复制
迭代表达式 可以使用逗号运算符来计算多个子表达式。 (实际上,任何表达式都可以使用逗号运算符来计算多个子表达式。)
但是如果你想声明多个类型不同的变量怎么办?你不能。相反,您被迫在循环外声明不同类型的变量:
size_t i = 0;for (node_t *p = list->head; p->data; ++i, p = p->next ) {
登录后复制或者我是这么想的。正如我评论的:
即使是像 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->下一个 ) {
结论
登录后复制
结构技巧当然没有那么重要,甚至可能不足以证明本文的存在。但我确实认为它很聪明,甚至在有限的情况下很有用,所以我认为它值得传递,因为我在超过 35 年的 C 编程生涯中从未遇到过它。
以上就是在“for”循环初始化子句中声明多个变量的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2557558.html