卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章65594本站已运行4129

在“for”循环初始化子句中声明多个变量

在“for”循环初始化子句中声明多个变量

介绍

如你所知,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 



<p>这很好,因为它限制了循环体中声明的变量的范围。也可以声明多个变量:<br></p>

<pre class="brush:php;toolbar:false">for ( 无符号 i = 0, j = 0; i 



<blockquote>
<p>迭代表达式<em> 可以使用逗号运算符来计算多个子表达式。  (实际上,</em>任何<em>表达式都可以使用逗号运算符来计算多个子表达式。)</em>
</p>

</blockquote>但是如果你想声明多个类型不同的变量怎么办?你不能。相反,您被迫在循环外声明不同类型的变量:<p>
<br></p>size_t i = 0;
for (node_t *p = list-&gt;head; p-&gt;data; ++i, p = p-&gt;next ) {
<pre class="brush:php;toolbar:false">



或者我是这么想的。正如我评论的:

即使是像 C 这样相对较小的语言,我仍然在学习新技术,尽管我已经使用 C 超过 35 年了。

事实证明,你

可以init-clause中声明多个类型不同的变量.

伎俩

诀窍是使用本地匿名结构:

for ( struct { size_t i; node_t *p; } 循环 = { 0, list-&gt;head };
      循环.p-&gt;数据; ++loop.i,loop.p =loop.p-&gt;下一个 ) {

当然,你可以将循环命名为你想要的任何名称; iter 或者 it 都是合理的选择。

当然,它看起来很奇怪,而且必须引用循环有点难看——但你可以做到。它可能更有用的一个地方是,如果循环是宏的一部分,那么丑陋的地方就会被隐藏起来。

但是仅仅因为你能做到,你就应该吗?这是有争议的。毕竟,在循环外声明不同类型的变量并不那么可怕。 这是与所有变量都限制在循环范围内的重要性的权衡。 在 C 语言中,这通常并不那么重要。 然而,在 C++ 中,如果至少一个循环变量属于具有析构函数的类型,并且它在循环终止后立即运行很重要,那么这可能证明使用结构体是合理的。 当然,C++ 具有可以替代使用的结构化绑定:


for ( auto [i, p] = std::make_tuple( 0, list->head ); p->数据; ++i, p = p->下一个 ) {


  
  
  结论

结构技巧当然没有那么重要,甚至可能不足以证明本文的存在。但我确实认为它很聪明,甚至在有限的情况下很有用,所以我认为它值得传递,因为我在超过 35 年的 C 编程生涯中从未遇到过它。

卓越飞翔博客
上一篇: 免费 .NET 训练营及招聘机会
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