代码之家  ›  专栏  ›  技术社区  ›  AlcubierreDrive

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

  •  5
  • AlcubierreDrive  · 技术社区  · 14 年前

    尽管样式不好,但是在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);
    }
    

    如果这些行中的某些内容是可能的,我应该在第一个右大括号后面加一个分号,还是添加一个空语句?

    意识到这一步我做得更好 char* swap 到循环内部的末尾。但风格并不是这个问题的重点,我只想知道是否可以在parens内部放置大括号。

    6 回复  |  直到 14 年前
        1
  •  9
  •   Potatoswatter R. Martinho Fernandes    14 年前

    我已经回答了这个问题,然后通过添加本地代码,可以很容易地在C或C++中合法化。 struct

    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);
    }
    
        2
  •  6
  •   Peter Alexander    14 年前

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

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

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

    如果你不知道的话,用逗号是没有什么特殊的语法,只能用在 for 循环,这是一个将军 operator a, b == b a, b, c == c 等等。

        3
  •  3
  •   mikerobi    14 年前

    不,这是不合法的。如果这是合法的,那么代码无论如何也不能工作,因为c有块级的作用域,所以你不能访问大括号中定义的变量。

        4
  •  2
  •   Dinah SLaks    14 年前

    这是不合法的,但这是:

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

    参见: the comma operator

        5
  •  1
  •   Ming-Tang    14 年前

    gcc 有语句表达式吗? http://tigcc.ticalc.org/doc/gnuexts.html#SEC63 也许这会让这种代码生效。只是 (int i = { stmts; }; { stmts; bool}; { ... })

        6
  •  0
  •   pmg    14 年前

    标准规定(6.8.5.3/1)

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

    expr-2 expr-3 可以替换为非表达式( 块不是表达式 ),我很确定 clause-1