当前位置: 首页 > 知识库问答 >
问题:

为什么带逗号的三元运算符在真情况下只求一个表达式?

胡昊
2023-03-14

我目前正在用《C++入门》一书学习C++,书中的练习之一是:

解释以下表达式的作用:somevalue?++X,++Y:--X,--Y

我们知道些什么?我们知道三元运算符比逗号运算符有更高的优先级。对于二进制运算符,这是很容易理解的,但是对于三元运算符,我就有点费劲了。对于二进制运算符,“具有更高优先级”意味着我们可以在具有更高优先级的表达式周围使用括号,并且它不会改变执行。

对于三元运算符,我会做:

(someValue ? ++x, ++y : --x, --y)
#include <iostream>

int main()
{
    bool someValue = true;
    int x = 10, y = 10;

    someValue ? ++x, ++y : --x, --y;

    std::cout << x << " " << y << std::endl;
    return 0;
}
11 10

另一方面,使用somevalue=false则打印:

9 9

为什么C++编译器生成的代码对于三元运算符的true分支只增加x,而对于三元运算符的false分支则同时减少xy

我甚至在真分支周围加上了圆括号,就像这样:

someValue ? (++x, ++y) : --x, --y;

但仍会导致11 10

共有1个答案

谭学名
2023-03-14

正如@rakete在他们出色的回答中所说,这是有猫腻的。我想再补充一点。

三元运算符必须具有以下格式:

逻辑或表达式表达式:赋值表达式

    null
someValue?++x,++y:--x

考虑将++x,++y计算为带圆括号的(++x,++y)可能有助于可读性;包含在:之间的任何内容都将在条件之后排序。(我将在文章的其余部分把它们加上括号)。

并按以下顺序计算:

  1. SOMEVALUE?
  2. (++x,++y)--x(取决于bool结果为1。)
(someValue?(++x,++y):--x), --y;

那么,当somevaluetrue时会发生什么呢?

  1. (somevalue?(++x,++y):--x)执行并递增xy1111
  2. 丢弃左侧表达式(尽管增量的副作用仍然存在)
  3. 我们计算逗号运算符的右边:--y,然后将y递减回10

要“修复”该行为,可以用括号将--x,--y分组,将其转换为一个主表达式,该主表达式是赋值表达式的有效条目*:

someValue?++x,++y:(--x, --y);

*它是一个相当有趣的长链,将赋值表达式连接回主表达式:

赋值表达式---(可以由)-->条件表达式-->逻辑或表达式-->逻辑与表达式-->包含或表达式-->异或表达式-->与表达式-->等式表达式-->关系表达式-->移位表达式-->加法表达式-->乘法表达式-->PM表达式-->强制转换表达式-->一元表达式-->后缀表达式-->主表达式组成

 类似资料:
  • 根据ISO/IEC 14882:2011,我们不能在三元运算符的第二个和第三个操作数中都使用throw表达式: 5.16条件运算符[expr.cond] 2 如果第二个或第三个操作数的类型为 void,则对第二个和第三个操作数执行左值到右值 (4.1)、数组到指针 (4.2) 和函数到指针 (4.3) 的标准转换,并且以下之一应成立: — 第二个或第三个操作数(但不是两个)是抛出表达式 (15.1

  • 问题内容: 我看了这个关于表达式(以下简称“逗号操作”的问题)和MDN文档有关,但我想不出一个场景的地方是有用的。 那么,逗号运算符什么时候有用? 问题答案: 以下内容可能不是很有用,因为您不是自己编写的,但是压缩程序可以使用逗号运算符来缩小代码。例如: 会成为: 现在可以使用该运算符,因为逗号运算符(在一定程度上)允许将两个语句写为一个语句。 这 是 有用的,因为它允许一些整齐压缩(39 -这里

  • C++ 运算符 使用逗号运算符的为了把几个表达式串在一起。整个逗号表达式的值是以逗号分隔的列表中的最后一个表达式的值。从本质上讲,逗号的作用是导致一系列运算被顺序执行。 最右边的那个表达式的值将作为整个逗号表达式的值,其他表达式的值会被丢弃。例如: var = (count=19, incr=10, count+1); 在这里,首先把 count 赋值为 19,把 incr 赋值为 10,然后

  • 在准备Oracle Certified Associated Java SE 8 Programmer 1考试时,我在官方学习指南中遇到了以下关于三元表达式的段落: 我偶然发现的是段落的开头(用黄色标记),上面写着“as of Java7,...”。我用Java1.6测试了相同的代码,但我找不到行为上的区别。我希望Java1.6只根据段落中给出的信息计算这两个表达式。有没有人知道他们想用“从Jav

  • 本文向大家介绍Python条件表达式(或“三元运算符”),包括了Python条件表达式(或“三元运算符”)的使用技巧和注意事项,需要的朋友参考一下 示例 三元运算符用于内联条件表达式。最好在易于阅读的简单,简洁的操作中使用。 参数的顺序与许多其他语言(例如C,Ruby,Java等)不同,当不熟悉Python的“令人惊讶”行为的人使用它时,它们可能会导致错误(它们可能会颠倒顺序)。 有些人认为它“笨

  • 表达式与运算符 表达式 表达式为 JavaScript 的短语可执行并生成值。 1.7 // 字面量 "1.7" var a = 1; var b = '2'; var c = (1.7 + a) * '3' - b 运算符 算数运算符 (+ - * / %) 关系运算符 (> < == != >= <= === !==) 逻辑运算符 (! && ||) 位运算符 (& | ^ ~ <