c++ - 逗号运算符返回未更改的值

标签 c++

我正在关注 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  ^^^                           
现在,由于 ? 的条件是真的,xy按此顺序分别增加到 2 和 10。后 ?:被评估,y递减到 9,这是整个表达式的结果。

关于c++ - 逗号运算符返回未更改的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64196362/

相关文章:

c++ - 方法,调用所有基类的同名方法(如果存在)并将返回值保存到列表中

c++ - this 在 c++ 中的用法

c++ - 在 MATLAB MEX 库中使用 boost,与 MATLAB 的版本不同

c++ - 使用 Boost Graph Library 按拓扑顺序打印顶点名称

c++ - 如何在 Visual Studio (C++) 中设置发布分析

c++ - 为什么带有多个 copy_n() 的 std::istream_iterator<> 总是写入第一个值

C++ try catch 抛出

c# - 将剪贴板内容存储到字节数组?

c++ - 在 C++ 流中包装 C 风格的文件

c++ - 对于按值传递的重成员,构造函数的初始化列表中真的需要 std::move 吗?