操作符详解

本文一次性梳理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;
}
八、操作符优先级
不用死记硬背,记住核心层级即可:
万能避坑:不确定优先级,就加括号,可读性拉满,无副作用。
网硕互联帮助中心






评论前必须登录!
注册