运算符优先级顺序和计算混淆

operator precedence order and evaluation confusion

本文关键字:计算 优先级 顺序 运算符      更新时间:2023-10-16

在书中,这里给定递增和递减运算符的优先级大于三元运算符,但为什么在下面的代码中,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++的结果如何,结果都将为真,因此根本不计算右侧。