我有以下内容:
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
进行评估呢?我有以下内容:
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
进行评估呢?c = d
的结果。但是这个结果没有被使用。x = a = b, c = d;
那么 x
应该是 4
,对吗? - user963241int e = (a=b, c=d);
- Fred Larsonx
的值为 2,因为赋值仍高于逗号运算符。您需要使用括号,就像我的示例一样。 - Fred Larson它的工作方式与您将它们编写为单个语句的方式相同:
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
根据我的了解,它会评估并返回第二个表达式
这不是完全正确的陈述。是的,第二个表达式被评估并返回,但你暗示第一个被忽略了。
逗号运算符的工作方式是所有表达式都被评估,并返回最后一个。例如:
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.
这段代码等同于这个:
int a = 1;
int b = 2;
int c = 3;
int d = 4;
a = b;
c = d;
逗号左侧的第一个表达式被计算,然后是它右侧的表达式。最右侧表达式的结果被存储在等号左侧的变量中。