C 使用三元运算符初始化数组?
我无法访问C11规范,因此无法调查此错误 以下声明在编译过程中引发错误:C 使用三元运算符初始化数组?,c,ternary-operator,C,Ternary Operator,我无法访问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[2] = { ... }; //
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[2] = { ... }; // initializer-list {}
对于使用复合文字的信息,您可以使用指针对象获得接近所需的内容:
int *why = (1 == 1) ? (int[2]) {1,2} : (int[2]) {3,4};
查尔斯·贝利的回答如下: 及 这就是编译器给出如下错误的原因:
error: expected expression before ‘{’ token // means after ?
error: expected expression before ‘:’ token // before :
编辑正如@Rudi Rüssel评论的那样:
以下是c语言中的有效代码:
int main(){
{}
;
{1,2;}
}
我们在C中使用{}
组合语句;
注意:如果我写{1,2}
,那么它的错误(*应为“;”before'}”标记*)
,因为1,2
是一个表达式,而不是一个语句
对于OP:what is and what is and
编辑2:注意:@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 );
你试过这个:int为什么[2]=(1==1)?{1,2} : {3,4};是:这没有区别它在数组初始化的语法中不存在。@RudiRüssel是的,那个是有效的,但这里没有
{1,2}
表达式,works
不是数组。@RudiRüssel:表达式是有值的东西<代码>6*7有一个值。初始值设定项列表不是表达式;它们只是一种语法,用于描述初始化at对象时要放入的多个值。源代码{1,2}
不是一个值、一个对象或任何可以操作的东西。它只是对数组中放入内容的描述。因为它不是表达式,所以不能对其进行操作;不能将其用作的操作数:代码>或其他运算符。+非常喜欢你的解决方案,我的意思是int*why=(1==1)?(int[2]){1,2}:(int[2]){3,4}代码>@Eric谢谢你!在C EBNF中,块是一条语句,但不是[条件-]expression@CustomCalc来自错误假设的错误评论。在函数中,复合文字具有自动存储持续时间,其生存期在其出现的块退出时结束。在函数体之外,它具有静态存储持续时间,其生命周期是程序的整个执行过程。据我所知:如果不是表达式,什么是{1,2}
?@RudiRüssel:{1,2}
是一个初始值设定项。2011年C标准第6.7条对此进行了描述。表达式在另一个条款6.5中描述。@Grijesh感谢您的回答,但ouah还添加了一个使用复合文字的变通方法。@RudiRüssel是的,这是一个非常好的解决方案。
int why[2];
memcpy( why, 1 == 1 ? (int[2]){1,2} : (int[2]){3,4}, sizeof why );