我目前正在用《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分支则同时减少x
和y
?
我甚至在真分支周围加上了圆括号,就像这样:
someValue ? (++x, ++y) : --x, --y;
但仍会导致11 10
。
正如@rakete在他们出色的回答中所说,这是有猫腻的。我想再补充一点。
三元运算符必须具有以下格式:
逻辑或表达式?
表达式:
赋值表达式
someValue?++x,++y:--x
考虑将++x,++y
计算为带圆括号的(++x,++y)
可能有助于可读性;包含在?
和:
之间的任何内容都将在条件之后排序。(我将在文章的其余部分把它们加上括号)。
并按以下顺序计算:
SOMEVALUE?
(++x,++y)
或--x
(取决于bool
结果为1。)(someValue?(++x,++y):--x), --y;
那么,当somevalue
为true
时会发生什么呢?
(somevalue?(++x,++y):--x)
执行并递增x
和y
为11
和11
--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 运算符 算数运算符 (+ - * / %) 关系运算符 (> < == != >= <= === !==) 逻辑运算符 (! && ||) 位运算符 (& | ^ ~ <