C/C++基础(四):运算符

文章目录

一.关系运算符

关系运算符用于比较两个操作数的 大小 / 相等 关系,运算结果为布尔值

C 语言中用 0 表示假,非 0 表示真;
C++ 中新增 bool 类型,直接返回 true/false.

1.关系运算符

C/C++ 提供 6 种关系运算符,按优先级分为两类:

运算符 名称 示例 含义 优先级
> 大于 a > b a 是否大于 b
< 小于 a < b a 是否小于 b
>= 大于等于 a >= b a 是否大于等于 b
<= 小于等于 a <= b a 是否小于等于 b
== 等于 a == b a 是否等于 b
!= 不等于 a != b a 是否不等于 b

注意:

  • 优先级: >/</>=/<= 高于 ==/!=;
  • 赋值运算符 = 和 相等运算符 == 极易混淆,是编程高频错误点;
  • 关系运算符为双目运算符,左右操作数需为可比较类型(如数值型、指针型,结构体需自定义比较逻辑).

2.关系表达式

由关系运算符连接两个表达式构成的式子,称为关系表达式,结果为布尔值(0 / 非 0true/false).

I.基本语法

c 复制代码
表达式 1 关系运算符 表达式 2

II.示例代码

c++ 复制代码
#include <stdio.h>
#include <stdbool.h> // C 语言需引入此头文件使用 bool 类型(C99 及以上)
using namespace std; // C++需引入,或直接使用 std::boolalpha

int main()
{
    int a = 10, b = 5, c = 10;

    // C语言示例
    printf("C语言:\n");
    printf("a > b = %d\n", a > b);   // 1(真)
    printf("a < b = %d\n", a < b);   // 0(假)
    printf("a == c = %d\n", a == c); // 1(真)
    printf("a != b = %d\n", a != b); // 1(真)

    // C++示例
    printf("\nC++:\n");
    bool res = (a >= c);
    cout << boolalpha;                       // 让cout输出true/false而非1/0
    cout << "a >= c = " << res << endl;      // true
    cout << "b <= a = " << (b <= a) << endl; // true

    return 0;
}

III.注意事项

  1. 连续关系表达式的陷阱:

    不要写成 a < b < c 的形式(如 1 < 3 < 2), C/C++ 会按左结合性解析为(1 < 3) < 2,即 1 < 2,结果为真,但逻辑上 3 < 2 是假,正确写法应为 a < b && b < c(结合逻辑运算符).

  2. 浮点数比较:

    浮点数存在精度误差,不能直接用 == 比较,需判断差值是否小于极小值(如 1e-9):

c 复制代码
double x = 0.1 + 0.2, y = 0.3;
if (fabs(x - y) < 1e-9) { // fabs 是浮点绝对值函数
printf("x 等于 y\n");
}
  1. 指针比较:
    同类型指针可比较(如判断指针是否为 NULL、数组元素指针的先后),不同类型指针(无强制转换)比较会报错.

二.逻辑运算符

逻辑运算符用于对布尔值进行逻辑运算(),最终结果仍为布尔值(0 / 非 0true/false).

1.逻辑运算符

C/C++ 提供 3 种逻辑运算符,优先级从高到低为:! > && > ||:

运算符 名称 操作数个数 示例 含义
! 逻辑非 单目 !a a 为真则结果为假,a 为假则结果为真
&& 逻辑与 双目 a && b ab 都为真时结果为真,否则为假
` ` 逻辑或 双目

2.逻辑表达式

由逻辑运算符连接布尔值 / 关系表达式构成的式子,称为逻辑表达式,核心特性是短路求值.

I.核心特性:短路求值

逻辑运算符会按 "最小计算原则" 执行,避免不必要的运算,这是优化性能的关键:

  • 逻辑与(&&): 若左侧表达式为假,直接返回假,不执行右侧表达式;
  • 逻辑或(||): 若左侧表达式为真,直接返回真,不执行右侧表达式.

