当前位置:  开发笔记 > 编程语言 > 正文

C中完整的"for"循环语法是什么?

如何解决《C中完整的"for"循环语法是什么?》经验,为你挑选了3个好方法。

for在阅读其他人的代码时,我看到了一些非常奇怪的循环.我一直在尝试搜索for循环的完整语法解释,C但这很难,因为单词" for"出现在不相关的句子中,使得搜索几乎不可能有效地进行Google.

在阅读了这个让我再次好奇的帖子后,我想起了这个问题.

for这里:

for(p=0;p+=(a&1)*b,a!=1;a>>=1,b<<=1);

在中间条件下有一个逗号分隔两段代码,这个逗号有什么作用?右边的逗号我理解,因为它使得a>>=1b<<=1.

但是在循环退出条件下,会发生什么?它是在何时p==0,何时a==1或何时发生时退出?

如果有人能帮助我理解这一点并且可能指向完整for循环语法描述的方向,那将是很棒的.



1> CesarB..:

逗号不包括for循环; 它是逗号运算符.

x = (a, b);

首先做a,然后是b,然后将x设置为b的值.

for语法是:

for (init; condition; increment)
    ...

这有点(忽略continue,break现在)相当于:

init;
while (condition) {
    ...
    increment;
}

所以你的for循环示例(再次忽略continuebreak)等效于

p=0;
while (p+=(a&1)*b,a!=1) {
    ...
    a>>=1,b<<=1;
}

其行为就像它(再次忽略continuebreak):

p=0; 
while (true) {
    p+=(a&1)*b;
    if (a == 1) break;
    ...
    a>>=1;
    b<<=1;
}

for循环的两个额外细节不在上面的while循环的简化转换中:

如果省略的条件下,它总是true(导致无限循环,除非break,goto或别的东西打破了循环).

A continue就好像它是在增量之前转移到标签上,而不像continuewhile循环那样会跳过增量.

此外,关于逗号操作符的一个重要的细节:这是一个序列点,像&&||(这就是为什么我可以在单独的语句分裂,并保持它的意义完好).


C99的变化

C99标准引入了本解释中前面未提及的几个细微差别(这对C89/C90非常有用).

首先,所有循环本身都是块.有效,

for (...) { ... }

它本身就是一对括号

{
for (...) { ... }
}

标准说:

ISO/IEC 9899:1999§6.8.5迭代声明

5迭代语句是一个块,其范围是其封闭块范围的严格子集.循环体也是一个块,其范围是迭代语句范围的严格子集.

在额外的括号组中,这也在基本原理中有所描述.

其次,initC99中的部分可以是(单个)声明,如

for (int i = 0; i < sizeof(something); i++) { ... }

现在,'围绕环绕的块'自成一体; 它解释了为什么变量i不能在循环外访问.您可以声明多个变量,但它们必须都是相同的类型:

for (int i = 0, j = sizeof(something); i < j; i++, j--) { ... }

标准说:

ISO/IEC 9899:1999§6.8.5.3for语句

该声明

for ( clause-1 ; expression-2 ; expression-3 ) statement

行为如下:表达式expression-2是在每次执行循环体之前计算的控制表达式.在每次执行循环体之后,表达式-3被评估为void表达式.如果clause-1是一个声明,它声明的任何变量的范围是声明的剩余部分和整个循环,包括其他两个表达式; 它是在控制表达式的第一次评估之前按执行顺序到达的.如果clause-1是表达式,则在第一次控制表达式求值之前将其计算为void表达式.133)

可以省略子句-1和表达式3.省略的表达式-2由非零常量替换.

133)因此,第1节规定了循环的初始化,可能声明一个或多个变量用于循环; 控制表达式expression-2指定在每次迭代之前进行的评估,这样循环的执行将继续,直到表达式比较等于0; 和expression-3指定在每次迭代后执行的操作(例如递增).



2> Konrad Rudol..:

逗号只是分隔两个表达式,并且在C中允许正常表达式的任何地方都有效.这些按从左到右的顺序执行.最右边表达式的值是整个表达式的值.

for循环由三部分组成,其中任何部分也可以是空的; 一个(第一个)在开始时执行,一个(第三个)在每次迭代结束时执行.这些部分通常分别初始化和递增计数器; 但他们可以做任何事情.

第二部分是一个试验是在每次执行的最初开始执行.如果测试结果false,则循环中止.这里的所有都是它的.


你说句话的方式是"一个(第一个)在开始时执行,一个(第三个)在每次迭代结束时"可能会让一些人认为第一部分是在迭代开始时执行的.

3> Tomalak..:

循环的C样式包含三个表达式:

for (initializer; condition; counter) statement_or_statement_block;

循环开始时,初始化程序运行一次.

在每次迭代之前检查条件.循环运行只要它评估为真.

计数器在每次迭代后运行一次.

这些部分中的每一部分都可以是您编写循环语言的有效表达式.这意味着它们可以更具创造性地使用.你想要事先做的任何事情都可以进入初始化程序,你想要做的任何事情都可以进入条件或计数器,直到循环没有正文的程度.

为此,逗号运算符非常方便.它允许您将表达式链接在一起以形成单个新表达式.大多数情况下,它在for循环中以这种方式使用,逗号运算符的其他含义(例如值赋值注意事项)起着次要作用.

即使你可以通过创造性地使用语法来做聪明的事情 - 我会保持清醒,直到我找到一个非常好的理由这样做.使用for循环播放代码高尔夫使代码更难以阅读和理解(和维护).

维基百科也有关于for循环的好文章.

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有