逗号在c中的运算符
#include<stdio.h> int main(void) { int a=(1, 2), 3; printf("%d", a); return 0; }
输出:2
任何人都可以解释输出是2吗?
任何人都可以解释输出是2吗?
在声明中
a = (1, 2), 3;
,
使用的是逗号运算符 。 由于=
运算符的运算符优先级高于运算符的运算符优先级,因此expression式操作数(1, 2)
将绑定到=
as
(a = (1, 2)), 3;
在逗号运算符的情况下,逗号运算符的左操作数被评估为voidexpression式,然后评估右操作数并且结果具有右操作数的值和types 。
这里有两个逗号运算符。 对于expression式(1, 2)
的第一个逗号运算符, 1
将被评估为voidexpression式,然后2
将被评估并被分配给a
。
现在已经发生副作用,因此将评估第二个逗号运算符3
的右操作数,并且expression式(a = (1, 2)), 3
将是3
。
任何人都可以解释输出是2吗?
因为赋值运算符 ( =
)的优先级高于逗号运算符 ( ,
)。
因此,声明:
a = (1, 2), 3;
相当于:
(a = (1, 2)), 3;
并且expression式(1, 2)
评估为2
。
的结果:
a = x, y => x a = (i, j) => j
因此,如果我们有:
x = (1 , 2) a = (1 , 2) , 3 => 2
如这里所说:
逗号运算符以类似于分号终止语句的方式分离expression式(具有值),expression式序列与括号中的语句序列类似:(a,b,c)是序列以逗号分隔的expression式,其计算结果为最后一个expression式c; {a; b; c;}是一个语句序列,并不计算任何值。 逗号只能出现在两个expression式之间 – 逗号分隔expression式 – 不像在分号(在非块)语句结尾处出现的分号 – 分号终止语句。
逗号运算符具有任何C运算符的最低优先级,并充当序列点。 在逗号和分号的组合中,分号的优先级比逗号低,因为分号分隔语句,但在语句中出现逗号,这符合它们作为普通标点符号的用法:a,b; c,d被分组为(a,b); (c,d),因为这是两个单独的陈述。
我希望这回答了你的问题。