不修改if语句条件,如何为变量i赋值以执行else分支?
怎么让else分支跑起来?
兄弟,先搞懂你代码里那个if判断的坑——C语言里1 < i < 10根本不是你以为的“i在1到10之间”!编译器会把它拆成两步算:
- 先计算
1 < i,得到一个int类型的结果:条件成立返回1,不成立返回0 - 再把这个结果和10比较,也就是执行
(1 < i) < 10
你当前的代码里i = -1,1 < -1不成立(结果为0),然后0 < 10是真,所以进入if分支输出1。
但尴尬的是:按照C标准,关系运算的结果只能是0或1,这两个值都小于10,所以不管你给i赋什么合法的int值,这个if判断永远为真,else分支根本没机会执行。
那有没有办法绕开这个限制?严格来说,在标准C的范围内是做不到的——这个表达式的结果天生恒真。要是你愿意碰未定义行为(非常不推荐,代码会失去可移植性且行为不可预测),可以尝试给i赋一个陷阱表示(某些硬件平台上int类型的特殊无效值),这可能导致比较运算返回非0非1的结果,从而让(1 < i) < 10为假,但这种操作完全依赖编译器和硬件,根本不靠谱。
总结一下:如果严格遵循C标准,仅通过修改i的值无法触发else分支;如果接受未定义行为,可能有不可靠的实现方式,但这不是正经的解决方案。(其实正确的做法是把if条件改成i > 1 && i < 10,但你说不能改条件,那标准下真没辙)
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

