C11 仕様にアクセスできないため、このバグを調査できません。
次の宣言では、コンパイル中にエラーが発生します。
int why[2] = 1 == 1 ? {1,2} : {3,4};
エラーは次のとおりです: { の前に期待される式 および: の前に式が期待される :
C11 仕様にアクセスできないため、このバグを調査できません。
次の宣言では、コンパイル中にエラーが発生します。
int why[2] = 1 == 1 ? {1,2} : {3,4};
エラーは次のとおりです: { の前に期待される式 および: の前に式が期待される :
ここでのチャールズ・ベイリーの答えから:条件式からの文法
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
初期化リストは式ではないため、式では使用できません。
配列を初期化せずに memcpy を使用することをお勧めします。
int why[2];
memcpy( why, 1 == 1 ? (int[2]){1,2} : (int[2]){3,4}, sizeof why );