语法酸

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_starti<=5&&i>=-1
  • check_this_each_time++i
  • run_this_after_each_iterationi>0

语法的角度来看,所有都是有效的表达式。所以,编译器很高兴,没有警告。

注意:要分解 i<=5&&i>=-1,在 C 中,<=&& 具有更高的 precedence,所以实际上,您的代码表现得像 ((i<=5) && (i>=-1)) 这是完全有效的。

[#] - 有关详细想法,请参阅我的 this answer