逗号和C中的括号和花括号之间有什么关系?

Yas*_*med 3 c comma curly-braces parentheses

我有以下两行,找不到很好的解释

我确实读过逗号作为运算符和分隔符的双重性质,以及括号的优先级优先级和逗号作为序列点。

int a =(3,4) // here a is 4 because comma here is an operator first a=3 , then a = 4 
int a={3,4} // here is the problem , should not a=3 and then a =4 too because comma is a sequence point or it's undefined behavior or what ?
Run Code Online (Sandbox Code Playgroud)

我期望

a=4
a=4 , 
but the actual output is 
a=4 , a=3
Run Code Online (Sandbox Code Playgroud)

dbu*_*ush 5

在第一种情况下:

int a =(3,4);
Run Code Online (Sandbox Code Playgroud)

该变量使用包含逗号运算符和括号的表达式初始化。当您正确推测这是分配给时,此表达式的计算结果为4 a

在第二种情况下:

int a={3,4};
Run Code Online (Sandbox Code Playgroud)

用大括号表示的初始化器列表初始化变量,并用逗号分隔初始化器。如果有问题的变量是结构或数组,则初始化器列表中的值将分配给每个成员。如果初始化程序多于成员,则多余的值将被丢弃。

因此a,在初始值设定项列表中分配了第一个值,即3,并丢弃了值4。

你做了这个吗?

int a[2] = {3, 4};
Run Code Online (Sandbox Code Playgroud)

那么a[0]将是3,a[1]将是4。

  • Nitpick:标准说:“标量的初始值设定项应为**单个表达式**,可以选择用大括号括起来”,其中“表达式”必须根据形式语法解释为“赋值表达式”,不能在最外层包含一个逗号运算符。因此,OP的用大括号括起来的初始化程序的行为是* undefined *。假定括号内多余的初始化程序将被简单地丢弃是不安全的。实际上,某些实现可能会代替第一个使用它,当然,也可能会观察到任何形式的荒唐行为。 (3认同)