我无权访问 C11 规范,因此无法调查此错误。
以下声明在编译期间引发错误:
int why[2] = 1 == 1 ? {1,2} : {3,4};
错误是: { 之前的预期表达式和: 之前的预期表达式:
我无权访问 C11 规范,因此无法调查此错误。
以下声明在编译期间引发错误:
int why[2] = 1 == 1 ? {1,2} : {3,4};
错误是: { 之前的预期表达式和: 之前的预期表达式:
这不是有效的 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};
来自查尔斯·贝利 (Charles Bailey) 的回答:来自条件表达式的语法
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 );