作业优先

时间:2017-06-26 14:00:45

标签: c operators

在c中,

main()   {
 int a = (1,2,3,4);
  printf("%d",a); 
}

产生

的输出
  

4

这是因为逗号(,)运算符具有从右到左的优先级。 但

main()   {
int a = {1,2,3,4};
 printf("%d",a);
}

产生输出

  

1

任何人都会解释这背后的逻辑。 感谢

3 个答案:

答案 0 :(得分:5)

{1,2,3,4}初始化程序的语法,用于初始化具有多个值的内容,如数组或结构。所以其中的逗号不是运算符,它们只是初始化语法的一部分。

初始化时,C使用左侧的初始值设定项中的值。初始化单个标量变量时,只需要一个元素。

您的编译器应该告诉您此代码没有意义:

x.c:2:12: warning: excess elements in scalar initializer
 int a = {1,2,3,4};
            ^

我应该补充一点,这段代码违反了标准的约束,参见C11草案N1570,§6.7.9 - 2:

  

初始化程序不应尝试为未初始化的实体中包含的对象提供值。

这需要编译器在编译这样的破坏代码时发出诊断信息。

同一段是以下规则(编号17):

  

每个大括号括起的初始化列表都有一个关联的当前对象。什么时候没有   如果存在名称,则按照顺序初始化当前对象的子对象   到当前对象的类型:数组元素增加下标顺序,结构   声明顺序的成员,以及union.1的第一个命名成员。

因此,您的编译器决定对标准执行“ next nearest ”,并使用您提供的第一个值。

答案 1 :(得分:2)

这是一个初始值设定项(通常用于数组),但你并没有明智地使用它,你的编译器没有告诉你吗? / p>

Georgioss-MacBook-Pro:~ gsamaras$ gcc -Wall main.c 
main.c:2:13: warning: excess elements in scalar initializer
 int a = {1,2,3,4};
            ^

此处的优先顺序是从左到右,由于您只有一个要初始化的元素,因此从初始化程序中选择一个元素(在本例中为1)。

答案 2 :(得分:1)

花括号表示变量的初始化,主要用于数组

在您的情况下,使用gcc编译产生:

test.c:6:12: warning: excess elements in scalar initializer
 int a = {1,2,3,4};
            ^

(3& 4相同)

意味着只有值1对您的案例有用(它是一个标量)