为何C语言中该if表达式几乎恒为1?三位数去重程序异常排查
为什么你的C语言判断表达式几乎总是返回1?
你写的if((i%10) != (i/10%10) != (i/100))犯了C语言语法逻辑的错误——C不支持连续的不等运算符直接判断三者互不相同,这个表达式会被编译器按从左到右的顺序拆解成两步计算:
- 先计算左侧的
i%10 != i/10%10,这个比较的结果是一个布尔值:如果两个数字不等,结果为1(真);相等则为0(假)。 - 再用第一步得到的
1或0,和右侧的i/100做不等比较,也就是判断(第一步的结果) != i/100。
拿你提到的数字100举例:
- 个位是
100%10=0,十位是100/10%10=0,所以第一步0 != 0的结果是0。 - 接着计算
0 != 100/100(也就是0 !=1),这个判断为真,结果为1,所以if条件成立,错误地打印了100。
再看数字111:
- 个位和十位都是1,第一步
1 !=1得0,然后0 !=1(百位是1)得1,条件成立,所以被打印。
而像正确的数字102:
- 个位2,十位0,第一步
2 !=0得1,然后1 !=1(百位是1)得0,条件不成立,所以不会被打印,这就是为什么你看不到预期的正确结果。
要实现“三位数字互不相同”的判断,需要明确写出两两不等的逻辑,用逻辑与&&连接:
if((i%10 != i/10%10) && (i%10 != i/100) && (i/10%10 != i/100))
内容的提问来源于stack exchange,提问作者noname delete
相关产品推荐
相关产品推荐

