是({statements;}; condition; {statements;})合法C?

Alc*_*ive 5 c for-loop curly-braces

虽然风格不好,但在parens中有一个带有支撑的for循环是合法的吗?像这样:

char *a = "a ";
char *b = "b ";

for ( { int aComesFirst = 1;
        char *first = a;
        char *second = b;
      };
      aComesFirst >= 0;
      { aComesFirst--;
        swap(first, second);
      } )
{
  printf("%s%s\n", first, second);
}
Run Code Online (Sandbox Code Playgroud)

如果有可能出现这些问题,我应该在第一次关闭括号之后加一个分号,还是会添加一个空语句?

我确实认识到,char*在for循环之外移动声明以及循环swap内部结束时,在风格上更好.但风格不是这个问题的重点,我只是想知道是否可以在支架内放置支架.

Pot*_*ter 9

我之前已经回答了这个问题......通过添加本地struct类型,可以很容易地在C或C++中使其合法化.但这通常是糟糕的风格.

char *a = "a ";
char *b = "b ";

for ( struct loopy {
        int aComesFirst;
        char *first;
        char *second;
      } l = { 1, a, b }; /* define, initialize structure object */

      l.aComesFirst >= 0; /* loop condition */

      l.aComesFirst--, /* loop advance */
      swap(l.first, l.second)
    )
{
  printf("%s%s\n", l.first, l.second);
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*der 6

不,这不合法,但你可以用逗号来到中途:

for (int a = 1, b = 2; a < 10; ++a, ++b)
Run Code Online (Sandbox Code Playgroud)

您不能声明不同类型的多个变量,并且您不能在最后一位使用控制结构,但它在大多数情况下都足够好.

如果您不知道,那里使用的逗号没有一些只能在for循环中使用的特殊语法,它是一个通用运算符,可以在任何地方用来计算左操作数,然后是右操作数,并返回结果合适的表情,即a, b == b,和a, b, c == c等等.