5

尽管风格不好,但在括号内有一个带大括号的 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);
}

如果沿着这些思路是可能的,我应该在第一个右大括号之后放一个分号,还是会添加一个空语句?

我确实意识到将char*声明移到 for 循环之外和循环swap内部的末尾在风格上更好。但是风格不是这个问题的重点,我只想知道是否可以在括号内放置大括号。

4

6 回答 6

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);
}
于 2010-10-03T23:46:37.993 回答
7

不,这是不合法的,但您可以使用逗号来达到一半:

for (int a = 1, b = 2; a < 10; ++a, ++b)

不能声明多个不同类型的变量,也不能在最后一位使用控制结构,但大多数时候已经够用了。

如果你不知道,这里使用的逗号并不是什么特殊语法只能在for循环中使用,它是一个通用运算符,可以在任何地方使用,计算左操作数,后跟右操作数,并返回结果正确的表达方式,即a, b == ba, b, c == c等等。

于 2010-10-03T23:43:04.733 回答
3

不,这是不合法的。如果它是合法的,那么代码无论如何都不会工作,因为 c 具有块级范围,因此您将无法访问大括号中定义的变量。

于 2010-10-03T23:44:07.343 回答
2

这不合法,但这是:

for(i = 0, j = 10; i < 10; i++, j--)
{
  // ..
}

请参阅:逗号运算符

于 2010-10-03T23:44:24.240 回答
1

您是否使用gccwith 语句表达式?http://tigcc.ticalc.org/doc/gnuexts.html#SEC63 也许这会使这种类型的代码工作。除了它(int i = { stmts; }; { stmts; bool}; { ... })

于 2010-10-03T23:50:38.437 回答
0

标准说(6.8.5.3/1)

for (clause-1 ; expr-2 ; expr-3 ) 语句

我很确定既不能也不expr-2能用expr-3不是表达式的东西代替(块不是表达式),而且我很确定clause-1也不能用语句代替。

于 2010-10-03T23:47:00.270 回答