&&和||的问题问题&&和||的问题问题

img


解释一下ab选项,b中不是先算()里面的再算!运算符?||左为真后面不运行得a<=10,取反得a>10?不是这样吗
解释一下ab选项,b中不是先算()里面的再算!运算符?||左为真后面不运行得a<=10,取反得a>10?不是这样吗

  • 首先 A 肯定不对, c语言语法上不支持 10 < a < 15 这样的比较;
  • B 中 !(a <= 10 || a >= 15) , 假设 a <= 10 为真 , 那取反 就是 a > 10 ; 那还有 a >= 15 为真呢,它取反 就是 a < 15; 两个组合起来就是 a > 10 && a < 15 , 符合数学关系 10 < a < 15

下面是我的理解,供参考:

A选项,10<a<15 , 根据小于号<的结合律,表达式从左往右计算,对于左边的表达式10<a, 如果a的值大于10,则为真,值即为1,反之,如果a的值小于等于10,则为假,值即0,再将左边表达式的值0或1与15比较大小,显而易见是为真的,值即为1,所以A选项的值,无论a为多少,这个表达式最后的值一定是为1的,所以A选项是错误的。

B选项,!(a<=10||a>=15) ,即(a<=10||a>=15)==0, 要逻辑或运算为假,那就是必须里面两个表达式都为假,即a<=10必须为假,即a>10, 然后a>=15为假,即a<15,两个同时成立,即a>10且a<15,所以这个是正确的。

测试代码如下:


#include <stdio.h>

int main(void){
    
    int a;
    
    for(a=11;a<=15;a++){
        
        printf("a=%d\n",a);
        printf("A、10<a<15 = %d\n",10<a<15);
        printf("B、!(a<=10||a>=15) = %d\n",!(a<=10||a>=15));
        printf("C、a>10&&a<15 = %d\n",a>10&&a<15);
        printf("D、!(a<=10)&&!(a>=15) = %d\n\n",!(a<=10)&&!(a>=15));
        
    }
    
    return 0;
} 

img