语法酸
Syntactical Sour
好吧,有些书的作者向您抛出了一些奇怪的语法问题,只是为了检查您对语法的理解,而我认为这些奇怪的语法可能不会被任何程序员使用,只是为了方便为了理解,我想了解以下 for 循环的行为方式以及为什么编译器不会抛出任何语法错误
#include <stdio.h>
int main(void)
{
short int i=0;
for(i<=5&&i>=-1 ;++i; i>0)
printf("%d",i);
return 0;
}
for 语句的形式如下:
for(expression; expression; expression);
三个表达式可以是C语言允许的任何有效表达式。
所以代码在语法上是有效的。但是由于未初始化的变量,行为将是未定义的。此外,建议使用 int main(void)
和 return 退出代码。
从 C99 和 C11 开始,也允许用声明代替第一个表达式,使其成为语句。因此它是:
for(statement; expression; expression);
For 循环是:
for( run_this_once_at_start; check_this_each_time; run_this_after_each_iteration)
这三个区域中的实际代码可以是任何表达式,只要第二个表达式是 !
运算符的有效操作数即可。在 C99 及更高版本中,第一个甚至可以包含声明。
在你的例子中没有语法错误。第一个和第三个条件没有做被认为是好的风格,但是它们并不违法。
好的,对于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
从语法的角度来看,所有都是有效的表达式。所以,编译器很高兴,没有警告。
注意:要分解 i<=5&&i>=-1
,在 C
中,<=
比 &&
具有更高的 precedence,所以实际上,您的代码表现得像 ((i<=5) && (i>=-1))
这是完全有效的。
[#] - 有关详细想法,请参阅我的 this answer。
好吧,有些书的作者向您抛出了一些奇怪的语法问题,只是为了检查您对语法的理解,而我认为这些奇怪的语法可能不会被任何程序员使用,只是为了方便为了理解,我想了解以下 for 循环的行为方式以及为什么编译器不会抛出任何语法错误
#include <stdio.h>
int main(void)
{
short int i=0;
for(i<=5&&i>=-1 ;++i; i>0)
printf("%d",i);
return 0;
}
for 语句的形式如下:
for(expression; expression; expression);
三个表达式可以是C语言允许的任何有效表达式。
所以代码在语法上是有效的。但是由于未初始化的变量,行为将是未定义的。此外,建议使用 int main(void)
和 return 退出代码。
从 C99 和 C11 开始,也允许用声明代替第一个表达式,使其成为语句。因此它是:
for(statement; expression; expression);
For 循环是:
for( run_this_once_at_start; check_this_each_time; run_this_after_each_iteration)
这三个区域中的实际代码可以是任何表达式,只要第二个表达式是 !
运算符的有效操作数即可。在 C99 及更高版本中,第一个甚至可以包含声明。
在你的例子中没有语法错误。第一个和第三个条件没有做被认为是好的风格,但是它们并不违法。
好的,对于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
从语法的角度来看,所有都是有效的表达式。所以,编译器很高兴,没有警告。
注意:要分解 i<=5&&i>=-1
,在 C
中,<=
比 &&
具有更高的 precedence,所以实际上,您的代码表现得像 ((i<=5) && (i>=-1))
这是完全有效的。
[#] - 有关详细想法,请参阅我的 this answer。