C++如何将if语句内的自减操作改写为等价的外部逻辑
问题分析
原代码利用C++逻辑与的短路求值特性,执行逻辑如下:
- 第一步判断
A是否为真:如果为假,直接结束判断,C的值不会发生任何改变,也不会进入if代码块 - 第二步如果
A为真,判断!B是否为真:如果为假(即B为真),直接结束判断,C的值不会发生任何改变,也不会进入if代码块 - 第三步如果前两个条件都满足,无论第三个条件的判断结果是否为真,都会先执行后置自减
C--(返回C自减前的原始值,再把C减1),再判断返回的原始值是否为0(即!(原始值)的结果),如果为真就进入if代码块,否则不进入。
原修改方案的错误点
你写的修改版本只有当!(C)判断为真(即C当前值为0)的时候才会执行C--,和原逻辑的核心差异是:原逻辑只要前两个条件成立,不管C的值是什么,C都会被自减,而你的修改版本只有C为0且前两个条件成立时才会自减C。
举个测试用例验证:假设A=true,B=false,C=1
- 原代码执行:前两个条件成立,执行
C--返回1,C变为0,!(1)为false,不进入if块,最终C=0 - 你的修改版执行:
!(C)即!(1)为false,不进入if块,C不会被自减,最终C=1,和原代码结果不一致。
正确的等价实现
可以把前两个条件先做判断,在前两个条件成立的场景下执行C--并记录第三个条件的结果,再判断是否进入if块:
bool should_enter = false; if (A && !B) { // 这里和原逻辑一致:只要前两个条件成立就执行C--,同时拿到自减前的值做判断 should_enter = !(C--); } if (should_enter) { // 原有if块内的逻辑 }
如果不想额外引入变量,也可以写成如下形式,执行逻辑完全等价:
if (A && !B) { int old_C = C; C--; if (!old_C) { // 原有if块内的逻辑 } }
内容的提问来源于stack exchange,提问作者vvillp0wer5
相关产品推荐
相关产品推荐

