C语言逻辑表达式求值求助:详解w1与w2的计算过程
代码中w1和w2的计算过程详解
已知前提
- 变量初始值:
i = -1,j = -i = 1 - C语言逻辑运算规则:
- 逻辑与
&&:仅当两边表达式均为非0值时结果为1,否则为0;存在短路特性——左边为假时,右侧表达式不会执行 - 逻辑或
||:只要任意一边表达式为非0值结果为1,否则为0;存在短路特性——左边为真时,右侧表达式不会执行 - 运算优先级:
&&高于||,赋值运算符=优先级低于所有逻辑运算符
- 逻辑与
w1的计算过程
w1的表达式:(i > 0) && (j < 0) || (i < 0) && (j > 0)
按运算优先级逐步拆解:
- 先计算所有比较表达式的结果:
i > 0:-1 > 0 → 0j < 0:1 < 0 → 0i < 0:-1 < 0 → 1j > 0:1 > 0 → 1
- 优先计算
&&部分:(i > 0) && (j < 0)→ 0 && 0 → 0(i < 0) && (j > 0)→ 1 && 1 → 1
- 最后计算
||部分:- 0 || 1 → 1
最终w1 = 1
- 0 || 1 → 1
w2的计算过程
w2的表达式:(i <= 0) || (j = 0) && (i >= 0) || (j <= 0)
重点注意逻辑或的短路特性:
- 先执行第一个
||的左侧表达式:i <= 0→ -1 <= 0 → 结果为1 - 由于逻辑或
||的短路特性,左侧为真时,右侧所有表达式不会被执行:(j = 0) && (i >= 0)全程不运行,j的初始值1保持不变- 后续的
(j <= 0)也不会执行
- 整个表达式的结果由左侧的1直接决定,最终w2 = 1
最终输出结果
w1 == w2 → 1 == 1 → 结果为1,因此printf会输出1
内容的提问来源于stack exchange,提问作者Ady Alex
相关产品推荐
相关产品推荐

