我试图运行以下代码并遇到了一些结果。有人可以解释一下:
int number = {12,13,14};
printf("%d",number);
以上代码将输出打印为12
。如果我尝试运行以下代码:
int number = (12,13,14);
printf("%d",number);
这会将输出打印为14
,但使用以下代码将输出打印为12
:
int number;
number = 12,13;
printf("%d",number);
答案 0 :(得分:4)
number = {12,13,14}
是标量初始化,但是你提供的元素多于你应该提供的元素,编译器会抛出一个警告,我假设你已经忽略了,第一个元素12被分配给变量number
。
使用number = (12,13,14)
时,
逗号(,
)运算符计算第一个操作数并丢弃结果,然后计算第二个操作数并返回结果。
所以这里丢弃12,将13评估为13并返回。现在返回的13值是下一个逗号运算符的第一个操作数。
现在,它将评估13到13并将丢弃此结果13并将评估第二个操作数,即14,并将结果返回为14,分配给变量number
。
执行以下操作时
number = 12,13;
printf("%d",number);
这将打印12,因为=
的优先级大于,
,因此将评估第一个number = 12
并且=
返回指定的值,即12。
现在,逗号运算符得到两个操作数,即=
运算的值,即12和13。
使用逗号运算符12将被评估为12并被丢弃。评估并返回13。
回到?没有人。未分配给number
,因为已执行分配。
因此number = 12,13;
看起来像(number=12),13;
试试这个。
int num1,num2;
num2 = (num1 = 13,14);
printf("%d %d",num1,num2);
这将根据早期代码输出的参数打印13 14
。
答案 1 :(得分:1)
int number = {12,13,14};
number
是一个int
,它不会指望像这样的initalizer,所以非法的C语法。
int number = (12,13,14);
逗号运算符返回右操作数作为结果,它等同于int number = ((12,13),14)
,因此number
的值为14
。
int number = 12,13;
这是初始化,而不是分配。所以不应该在这里使用逗号运算符,非法的C语法。
编辑后,此代码
int number;
number = 12,13;
是一个表达式语句,它是一个逗号运算符,第一个操作数是一个赋值number = 12
,它将number
赋予12
作为副作用,第二个操作数13
是一个表达式声明,它没有任何作用,因为它没有副作用。
答案 2 :(得分:0)
第一个表达:
int number = {12,13,14};
如果我们查看undefined behavior部分6.7.8
初始化段 2 ,则
初始化程序不应尝试为未包含在实体中的对象提供值 被初始化。
在这种情况下,intitializer是两个元素。第二种情况依赖于逗号运算符哪个部分6.5.17
段 2 表示(强调我的):
逗号运算符的左操作数被计算为void表达式;有一个 评估后的序列点。然后评估右操作数;结果有类型和值 .97
第二种情况:
int number = (12,13,14);
相当于:
int number = ((12,13),14);
遵循6.5.17
中规定的规则(12,13)
的结果为13
,13,14
的结果为14
。在最后的案例中:
number = 12,13;
由于=
比,
更紧密地绑定(具有更高的优先级),因此值12
将被分配给number
,然后{{1将被评估,没有副作用。