11

C11 仕様にアクセスできないため、このバグを調査できません。

次の宣言では、コンパイル中にエラーが発生します。

int why[2] =  1 == 1 ? {1,2} : {3,4}; 

エラーは次のとおりです: { の前に期待される式 および: の前に式が期待される :

4

3 に答える 3

2

ここでのチャールズ・ベイリーの答えから:条件式からの文法

   conditional-expression:
        logical-OR-expression
        logical-OR-expression ? expression : conditional-expression

  1 == 1 ? {1,2} : {3,4}; 
           ^        ^       are not expressions  

これが、コンパイラが次のようなエラーを出す理由です。

error: expected expression before ‘{’ token    // means after ?
error: expected expression before ‘:’ token    // before :

@Rudi Rüssel がコメントしたように編集します

以下は、c の有効なコードです。

int main(){
    {}
    ;
    {1,2;}
}

Cの{}ステートメントを組み合わせるために使用します。;

注:私が書い{1,2}た場合、そのエラーは式ですがステートメントではない(*expected ‘;’ before ‘}’ token*)ためです。1,2

OPの場合:Cの式ステートメントとは何ですか、ブロックステートメント式ステートメントとは何ですか

edit2:
注: @ouah が typecase を使用して式に変換する方法、はい:

理解するには、次のコードを実行します。

int main(){
 printf("\n Frist = %d, Second =  %d\n",((int[2]){1,2})[0],((int[2]) {1,2})[1]);
}

次のように機能します。

~$ ./a.out 

 Frist = 1, Second =  2
于 2013-04-08T11:20:37.087 に答える
0

初期化リストは式ではないため、式では使用できません。

配列を初期化せずに memcpy を使用することをお勧めします。

int why[2];
memcpy( why, 1 == 1 ? (int[2]){1,2} : (int[2]){3,4}, sizeof why );
于 2015-01-18T07:46:38.293 に答える