C语言关系运算与逻辑运算笔记(条件判断必用)
2026/6/10 15:24:02 网站建设 项目流程

一、关系运算符(比较大小)
就是数学里的比较:大于、小于、等于这些。

注意:

== 是判断相等,一个等号 = 是赋值,初学者经常写错。

cif(x=5)// 这不是判断x等于5,而是把5赋给x,然后条件为真(因为5非0)

编译器一般会警告,自己得小心。

关系运算的结果是整数:真=1,假=0(但逻辑判断时任何非0都算真)。

二、逻辑运算符(组合条件)
用来连接多个条件,或者取反

例子:

cintage=20,score=85;if(age>=18&&score>=60){printf("成年且及格\n");}if(age<18||score<60){printf("未成年或不及格\n");}if(!(score>=60)){printf("不及格\n");// 等价于 score < 60}

三、短路求值(重要!)
&& 和 || 会“偷懒”:

对于 a && b,如果 a 是假,b 就不算了(因为整个必假)。

对于 a || b,如果 a 是真,b 就不算了(因为整个必真)。

利用短路可以写出安全代码:

cif(ptr!=NULL&&ptr->data==10)// 先判空,避免崩陷阱:如果第二个表达式有副作用(比如函数调用、赋值),短路可能导致它不执行,容易出bug。
cinti=0;if(i++&&i++)// i++只执行了一次?因为左边i++是0(假),右边就不执行了// 结果 i = 1

所以别在逻辑表达式里搞复杂的赋值、自增,容易乱。

四、运算符优先级(记个大概就行)
! > 关系运算符 > && > ||

关系运算符里 > >= < <= 高于 == !=

括号 () 最高,不放心就加括号,不丢人。

例子:
if (a > b && c == d || e < f) 实际等价于 ((a > b) && (c == d)) || (e < f)
但没人愿意记,老老实实加括号 if ((a > b) && (c == d) || (e < f)),虽然括号不是都必须,但读起来舒服。

五、常见用法和坑

  1. 判断是否在区间
    错误写法:if (10 <= x <= 20)
    C语言会先算10 <= x得0或1,再拿这个0或1去和20比较,永远为真(因为0或1都<=20)。
    正确写法:if (x >= 10 && x <= 20)

  2. 判断浮点数相等
    浮点数直接 == 可能坑,因为精度问题。一般用差值小于某个阈值:

cif(fabs(a-b)<1e-6)
  1. 逻辑非 ! 的用法
    ! 把非0变0,0变1。常用于检查为0的情况:
cif(!ptr)// 等价于 if (ptr == NULL)if(!flag)// flag==0时进入
  1. 用逻辑运算简化标志位
cintready=1,error=0;if(ready&&!error){// 干活}
  1. 小心 && 和 || 的混合
    不加括号容易误解:
cif(a&&b||c&&d)// 实际是 (a&&b) || (c&&d)

如果意图是 a && (b||c) && d,必须括号。

六、一些小技巧
改用 || 设置默认值:
int x = y || 5; 不常用,因为结果为0或1。更常见:int x = (y != 0) ? y : 5; 或者用 if。

利用短路避免除零:

if(b!=0&&a/b>10)

判断奇数:if (n % 2) 或 if (n & 1)(位运算更直接,但也是真/假)。

判断字符是否是字母:

if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))

七、最后废话
关系运算和逻辑运算的结果是 int 类型的0或1,可以直接赋值给变量:int b = (a > 3);

在while、if、for括号里,任何非0都视为真,0视为假。

宁可多写括号,也不要省那几行,代码是给人看的。

好了,笔记就这些。多写几个if条件,多试几次短路,慢慢就熟了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询