我无法访问C11规范,因此我无法调查此错误。
以下声明在编译期间出现错误:
int why[2] = 1 == 1 ? {1,2} : {3,4};
错误是:在{和:之前的预期表达式:
之前的预期表达式答案 0 :(得分:9)
这不是有效的C11。
您只能使用不带表达式的初始化列表初始化数组。
int why[2] = { ... }; // initializer-list {}
此外,1 == 1 ? {1,2} : {3,4}
不是有效的C表达式,因为{1, 2}
不是C表达式。
仅仅是使用复合文字的信息,您可以使用指针对象获得您想要的东西:
int *why = (1 == 1) ? (int[2]) {1,2} : (int[2]) {3,4};
答案 1 :(得分:2)
来自Charles Bailey的回答:Gramma from conditional-expression
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 :
编辑为@RudiRüssel评论道:
以下是c:
中的有效代码int main(){
{}
;
{1,2;}
}
我们使用{}
来合并C中的语句;
。
注意:如果我写{1,2}
,则其错误为(*expected ‘;’ before ‘}’ token*)
,因为1,2
是表达式,但不是语句。
对于OP:什么是The Expression Statement in C,什么是Block Statement和Expression Statements
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
答案 2 :(得分:0)
初始化列表不是表达式,因此不能在表达式中使用它们。
我建议你保持阵列未初始化并使用memcpy。
int why[2];
memcpy( why, 1 == 1 ? (int[2]){1,2} : (int[2]){3,4}, sizeof why );