我正在关注 C++ 入门第 5 版的书,因为有人提到它是一本适合初学者学习 C++ 的好书。当我继续解决第 4 章中的练习时,我遇到了第 4.10 节中的问题 4.33。我在书中写的问题下面张贴:
使用表 4.12(第 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。据我所知,逗号运算符计算并丢弃其左手值并返回其左 watch 达式的值作为结果,预增量运算符也会增加操作数的值并返回增加的值。因此,该代码不应该输出 10,即++x 将 x 增加到 2,然后丢弃该值,然后++y 将 y 增加到 10,然后返回其值。此外,当我使用括号时,同一语句上的输出更改为 10 并按照我期望的方式运行,即执行以下操作:std::cout << (true ? (++x, ++y) : (--x, --y)) << std::endl;
输出 10. 同样在解决方案中,行为写为:--> 等效于:(some_Value ? ++x, ++y :--x), --y
如果为真,则返回 y;否则,返回--y。但据我所知,它应该是:--> - 相当于:
(some_Value ? ++x, ++y :--x, --y)
如果为真,则返回++y;否则,返回--y。即,支架的放置让我感到困扰。我知道这是一个微小的差异,但我不想弄错这个概念。
我在这里错过了什么吗?
最佳答案
这个表达:
(true ? ++x, ++y : --x, --y)
关于 ?:
的错误条款的内容具有误导性是。将括号放在正确的位置给出:( (true ? (++x, ++y) : --x), --y)
// true ^^^^^^^^^^
// false ^^^
现在,由于 ?
的条件是真的,x
和 y
按此顺序分别增加到 2 和 10。后 ?:
被评估,y
递减到 9,这是整个表达式的结果。
关于c++ - 逗号运算符返回未更改的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64196362/