免责声明:我知道这是不明确的,我不会这样编程。我知道首选的do-while
声明,而不是那个,问题更多的是关于特定语言结构的有效性。
goto
总是应该省略for
循环的条件表达式吗?根据我的观察,它跳过了第一个(即初始化)和第二个表达式。这总是会以这种方式发生,还是纯粹依赖于编译器?
#include <stdio.h>
int main(void)
{
int m = 5;
goto BODY;
for (m = 0; m < 5; m++)
BODY: puts("Message"); // prints "Message" once
printf("m = %d\n", m); // prints m = 6
return 0;
}
答案 0 :(得分:21)
是的,您正跳过m = 0
和m < 5
,这是应该的。
for (A; B; C)
D;
相当于
{
A;
loop:
if (B)
{
D;
C;
goto loop;
}
}
无法将控件转移到A
和B
之间的某个位置。
你的循环的语义就像这样#34;纯goto&#34;版本:
int m = 5;
goto BODY;
m = 0;
loop:
if (m < 5)
{
BODY: puts("Message"); // prints "Message" once
m++;
goto loop;
}
printf("m = %d\n", m); // prints m = 6
答案 1 :(得分:6)
goto总是应该省略for的条件表达式 循环?
是。 goto跳转始终是无条件跳转,执行将从标签开始执行。
从C11草案,§6.8.6.1goto语句:
goto语句导致无条件跳转到语句 在封闭函数中以命名标签作为前缀。
唯一的例外是:
goto语句中的标识符应指定位于的标签 在封闭功能的某个地方。 goto语句不得跳转 来自具有可变修改的标识符范围之外的 键入到该标识符范围内。
答案 2 :(得分:4)
代码中的goto
语句导致无条件跳转到for
循环内的语句。当执行该语句时,程序的流程应该依赖于条件表达式在循环中。所以,跳过循环内部的初始化。
答案 3 :(得分:2)
您应该使用do/while
循环,例如,如果您有以下for循环:
for(A ; B ; C)
{
D;
}
您应该使用以下do / while循环:
A;
do
{
D;
C;
}while(B);
将强制进行第一次迭代。
修改强>
请参阅chux的评论:如果D;
包含continue
,这种方式无法使用,您需要采用其他方式
编辑II
当问题被编辑时,这个答案不再是问题的直接答案,但我不会删除它,因为它可能对某人有帮助......
答案 4 :(得分:2)
C编程中的goto语句提供了一个无条件跳转来自&#39; goto&#39;在同一函数中使用带标签的语句。
请注意无条件一词。
所以是的,它应该省略for
循环的条件表达式。
答案 5 :(得分:2)
这在c中是完全合法的。只要你不跳过自动变量的任何声明或初始化,跳进for循环就没有错。
在这种情况下,m增加一次,并且由于满足停止条件,循环终止。