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呢?

4

6 回答 6

5

评估第一个操作数并丢弃结果。然后计算第二个操作数,并将结果作为表达式的整体结果返回。

标准说:

逗号运算符的左操作数被评估为 void 表达式;在它的求值和右操作数的求值之间有一个序列点。然后对右操作数求值;结果有它的类型和值。

于 2012-12-13T15:38:18.090 回答
4

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

于 2012-12-13T15:38:03.540 回答
1

逗号运算符计算它的两个操作数(首先是左边的)并返回右边的值。这并不特定于作为赋值的操作数。

于 2012-12-13T15:38:23.813 回答
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  
于 2012-12-13T15:38:42.800 回答
0

From what I have known it would evaluate and return the second expression

这不是一个完全正确的说法。是的,第二个被评估并返回,但你暗示第一个被忽略。

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

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.
于 2012-12-13T15:46:27.417 回答
0

这段代码等价于:

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

对逗号左侧的第一个表达式求值,然后是其右侧的表达式。最右边表达式的结果存储在 = 符号左侧的变量中。

于 2014-02-10T10:45:40.577 回答