云计算百科
云计算领域专业知识百科平台

操作符详解

操作符详解

在这里插入图片描述

本文一次性梳理C语言所有核心操作符,包含算术、关系、逻辑、位运算、移位、赋值、三目、逗号八大类,搭配可直接运行的实战代码、易错点解析高频场景,彻底解决操作符疑难问题。

一、操作符整体分类

C语言操作符按功能分为8大类,其中位运算、移位、逻辑短路是重难点、高频考点:

  • 算术操作符:+、-、*、/、%
  • 关系操作符:>、<、>=、<=、==、!=
  • 逻辑操作符:&&、||、!
  • 位操作符:&、|、^、~(核心重难点)
  • 移位操作符:<<、>>(符号位特殊规则)
  • 赋值操作符:=、+=、-=、*=、/=、&=、|=、^=、<<=、>>=
  • 三目操作符:?:(唯一三目运算符)
  • 逗号操作符:,(优先级最低)
  • 二、算术操作符

    1. 基础规则

    常规加减乘除无特殊难点,核心坑点集中在 / 整数除法 和% 取模运算:

    • 整数除法:两个整数相除,结果强制截断小数,只保留整数部分
    • 取模运算%:仅支持整数,余数符号和被除数一致
    • % 不能用于浮点数,编译直接报错

    2. 实战案例

    #include <stdio.h>
    int main()
    {
    // 整数除法截断
    int a = 5 / 2;
    float b = 5.0 / 2;

    // 取模运算正负规则
    int c1 = 5 % 2;
    int c2 = 5 % 2;
    int c3 = 5 % 2;

    printf("5/2 = %d\\n", a); // 输出2(截断小数)
    printf("5.0/2 = %.1f\\n", b); // 输出2.5(浮点数运算)
    printf("5%%2=%d、-5%%2=%d、5%%-2=%d\\n", c1, c2, c3);

    return 0;
    }

    3. 运行结果&解析

    5/2=2、5.0/2=2.5、5%2=1、-5%2=-1、5%-2=1
    核心结论:只要运算存在浮点数,结果就是浮点数;纯整数除法强制去小数。

    三、关系操作符(判断真假)

    1. 规则说明

    关系运算结果只有两个:真(1)、假(0),常用于分支、循环判断。
    高频错误:连续判断写法错误,例如 10 < x < 20 不生效!

    2. 错误vs正确案例

    #include <stdio.h>
    int main()
    {
    int x = 5;
    // 错误写法!等价于 (10<x) <20,结果恒为1
    int wrong = 10 < x < 20;

    // 正确写法:逻辑与连接两个判断
    int right = (x > 10) && (x < 20);

    printf("错误写法结果:%d\\n", wrong); // 输出1
    printf("正确写法结果:%d\\n", right); // 输出0
    return 0;
    }

    四、逻辑操作符(短路特性)

    1. 核心规则(短路求值)

    • A && B:全真才真,A为假,直接短路,B不执行
    • A || B:一真则真,A为真,直接短路,B不执行
    • !A:取反,真变假、假变真

    2. 短路实战案例

    #include <stdio.h>
    // 自增函数,用于观测是否执行
    void test(int *p)
    {
    (*p)++;
    }

    int main()
    {
    int num = 0;
    // 左边为假,右边短路不执行
    if(0 && test(&num)){}
    printf("&&短路后num = %d\\n", num); // num不变,仍为0

    num = 0;
    // 左边为真,右边短路不执行
    if(1 || test(&num)){}
    printf("||短路后num = %d\\n", num); // num不变,仍为0

    return 0;
    }

    关键结论:逻辑短路会直接跳过后续代码,是很多隐式bug的根源。

    五、位操作符(重难点)

    位操作符是直接操作二进制补码,所有位(包含符号位)全部参与运算,无特殊优待!和手工原码转反码完全不同。

    1. 四大位运算规则

    • & 按位与:双双为1才为1,常用于清零、取位
    • | 按位或:有1则为1,常用于置1
    • ^ 按位异或:相同为0,不同为1,可无临时变量交换数
    • ~ 按位取反:所有位全部翻转(含符号位),不是原码转反码

    2. 核心答疑

    Q:按位取反是否作用符号位?
    A:C语言 ~ 运算符全覆盖,符号位、数值位全部翻转;仅课本「原码转反码」是人工规则,符号位不动,和代码运算无关。
    Q:全1反码加1会不会多一位?
    A:固定字长运算,溢出进位直接丢弃,补码位数永远不变。

    3. 实战案例1:位运算基础演示

    #include <stdio.h>
    int main()
    {
    // 8位补码:0000 0101
    int a = 5;
    // 8位补码:0000 0011
    int b = 3;

    printf("5 & 3 = %d\\n", a & b); // 00000001 = 1
    printf("5 | 3 = %d\\n", a | b); // 00000111 = 7
    printf("5 ^ 3 = %d\\n", a ^ b); // 00000110 = 6
    printf("~5 = %d\\n", ~a); // 11111010(补码) = -6

    return 0;
    }

    4. 实战案例2:无临时变量交换两数

    利用异或三大性质:aa=0、a0=a、交换律

    #include <stdio.h>
    int main()
    {
    int a = 10, b = 20;
    printf("交换前:a=%d, b=%d\\n", a, b);

    a = a ^ b;
    b = a ^ b;
    a = a ^ b;

    printf("交换后:a=%d, b=%d\\n", a, b);
    return 0;
    }

    5. 实战案例3:位清零/置位/判位

    #include <stdio.h>
    int main()
    {
    int flag = 0x0F; // 0000 1111

    flag |= (1 << 4); // 第4位置1:0001 1111
    flag &= ~(1 << 2); // 第2位清零:0001 1011

    // 判断第3位是否为1
    if(flag & (1 << 3))
    {
    printf("第3位为1\\n");
    }

    printf("flag = %d\\n", flag);
    return 0;
    }

    六、移位操作符(易错点)

    1. 规则区分(重中之重)

    • 左移 <<:所有位左移,高位丢弃,低位补0,x<<n 等价于 x*2^n(无溢出)

    • 右移 >>:

      • 无符号数:逻辑右移,高位补0
      • 有符号数:算术右移,高位补符号位(负数补1,正数补0)

    2. 实战案例:正负数字移位差异

    #include <stdio.h>
    int main()
    {
    // 正数右移:补0
    int pos = 8;
    printf("8 >> 1 = %d\\n", pos >> 1); // 4

    // 负数右移:补符号位1
    int neg = 8;
    printf("-8 >> 1 = %d\\n", neg >> 1); // -4

    // 左移统一补0
    printf("3 << 2 = %d\\n", 3 << 2); // 12
    return 0;
    }

    避坑:有符号负数左移属于未定义行为,工程中禁止使用!

    七、赋值、三目、逗号操作符

    1. 复合赋值操作符

    +=、-=、&=、^=、<<= 等,运算效率更高,代码更简洁,推荐优先使用。
    示例:a = a + 5 等价于 a += 5

    2. 三目操作符(唯一三目运算符)

    语法:条件 ? 表达式1 : 表达式2
    规则:条件为真执行1,为假执行2,可嵌套。

    #include <stdio.h>
    int main()
    {
    int score = 85;
    // 简单等级判断
    char grade = score>=90 ? 'A' :
    score>=80 ? 'B' : 'C';
    printf("成绩等级:%c\\n", grade); // B
    return 0;
    }
    ### 3. 逗号操作符(优先级最低)
    语法:表达式1, 表达式2, 表达式3
    规则:从左到右依次执行,最终结果为最后一个表达式的值
    #include <stdio.h>
    int main()
    {
    int a = (1+2, 3+4, 5);
    printf("a = %d\\n", a); // 输出5,取最后一个表达式结果
    return 0;
    }

    八、操作符优先级

    不用死记硬背,记住核心层级即可:

  • 最高:移位、单目运算(~ ! ++ –)
  • 其次:算术运算 > 关系运算 > 位运算 > 逻辑运算
  • 其次:三目运算 > 赋值运算
  • 最低:逗号操作符
    万能避坑:不确定优先级,就加括号,可读性拉满,无副作用。
  • 九、全文核心避坑总结

  • 位运算~:全覆盖所有位(含符号位),和手工原码转反码不是一回事
  • 移位>>:有符号补符号位,无符号补0,负数左移不规范
  • 逻辑短路:&&假短路、||真短路,后续代码不执行
  • 整数除法:默认截断小数,必须浮点数运算才保留小数
  • 位运算进位:固定字长运算,溢出进位直接丢弃,位数不变
  • 赞(0)
    未经允许不得转载:网硕互联帮助中心 » 操作符详解
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!