5

悪いスタイルにもかかわらず、パレンの内側に中括弧を付けたforループを持つことは合法的なCですか?このような:

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 == b、などa, 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(句-1; expr-2; expr-3)ステートメント

どちらでもないexpr-2expr-3、式ではないもの(ブロックは式ではないclause-1)で置き換えることができると確信しています。また、ステートメントで置き換えることもできないと確信しています。

于 2010-10-03T23:47:00.270 に答える