x = y = 3;
y = x++, x++;
printf("x = %d, y = %d\n", x, y);
答案:
1 x = 5, y = 3
我不理解这是什么意思。
x++, x++
x++
的意思是将 x
的值赋给 y
,然后将 x
的值加 1,但为什么有逗号?这是因为在一条语句中同时执行两个操作。它只会将 x
的值加到 y
中一次,然后将 x
的值加 1。
我尝试在编译器中运行它,遇到了一些困难。
y = x++, x++;
它包含赋值运算符、逗号运算符和后缀增量运算符。其中,后缀增量运算符的优先级最高,其次是赋值运算符,然后是逗号运算符。因此,表达式解析为:
(y = (x++)), (x++);
逗号运算符首先对其左操作数进行任何副作用的评估,并丢弃该操作数的值。在它评估右操作数之前,这里有一个序列点,这意味着评估左边和所有副作用都保证在右边发生。
因此,让我们首先看逗号运算符的左操作数:
y = (x++)
子表达式x++
的计算结果为x
的当前值,并作为副作用递增x
。此时x
的值为3,因此y
被赋值为3,而x
递增为4。
现在看右边:
x++
由于x
当前的值为4,它被增加以包含值5。
因此,在最后,x
为5,y
为3。
有一篇维基百科页面介绍了C和C++中的逗号运算符:https://en.wikipedia.org/wiki/Comma_operator
它基本上从左到右评估两个表达式,并返回第二个表达式的值。
在这里,您可以看到c ++中运算符的优先级: https://en.cppreference.com/w/cpp/language/operator_precedence
逗号运算符的优先级最低。
在您的示例中。
第一行将x
和y
都设置为3。
第二行将x
增加两次:x ++,x ++
。
但是,由于赋值运算符的优先级高于逗号运算符,因此y
获取第一个递增返回的值。
该语句被评估为(y = x ++),x ++
。
首先执行第一个x ++
,x
获得值4
并返回3
。
这个值被分配给y
:y = x ++
。
然后,最后一个x ++
被评估,x
获得值5
。
l, r
是逗号运算符,它评估l
并丢弃结果,然后评估r
并返回其结果。增量运算符是x++
评估的一部分,这意味着x
增加了两次。 - Some programmer dude