运算符优先级顺序和计算混淆
operator precedence order and evaluation confusion
在书中,这里给定递增和递减运算符的优先级大于三元运算符,但为什么在下面的代码中,b和c的值不递增,但只有b递增(或c递增是条件为假(
int a=1,h;
h = (a==1)?++b:++c;
printf("%d%d",b,c);
甚至对于诸如
++i&&++j||++k; // why not all the increment and decrement operator executes first
请解释我是否犯了一些概念错误,并为太菜鸟而抱歉(如果这是重复的,请将我重定向到原始问题,我没有找到(
(?:
(、逻辑合取(&&
(和逻辑析取(||
(运算符是懒惰的†。他们只评估产生结果所需的操作数。
对于条件运算符,它只计算两个分支中的一个;如果条件的计算结果为 true,则计算第一个分支,如果条件的计算结果为 false,则计算第二个分支。
如果左侧表达式的计算结果为 false,则逻辑合取运算符将不会计算右侧表达式,因为无论如何结果都将为 false。逻辑析取运算符以类似的方式操作,不同之处在于,如果左侧计算为 true,它将不会计算右侧:无论x
如何,true || x
始终为真。
† 除非您正在处理超载&&
或||
。重载运算符无法对操作数执行延迟计算。
有关h = (a==1)?++b:++c;
请参阅 C11 6.5.15 条件运算符 p4(我的强调
计算第一个操作数;在其 评估和第二或第三操作数的评估 (以评估者为准(。仅当 首先比较不等于 0;仅当以下情况下计算第三个操作数 第一个比较等于 0;
这证实了您关于仅执行++b
和++c
之一的观察是正确的。
有关++i&&++j||++k;
请参阅C11第6.5.13,6.5.14节。 逻辑 OR 和 AND 运算符都从左到右计算,一旦结果已知,就跳过进一步表达式的计算(因此,一旦表达式的计算结果为 ||
的非零;一旦表达式的计算
&&
的零(。三元运算符仅计算条件操作数和恰好为真的操作数。根本不会评估您案例中的++c
部分。
在第二种情况下,并非所有操作数都被计算,因为||
和&&
运算符执行所谓的"短路",也就是说,如果整个表达式不再有机会更改其结果,则不会计算其余操作数。
优先级不控制计算顺序。 它仅控制运算符和操作数如何组合在一起。
||
运算符和&&
运算符都强制从左到右求值,并且都是"短路"运算符;如果表达式的值可以从左侧表达式确定,则根本不会计算右侧表达式。
所以给出一个表达式,比如
a++ || b++ && c++
如果a++
的结果不为零,则无论b++ && c++
的结果如何,结果都将为真,因此根本不计算右侧。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 按对象的特定方法按升序排列的C++优先级队列
- 使用2个键的cpp-stl::优先级队列排序不正确
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- 在开发计算机上设置 dll 的完整性优先级是否会在安装生成中保留
- 使用优先级队列计算中值
- C/C++编译器对运算符优先级/计算的严格程度
- 运算符优先级顺序和计算混淆
- C语言中等优先级操作数的计算顺序
- C++,计算具有多个"&&"且没有较低优先级运算符的表达式
- 运算符优先级和计算顺序