C 使用三元运算符初始化数组?

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] = { ... }; //

我无法访问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] = { ... };  // 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 );