嗯,一些作者只是为了检查对语法的理解而向你抛出一些奇怪的语法问题,而我认为这些奇怪的语法可能不会被任何程序员使用,只是为了理解,我想了解以下for循环的行为以及编译器为什么不抛出任何语法错误
#include <stdio.h>
int main(void)
{
short int i=0;
for(i<=5&&i>=-1 ;++i; i>0)
printf("%d",i);
return 0;
}
答案 0 :(得分:2)
for语句具有以下形式:
for(expression; expression; expression);
这三个表达式可以是C语言中允许的任何有效表达式。
所以代码在语法上是有效的。但是由于未初始化的变量,行为将是未定义的。此外,建议使用int main(void)
并返回退出代码。
从C99和C11开始,也允许声明代替第一个表达式使其成为语句。因此它是:
for(statement; expression; expression);
答案 1 :(得分:2)
For循环是:
for( run_this_once_at_start; check_this_each_time; run_this_after_each_iteration)
这三个区域中的实际代码可以是任何表达式,只要第二个表达式是!
运算符的有效操作数即可。第一个甚至可以在C99及更高版本中包含声明。
在您的示例中,没有语法错误。第一个和第三个条件没有做到被认为是好的风格,但它们并不违法。
答案 2 :(得分:1)
好的,根据for
循环,简化语法#是
for( run_this_once_at_start; check_this_each_time; run_this_after_each_iteration)
信用:马特先生
编译器只会检查匹配的语法。让我们将它与您的代码进行比较,即
for(i<=5&&i>=-1 ;++i; i>0)
所以,在崩溃之后,
run_this_once_at_start
是i<=5&&i>=-1
注意 check_this_each_time
是++i
run_this_after_each_iteration
是i>0
其中 all 是语法视点中的有效表达式。所以,编译器很开心,没有警告。
注意:要在i<=5&&i>=-1
中细分C
,<=
的{{3}}高于&&
,因此,您的代码行为类似于{{1}这完全有效。
[#] - 有关详细信息,请参阅我的precedence。