II.示例代码

c 复制代码
#include <stdio.h>
using namespace std;

int main()
{
    int a = 0, b = 1, c = 2;

    // 1. 逻辑非
    printf("!b = %d\n", !b); // 0(b=1为真,!b为假)
    printf("!a = %d\n", !a); // 1(a=0为假,!a为真)

    // 2. 逻辑与(短路求值)
    if (a > 0 && ++c > 0)
    { // a>0为假,++c不执行
        printf("逻辑与为真\n");
    }
    printf("c = %d\n", c); // c仍为2(未执行++c)

    // 3. 逻辑或(短路求值)
    if (b > 0 || ++c > 0)
    { // b>0为真,++c不执行
        printf("逻辑或为真\n");
    }
    printf("c = %d\n", c); // c仍为2(未执行++c)

    // 4. 组合使用(优先级:! > && > ||)
    bool res = !a && (b > 0 || c < 0);
    cout << boolalpha << "res = " << res << endl; // true

    return 0;
}

III.注意事项

  1. 非布尔值的逻辑运算:

    C/C++ 中,逻辑运算符的操作数可以是任意数值 ------ 0 视为假,非 0 视为真.例如:

    c 复制代码
    int x = 5, y = 0;
    printf("x && y = %d\n", x && y); // 0(5 为真,0 为假,与运算为假)
    printf("x || y = %d\n", x || y); // 1(5 为真,或运算为真)
  2. 短路求值的坑与用:
    :若右侧表达式有副作用(如++--、函数调用),短路会导致副作用不执行,需谨慎:

    c 复制代码
    int i = 0;
    if (false && ++i) {} // i 仍为 0,++i 未执行

    :可简化代码,例如判空 + 取值:

    c 复制代码
    char* str = "hello";
    if (str && *str == 'h') { // 先判 str 非空,再取第一个字符,避免空指针访问
    printf("str 以 h 开头\n");
    }
  3. 逻辑运算符与位运算符的区别:

    不要混淆&&(逻辑与)和&(按位与)、||(逻辑或)和|(按位或):

    • 逻辑运算符操作布尔值,结果为布尔值;
    • 位运算符操作二进制位,结果为数值;
    • 示例:3 && 5 结果为 1(真),3 & 5 结果为 1(二进制 011 & 101 = 001).

总结

  • 关系运算符用于比较,结果为布尔值,注意浮点数比较和连续比较的陷阱;
  • 逻辑运算符用于布尔值运算,核心是短路求值,优先级! > && > ||;
  • C 语言用 0 / 非 0 表示布尔值,C++ 新增 bool 类型(true/false);
  • 避免混淆===&&&|||.
相关推荐
freedom_1024_1 小时前
【c++】使用友元函数重载运算符
开发语言·c++
zmzb01031 小时前
C++课后习题训练记录Day43
开发语言·c++
wadesir2 小时前
C语言模块化设计入门指南(从零开始构建清晰可维护的C程序)
c语言·开发语言·算法
赖small强2 小时前
【Linux C/C++开发】 GCC -g 调试参数深度解析与最佳实践
linux·c语言·c++·gdb·-g
CAE虚拟与现实3 小时前
C/C++中“静态链接(Static Linking)” 和 “动态链接(Dynamic Linking)释疑
开发语言·c++·dll·动态链接库·lib库
fpcc3 小时前
C++编程实践——标准库中容器存储目标分析
c++
包饭厅咸鱼3 小时前
PatchCore-----训练,测试,c++部署 工业异常检测框架
开发语言·c++·视觉检测
许长安3 小时前
C++ 多态详解:从静态多态到动态多态
开发语言·c++·经验分享·笔记
猫猫的小茶馆3 小时前
【ARM】ARM的介绍
c语言·开发语言·arm开发·stm32·单片机·嵌入式硬件·物联网