逗号运算符返回不变值

时间:2020-10-04 15:15:39

标签: c++

我正在关注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。

即,支架的位置让我感到困扰。我知道这是微小的差异,但我不想弄错这个概念。 我在这里想念东西吗?

2 个答案:

答案 0 :(得分:5)

此表达式:

(true ? ++x, ++y : --x, --y)
关于?:的虚假条款,

具有误导性。将括号放在正确的位置可以得到:

( (true ? (++x, ++y) : --x), --y)
  // true ^^^^^^^^^^  
  //            false  ^^^                           

现在,由于?的条件为true,因此xy分别以此顺序递增到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 括在括号中,因为编译器已处理三元数?并计算 :之前的整个表达式,“一次掉下来”。

因此,在递增xy之后,代码会递减 y-将输出作为“原始”值。

相关问题