在c中,
main() {
int a = (1,2,3,4);
printf("%d",a);
}
产生
的输出4
这是因为逗号(,)运算符具有从右到左的优先级。 但
main() {
int a = {1,2,3,4};
printf("%d",a);
}
产生输出
任何人都会解释这背后的逻辑。 感谢1
答案 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
对您的案例有用(它是一个标量)