在 C 编程语言中,将4,3
分配给整数类型变量,例如:
int a;
a = 4,3;
变量接收逗号左侧的值(即 a
在示例中设置为 4(。 但是,在分配括号列表时,例如
a = (4,3);
,变量采用逗号分隔列表中的最后一个值(示例中3
(。
这是什么原因呢?
C 以两种不同的方式使用逗号 (,
(:作为复合构造(如数组文字或声明列表(中的元素分隔符,以及作为二元运算符。 它没有像某些高级语言那样基于列表的赋值。
作为运算符,逗号首先计算其左侧操作数,然后计算其右侧操作数。 整体表达式的值是第二个结果。 这在某种程度上是对 &&
和 ||
运算符的补充,两者都首先计算其左操作数,但每个操作数仅根据左侧结果有条件地计算其右操作数。
理解你的观察的另一个关键是等号(=
(也是一个运算符。 它以未指定的顺序计算两个操作数,其结果与右侧操作数相同。 修改左侧操作数的值是一种副作用。
非常低,但逗号运算符的优先级最低。 因此,如果您不使用括号来更改评估顺序,则...
a = 4,3;
。相当于...
(a = 4), 3;
. 它首先评估赋值,生成值4
,副作用是将该值分配给变量 a
。 然后它丢弃该值并评估3
,产生值3
作为整体结果。 由于整个事情不是任何更大表达式的一部分,因此结果被丢弃。
另一方面,您可以通过适当使用括号来覆盖优先级,如下所示:
a = (4, 3);
. 在这种情况下,首先计算逗号运算符,产生3
作为其结果,这是赋值运算符的右侧操作数。 赋值表达式产生结果3
,副作用是将该值分配给变量a
。
。这将是正确的操作。
i = (a, b); // stores b into i
// ... a=1, b=2, c=3, i=2
i = a, b; // stores a into i. Equivalent to (i = a), b;
// ... a=1, b=2, c=3, i=1
检查逗号运算符的属性。"在 C 和C++编程语言中,逗号运算符(由标记表示(是一个二进制运算符,它计算其第一个操作数并丢弃结果,然后计算第二个操作数并返回此值(和类型(。
在C/C++
中,逗号(,( 运算符从左到右计算,左表达式的值被丢弃。结果的类型和值是右操作数的类型和值。在开始评估右操作数之前,先完成左操作数评估的所有副作用。摘自KR书A.7.18
此外,逗号运算符的优先级和计算顺序最少。
由于=
运算符的优先级高于运算符,
。在以下声明中
int a;
a = 4,3;
分配首先发生,导致a = 4
。
而且众所周知,()
覆盖了precedence
,因此我们在以下情况下a = 3
int a = (4,3);
现在我们都明白了,
和=
的理论,让我们集中精力什么时候用,
。逗号运算符应谨慎使用,最合适的用途是用于彼此密切相关的构造。例如在for loop
for (i = 0, j = strlen(s)-1; i < j; i++, j--)
只要有可能,我将()
与,
结合使用