在C编程语言中,将4,3
分配给整数类型变量,如:
int a;
a = 4,3;
变量接收逗号左边的值(即a
在示例中设置为4)。但是,在分配带括号的列表时,例如
a = (4,3);
,变量采用逗号分隔列表中的最后一个值(示例中为3
)。
这是什么原因?
答案 0 :(得分:3)
C以两种不同的方式使用逗号(,
):作为复合构造中的元素分隔符,例如数组文字或声明列表,以及作为二元运算符。它没有基于列表的分配,例如某些高级语言。
作为运算符,逗号首先计算其左侧操作数,然后计算其右侧操作数。整个表达式的值是第二个结果。这在某种程度上是对&&
和||
运算符的补充,这两个运算符首先评估它们的左侧操作数,但每个运算符仅有条件地评估其右侧操作数,具体取决于左侧 - 手的结果。
理解观察结果的另一个关键是等号(=
)也是运算符。它以未指定的顺序计算两个操作数,其结果与右侧操作数相同。修改左侧操作数的值是副作用。
赋值运算符的优先级非常低,但逗号运算符的优先级最低。因此,如果您不使用括号来改变评估顺序,那么......
a = 4,3;
......等同于......
(a = 4), 3;
。它首先评估赋值,产生值4
,副作用是将该值赋给变量a
。然后它丢弃该值并评估3
,得到值3
作为整体结果。由于整个事物不是任何更大表达式的一部分,因此结果被丢弃。
另一方面,您可以通过合理使用括号来覆盖优先级,如下所示:
a = (4, 3);
。在这种情况下,首先计算逗号运算符,得到3
作为结果,这是赋值运算符的右侧操作数。赋值表达式产生结果3
,副作用是将该值赋给变量a
。
答案 1 :(得分:1)
是的。那将是正确的操作。
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 ++编程语言中,逗号运算符(由标记表示)是一个二元运算符,它计算第一个操作数并丢弃结果,然后计算第二个操作数并返回该值(和类型)。” - 维基百科
答案 2 :(得分:0)
在C/C++
中,逗号(,)运算符从左到右进行求值,并且左表达式的值将被丢弃。结果的类型和值是右操作数的类型和值。在开始评估右操作数之前,左操作数评估的所有副作用都已完成。取自KR书A.7.18
此外,逗号运算符具有最低优先级和评估顺序。
由于=
运算符的优先级高于,
运算符。在以下声明中
int a;
a = 4,3;
分配首先导致a = 4
。
并且众所周知,()
会覆盖precedence
,因此如果<{p>},我们会a = 3
int a = (4,3);
现在,我们都理解,
和=
的理论,让我们集中讨论何时使用,
。 应谨慎使用逗号运算符,最适合用于彼此强烈相关的构造。,例如for loop
for (i = 0, j = strlen(s)-1; i < j; i++, j--)
只要有可能,我会将()
与,