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

时间:2013-04-08 11:09:06

标签: c ternary-operator

我无法访问C11规范,因此我无法调查此错误。

以下声明在编译期间出现错误:

int why[2] =  1 == 1 ? {1,2} : {3,4}; 

错误是:在{和:之前的预期表达式:

之前的预期表达式

3 个答案:

答案 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 StatementExpression 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 );