C语言中的逗号和赋值运算符

5

我有以下内容:

int a = 1, b = 2, c = 3, d = 4;
a = b, c = d;
printf("%d, %d, %d, %d", a, b, c, d);

输出结果如下:
2, 2, 4, 4

逗号操作符在赋值运算符中是如何工作的?从我所知,如果我们有以下情况,它将评估并返回第二个表达式:

(exp1, exp2)

那么,为什么会对 a = b 进行评估呢?
6个回答

5
第一个操作数被评估并且结果被丢弃。然后评估第二个操作数,并将其作为表达式的总体结果返回。
标准说明:
逗号操作符的左操作数被评估为void表达式;在其评估和右操作数的评估之间存在序列点。然后评估右操作数;结果具有其类型和值。

此外,赋值运算符具有副作用:它将右侧的值转换为左侧的类型,并将其存储在左侧引用的对象中。因此,即使分配产生的值不被其他方式使用,评估分配也会导致分配的发生。 - Eric Postpischil

4
逗号运算符的优先级低于赋值运算符。逗号运算符中的所有表达式都会被计算,但只有最后一个表达式的值被用作结果。因此,两个赋值语句都会执行。在您的情况下,逗号运算符的结果将是 c = d 的结果。但是这个结果没有被使用。

你能展示一下结果如何使用吗?我尝试了类似这样的代码:x = a = b, c = d; 那么 x 应该是 4,对吗? - user963241
1
int e = (a=b, c=d); - Fred Larson
1
在您的情况下,x 的值为 2,因为赋值仍高于逗号运算符。您需要使用括号,就像我的示例一样。 - Fred Larson

1

它的工作方式与您将它们编写为单个语句的方式相同:

int a = 1;
int b = 2;
int c = 3;
int d = 4;

a = b;
c = d;

更多细节请参见逗号运算符

来自维基百科:

int a=1, b=2, c=3, i;   // comma acts as separator in this line, not as an operator
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
i = (a += 2, a + b);    // increases a by 2, then stores a+b = 3+2 into i                               ... a=3, b=2, c=3, i=5
i = a += 2, a + b;      // increases a by 2, then stores a into i. Equivalent to  (i = a += 2), a + b;  ... a=3, b=2, c=3, i=3
i = a, b, c;            // stores a into i                                                              ... a=5, b=2, c=3, i=5
i = (a, b, c);          // stores c into i  

1
逗号运算符会评估它的两个操作数(首先是左边的操作数),并返回右边操作数的值。这不仅限于操作数是赋值语句。

0

根据我的了解,它会评估并返回第二个表达式

这不是完全正确的陈述。是的,第二个表达式被评估并返回,但你暗示第一个被忽略了。

逗号运算符的工作方式是所有表达式都被评估,并返回最后一个。例如:

int a, b, c, d = 0;
if(a = 1, b = 2, c = 3, d == 1)
    printf("No it isn't!\n")
else
    printf("a: %d, b: %d, c: %d, d: %d\n", a, b, c, d);

提供给你:

a = 1, b = 2, c = 3, d = 0

因为所有表达式都被求值了,但只有d == 1被返回来作为条件的决策。
……这个操作符更好的应用场景可能在一个for循环中。
for(int i = 0; i < x; counter--, i++) // we can keep track of two different counters
                                      // this way going in different directions.

0

这段代码等同于这个:

int a = 1;
int b = 2;
int c = 3;
int d = 4;
a = b;
c = d;

逗号左侧的第一个表达式被计算,然后是它右侧的表达式。最右侧表达式的结果被存储在等号左侧的变量中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接