
涉及算术、关系、逻辑、位运算等多种运算符的功能、示例、注意事项,以及运算符的优先级和结合性等方面
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. 优先级规则
- 不同运算符按优先级执行(如先乘除后加减)。
- 优先级从高到低(部分关键运算符):
- 括号(())、数组([])、后缀++/--
- 前缀++/--、sizeof、!、~(单目运算符)
- 强制类型转换
- 算术乘除(*、/、%)
- 算术加减(+、-)
- 移位(<<、>>)
- 关系运算符(>、<、>=、<=)
- 相等判断(==、!=)
- 位与(&)
- 位异或(^)
- 位或(|)
- 逻辑与(&&)
- 逻辑或(||)
- 条件运算符(?:)
- 赋值 / 复合赋值(=、+=等)
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位 |
5610

被折叠的 条评论
为什么被折叠?



