我试图运行以下代码并遇到了一些结果。有人可以解释一下:
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);
我试图运行以下代码并遇到了一些结果。有人可以解释一下:
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);
number = {12,13,14}
是标量初始化,但是您提供的元素多于应有的元素,编译器会抛出警告,我假设您已忽略该警告,并且第一个元素 12 被分配给 variable 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
根据为早期代码输出给出的参数打印。
int number = {12,13,14};
number
是一个int
,它不期望这样的初始化程序,因此是非法的 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
也是一个表达式语句,它什么也不做,因为它没有副作用。
第一个表达式:
int number = {12,13,14};
如果我们查看草案 C99 标准部分初始化第2段,则为未定义行为:6.7.8
任何初始化程序都不应尝试为未包含在正在初始化的实体中的对象提供值。
在这种情况下,初始化程序是两个元素。第二种情况依赖于第2节所说的逗号运算符(强调我的):6.5.17
逗号运算符的左操作数被评估为 void 表达式;在其评估之后有一个序列点。然后对右操作数求值;结果有它的类型和值.97
第二种情况:
int number = (12,13,14);
相当于:
int number = ((12,13),14);
遵循will be的结果和 will be 的结果中6.5.17
列出的规则。在最后一种情况下:(12,13)
13
13,14
14
number = 12,13;
因为=
绑定更紧密(具有更高的优先级)比将分配给,
的值,然后将被评估而没有副作用。12
number
13