我正在关注C ++入门手册第5版,因为它被认为是学习C ++的入门书籍。在我继续解决第4章中的练习时,我在第4.10节中遇到了问题4.33。我在书中所写问题的下方张贴内容:
使用表4.12(p。166)解释以下表达式的作用:
someValue ? ++x, ++y : --x, --y
这个问题令我有些困惑,所以我决定在网上查看它,并找到了一个git存储库,其中包含与我在下面键入的内容类似的解决方案:
#include<iostream>
int main()
{
int x = 1, y = 9;
std::cout << (true ? ++x, ++y : --x, --y) << std::endl;
std::cout << x << "\t" << y << std::endl;
std::cout << (false ? ++x, ++y : --x, --y) << std::endl;
std::cout << x << "\t" << y << std::endl;
return 0;
}
我的查询是在运行上面的代码时,为什么编译器在其第一个cout语句(即以下语句)上显示9:
std::cout << (true ? ++x, ++y : --x, --y) << std::endl;
输出为9。据我所知,逗号运算符会评估并舍弃其左手值,并返回其左手表达式的值作为其结果,preprecrement运算符也会递增操作数的值并返回递增后的值。因此,该代码输出不应为10,即++ x将x递增为2,然后丢弃该值,然后++ y将y递增为10,然后返回其值。另外,当我使用方括号时,同一条语句上的输出将更改为10并按我期望的方式运行,即执行以下操作:
std::cout << (true ? (++x, ++y) : (--x, --y)) << std::endl;
输出10。同样在解决方案中,行为写为:->等效于:(some_Value ? ++x, ++y :--x), --y
如果为true,则返回y;否则为false。否则,返回--y。
但是据我了解,它应该是:->-等效于:(some_Value ? ++x, ++y :--x, --y)
如果为true,则返回++ y;否则,返回--y。
即,支架的位置让我感到困扰。我知道这是微小的差异,但我不想弄错这个概念。 我在这里想念东西吗?
答案 0 :(得分:5)
此表达式:
(true ? ++x, ++y : --x, --y)
关于?:
的虚假条款,具有误导性。将括号放在正确的位置可以得到:
( (true ? (++x, ++y) : --x), --y)
// true ^^^^^^^^^^
// false ^^^
现在,由于?
的条件为true,因此x
和y
分别以此顺序递增到2和10。对?:
求值后,y
递减为9,这是整个表达式的结果。
答案 1 :(得分:3)
尽管您的假设是正确的,即可以保证用逗号运算符分隔的表达式的求值顺序是(从左到右),但是此处未考虑 的是<优先级。
逗号运算符占所有lowest priority。因此,以下内容:
std::cout << (true ? ++x, ++y : --x, --y) << std::endl;
等价于此(添加括号以显示编译器如何看待事物):
std::cout << ( (true ? (++x, ++y) : --x), --y ) << std::endl;
请注意,使用逗号运算符的 first 括在括号中,因为编译器已已处理三元数?
并计算 :
之前的整个表达式,“一次掉下来”。
因此,在递增x
和y
之后,代码会递减 y
-将输出作为“原始”值。