11

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

以下声明在编译期间引发错误:

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

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

4

3 回答 3

11

这不是有效的 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};
于 2013-04-08T11:15:24.817 回答
2

来自查尔斯·贝利 (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
于 2013-04-08T11:20:37.087 回答
0

初始化器列表不是表达式,因此不能在表达式中使用。

我建议您保持数组未初始化并使用 memcpy。

int why[2];
memcpy( why, 1 == 1 ? (int[2]){1,2} : (int[2]){3,4}, sizeof why );
于 2015-01-18T07:46:38.293 回答