C语言中`x != 0 || x != 1`逻辑表达式判断异常问题咨询
问题
我在C语言中练习实现逻辑非门时遇到了问题。为确保输入仅为0或1,我用表达式if (number != 0 || number != 1)判断int类型变量number,预期输入非0/1时返回-1,输入0/1时返回取反值。但实际输入0或1时,该表达式都判定为真,测试代码里输入0或1会输出"Not 0 nor 1",但单独用if (number != 0)时判断是对的。我是不是误解了或语句的用法?这个语句能这么用吗?
测试代码:
int main (void) { int test = 0; printf("enter number\n"); scanf("%d", &test); if (test != 0 || test != 1) { printf("Not 0 nor 1\n"); } else { printf("0 or 1\n"); } return 0; }
分析与解决
你确实搞错了逻辑运算符的用法:
- 逻辑或
||的规则是只要任意一个条件为真,整个表达式就为真。 - 输入0时,
test !=0是假,但test !=1是真,假 || 真结果为真; - 输入1时,
test !=0是真,test !=1是假,真 || 假结果还是真; - 不管输入什么数,
test !=0和test !=1里总有一个是真的——毕竟一个数不可能同时是0和1,所以这个||表达式永远为真,永远会执行printf("Not 0 nor 1\n");。
要实现“输入既不是0也不是1”的判断,应该用逻辑与&&,它的规则是只有所有条件都为真,整个表达式才为真:
if (test != 0 && test != 1)
这样:
- 输入0时,
test !=0是假,整个表达式为假,进入else分支; - 输入1时,
test !=1是假,整个表达式为假,进入else分支; - 输入其他数时,两个条件都为真,进入if分支,符合预期。
修正后的完整代码:
int main (void) { int test = 0; printf("enter number\n"); scanf("%d", &test); if (test != 0 && test != 1) { printf("Not 0 nor 1\n"); } else { printf("0 or 1\n"); } return 0; }
内容的提问来源于stack exchange,提问作者Octavio
相关产品推荐
相关产品推荐

