3、C 语言运算符总结

涉及算术、关系、逻辑、位运算等多种运算符的功能、示例、注意事项,以及运算符的优先级和结合性等方面

C 语言运算符核心知识点总结

一、算术运算符

1. 基本运算符及功能

运算符

功能说明

示例

注意事项

+

加法、一目取正

a + b

-

-

减法、一目取负

a - b

可表示负数(如-a取相反数)

*

乘法

a * b

-

/

除法

a / b

整数除法会截断小数(如5/2=2

%

取模(求余)

a % b

两边操作数必须为整型

++

自增 1(前缀 / 后缀)

++a/a++

前缀先增后用,后缀先用后增

--

自减 1(前缀 / 后缀)

--a/a--

前缀先减后用,后缀先用后减

2. 关键特性与示例

  • 自增 / 自减运算
    • 前缀:++a先将a的值加 1,再使用a的新值(如b = ++a等价于a = a+1; b = a)。
    • 后缀:a++先使用a的当前值,再将a加 1(如b = a++等价于b = a; a = a+1)。
    • 示例代码:

int num1 = 0, num2 = 0;

num2 = num1++;  // num1变为1,num2为0(先用后增)

int num3 = 0, num4 = 0;

num4 = ++num3;  // num3变为1,num4为1(先增后用)

  • 复杂表达式注意事项
    • 避免歧义表达式(如i = (++i) + (++i)),不同编译器可能有不同结果。
    • printf函数计算参数时遵循 “栈特性”(先入后出),如printf("%d, %d", j++, ++j)需注意运算顺序。

二、关系运算符

1. 基本运算符及功能

运算符

功能说明

示例

结果类型

>

判断左边是否大于右边

a > b

布尔值(0 或 1)

>=

判断左边是否大于等于右边

a >= 5

布尔值

<

判断左边是否小于右边

3 < x

布尔值

<=

判断左边是否小于等于右边

x <= y+1

布尔值

==

判断两边是否相等

x+1 == 0

布尔值

!=

判断两边是否不相等

c != '\0'

布尔值

2. 关键特性

  • 关系表达式的结果为布尔值:真(非 0)或假(0)。
  • 注意区分 “等于”(==)与 “赋值”(=):if (a == 5)是判断,if (a = 5)是赋值(恒为真,易出错)。

三、逻辑运算符

1. 基本运算符及功能

运算符

功能说明

示例

运算规则

!

逻辑反(非)

!(x == 0)

真变假,假变真(!1=0!0=1

&&

逻辑与(并且)

x>0 && x<10

两边都为真时结果为真,否则为假

||

逻辑或(或者)

`y<10

2. 特殊规则(短路特性)

  • 逻辑与(&&):若左边表达式为假,右边表达式不执行(如(a=0) && (b=1)b不会被赋值)。
  • 逻辑或(||):若左边表达式为真,右边表达式不执行(如(a=1) || (b=0)b不会被赋值)。

3. 示例代码

int num1 = 100, num2 = 200;

// 逻辑与:左边为真时才执行右边

if ((num1 == 100) && (num2 = 666)) {

    printf("num2 = %d\n", num2);  // 执行,num2变为666

}

// 逻辑或:左边为真时不执行右边

int num3 = 300, num4 = 400;

if ((num3 == 300) || (num4 = 888)) {

    printf("num4 = %d\n", num4);  // 执行,但num4仍为400

}

四、位运算符

1. 基本运算符及功能

运算符

名称

示例

功能说明

~

位逻辑反

~a

a的每一位取反(0 变 1,1 变 0)

&

位逻辑与

a & b

逐位与:同 1 为 1,否则为 0(可清 0 特定位)

|

位逻辑或

a | b

逐位或:同 0 为 0,否则为 1(可置 1 特定位)

^

位逻辑异或

a ^ b

逐位异或:相同为 0,不同为 1(可翻转特定位)

<<

左移

a << 4

每位移到左边,移出位丢弃,空位补 0

>>

右移

x >> 4

每位移到右边,移出位丢弃,空位补 0

2. 实用案例

  • 修改特定位
    • 置 1 第n位:num |= (1 << n)(如num |= (1<<30)将第 30 位置 1)。
    • 清 0 第n位:num &= ~(1 << n)(如num &= ~(1<<15)将第 15 位清 0)。
    • 翻转第n位:num ^= (1 << n)(如num ^= (1<<10)将第 10 位取反)。
  • 判断某一位是否为 1

if (num & (1 << 16)) {  // 若第16位为1,表达式结果非0(真)

    printf("第16位为1\n");

}

  • 移位运算:左移n位等价于乘以2^n(无溢出时),右移n位等价于除以2^n(无符号数)。

五、特殊运算符

1. 赋值运算符(=)

  • 功能:将右边值赋给左边变量(左边必须是可修改的变量,不能是常量或数组)。
  • 连续赋值:从右到左执行(如a = b = c = 100等价于c=100; b=c; a=b)。
  • 注意:数组不能直接赋值(需用strcpy等函数),如char buf[10]; buf = "abc";(错误)。

2. 复合赋值运算符

  • 功能:简化表达式,提高效率(如a += b等价于a = a + b)。
  • 常用运算符+=-=*=/=%=&=|=^=<<=>>=
  • 示例a *= 100*5-200等价于a = a * (100*5-200)(右侧先运算)。

3. 条件运算符(三目运算符)

  • 语法表达式1 ? 表达式2 : 表达式3
  • 功能:若表达式1为真,结果为表达式2;否则为表达式3(简化if-else)。
  • 示例

int max = (a > b) ? a : b;  // 等价于if(a>b) max=a; else max=b;

  • 应用:宏定义中常用(如#define MAX(A,B) (A>B)?A:B)。

4. sizeof 运算符

  • 功能:计算数据类型、变量或常量所占内存的字节数
  • 语法
    • 对类型:sizeof(类型)(必须加括号,如sizeof(int))。
    • 对变量 / 常量:sizeof(变量)sizeof 变量(括号可选,如sizeof a)。
  • 示例

printf("int大小:%lu\n", sizeof(int));       // 4(32位系统)

printf("字符常量大小:%lu\n", sizeof 'a');  // 4(字符常量按整型处理)

printf("字符串大小:%lu\n", sizeof "abc");  // 4(含'\0')

  • strlen的区别sizeof计算包含'\0'的总字节数;strlen是函数,计算字符串实际长度(不含'\0')。

5. return 运算符

  • 功能:退出当前函数,若为main函数则退出程序。
  • 规则:返回值类型必须与函数声明一致(如int Max(int a,int b)需返回int型)。
  • 示例

int Add(int a, int b) {

    return a + b;  // 返回两数之和

}

六、运算符优先级与结合性

1. 优先级规则

  • 不同运算符按优先级执行(如先乘除后加减)。
  • 优先级从高到低(部分关键运算符):
    1. 括号(())、数组([])、后缀++/--
    2. 前缀++/--sizeof!~(单目运算符)
    3. 强制类型转换
    4. 算术乘除(*/%
    5. 算术加减(+-
    6. 移位(<<>>
    7. 关系运算符(><>=<=
    8. 相等判断(==!=
    9. 位与(&
    10. 位异或(^
    11. 位或(|
    12. 逻辑与(&&
    13. 逻辑或(||
    14. 条件运算符(?:
    15. 赋值 / 复合赋值(=+=等)

2. 结合性规则

  • 相同优先级时,按结合性执行:
    • 从左到右:算术运算符、关系运算符、逻辑与 / 或等(如a + b - c等价于(a + b) - c)。
    • 从右到左:赋值运算符、条件运算符等(如a = b = c等价于a = (b = c))。

3. 实用技巧

  • 用括号(())改变优先级,避免歧义(如(a + b) * c而非a + b * c)。
  • 复杂类型解析:先找变量名,再看附近运算符优先级(如int *a[10]是指针数组,int (*a)[10]是数组指针)。

七、经典应用案例

1. 两数交换(无中间变量)

  • 加减法a = a + b; b = a - b; a = a - b;(可能溢出)。
  • 异或a = a ^ b; b = a ^ b; a = a ^ b;(无溢出,仅适用于整数)。

2. 位运算修改寄存器

  • 嵌入式开发中常用位运算配置寄存器(如置位、清位):

unsigned int reg = 0x1234;

reg |= (1 << 5);   // 置位第5位

reg &= ~(1 << 3);  // 清位第3位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

長琹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值