#include<stdio.h>
int main(void) {
int a;
a = (1, 2), 3;
printf("%d", a);
return 0;
}
输出:2
任何人都可以解释输出如何2?
任何人都可以解释如何输出2?
因为分配操作员的优先级(=
)高于 comma operator ( ,
)。
因此,语句:
a = (1, 2), 3;
等效于:
(a = (1, 2)), 3;
和表达式(1, 2)
评估为2
。
任何人都可以解释如何输出2?
在语句中
a = (1, 2), 3;
,
使用的是逗号操作员。由于=
操作员的运算符比,
运算符更高,因此表达式操作数(1, 2)
将与=
绑定为
(a = (1, 2)), 3;
在逗号运算符的情况下,将逗号运算符的左操作数评估为void表达式,然后评估正确的操作数,结果具有正确的操作数的值和类型。
这里有两个逗号操作员。对于表达式(1, 2)
中的第一个逗号运算符,1
将评估为void表达式,然后将评估2
并将其分配给a
。
现在已经提出了对a
的副作用,因此将评估第二逗号操作员3
的正确操作数,并且表达式(a = (1, 2)), 3
的值将为3
。
:
的结果a = x, y => x
a = (i, j) => j
因此,如果我们有:
x = (1 , 2)
a = (1 , 2) , 3 => 2
如下所述:
逗号操作员以某种方式将表达式(具有价值)分开 类似于半隆如何终止语句,序列 表达式与序列的括号相似 陈述的括号中包含:(a,b,c)是 表达式,由逗号隔开,该逗号评估了最后 表达式c时{a;b;c;}是一系列语句,做 没有评估任何价值。逗号只能在两个之间发生 表达式 - 逗号单独的表达式 - 与分号不同, 发生在(非块)陈述的结尾 - 半殖民地 终止语句。
逗号运营商的优先级最低,并且 充当序列。逗号和分号的结合, 半殖民地的优先级低于逗号,因为分离的分离 声明但逗号发生在语句中,这符合 它们用作普通标点符号:a,b;c,d分为(a,b); (c,d)因为这是两个单独的语句。
我希望这可以回答您的问题。