C语言运算符知识大全
C语言中的运算符就像数学中的加减乘除符号,但功能更强大、种类更多样。它们可以对数据进行各种操作和计算,是编程的基础元素。
本指南用通俗易懂的语言详细解释C语言的各类运算符,包括它们的作用、使用方法和注意事项。每个知识点都配有代码示例,帮助你快速理解。
一、算术运算符
算术运算符用于基本的数学运算,如加减乘除。
作用:将两个值相加
示例:
作用:将两个值相减
示例:
作用:将两个值相乘
示例:
作用:将两个值相除得到商
注意:整数相除会丢弃小数部分
示例:
作用:计算两个整数相除的余数
注意:只能用于整数,不能用于浮点数
示例:
• 除法运算符作用于整数时结果是整数,作用于浮点数时结果是浮点数
• 运算符两边类型不同时,会自动进行类型转换
• 小心除数为0的情况,会导致运行时错误
二、关系运算符
关系运算符用于比较两个值的大小关系,结果为真(1)或假(0)。
作用:检查两个值是否相等
注意:不要和赋值运算符(=)混淆
示例:
(5 == 3) // 结果为0(假)
作用:检查两个值是否不相等
示例:
(5 != 5) // 结果为0(假)
作用:检查左边值是否大于右边值
示例:
(5 > 10) // 结果为0
作用:检查左边值是否小于右边值
示例:
(8 < 3) // 结果为0
作用:检查左边值是否大于或等于右边值
示例:
(10 >= 15) // 结果为0
作用:检查左边值是否小于或等于右边值
示例:
(5 <= 3) // 结果为0
• 关系运算的结果是整数类型:1表示真,0表示假
• 比较浮点数时要小心精度问题(如0.1 + 0.2 != 0.3)
• 注意运算符的优先级,必要时使用括号
三、逻辑运算符
逻辑运算符用于组合多个条件,常用于条件判断。
作用:当两个条件都为真时结果才为真(一假则假)
示例:
(5 > 3) && (10 > 20) // 结果0(假)
作用:两个条件中有一个为真结果就为真(一真则真)
示例:
(5 > 10) || (8 > 10) // 结果0(假)
作用:取反操作,把真变假,假变真
示例:
!(5 == 3) // 结果1(真)
• 逻辑运算符有短路特性:&&左边为假时右边不执行,||左边为真时右边不执行
• 不要把逻辑运算符(&、|)和位运算符(&、|)混淆
• 非0值在逻辑运算中都视为真,0值视为假
四、赋值运算符
赋值运算符用于给变量赋值,可以将赋值和运算结合起来。
作用:将右边的值赋给左边变量
示例:
作用:将运算和赋值结合,简化表达式
说明:
a -= b; // 等价于 a = a – b
a *= b; // 等价于 a = a * b
a /= b; // 等价于 a = a / b
a %= b; // 等价于 a = a % b
示例:
a += 5; // a变为15
a *= 2; // a变为30
• 赋值运算符左边必须是一个变量(左值)
• 多个赋值可以连写:a = b = c = 5;(所有变量值为5)
• 复合赋值运算符效率通常比分开写高
五、自增自减运算符
自增自减运算符用于快速增加或减少变量的值。
作用:将变量的值增加1
两种形式:
• 前缀形式:++a(先增加再使用)
• 后缀形式:a++(先使用再增加)
示例:
int b = ++a; // a先变为6,然后b=6
int c = 5;
int d = c++; // d=5,然后c变为6
作用:将变量的值减少1
两种形式:
• 前缀形式:–a(先减少再使用)
• 后缀形式:a–(先使用再减少)
示例:
int b = –a; // a先变为4,然后b=4
int c = 5;
int d = c–; // d=5,然后c变为4
• 注意前缀和后缀的区别,尤其在复杂表达式中
• 避免在同一个表达式中多次修改同一个变量(如 a = a++ + ++a)
• 自增自减只能用于变量,不能用于常量或表达式
六、条件运算符
条件运算符是C语言中唯一的三目运算符,用于简单的条件判断。
语法:条件 ? 表达式1 : 表达式2
作用:如果条件为真,结果为表达式1的值;否则为表达式2的值
示例:
int max = (a > b) ? a : b; // 如果a>b,max=a,否则max=b
// 这里max=20
// 相当于:
if (a > b) {
max = a;
} else {
max = b;
}
• 适用于简单的条件赋值,复杂的逻辑建议使用if-else
• 表达式1和表达式2的类型应该兼容
• 可以嵌套使用,但不要过度嵌套使代码难懂
七、运算符优先级与结合性
当表达式中有多个运算符时,按照优先级和结合性决定运算顺序。
常见运算符优先级表
优先级 | 运算符 | 描述 | 结合性 |
---|---|---|---|
1 | () [] . -> | 括号、数组下标、成员访问 | 从左到右 |
2 | ! ~ ++ — + – * & (类型) | 逻辑非、位取反、自增减、正负号、指针、类型转换 | 从右到左 |
3 | * / % | 乘、除、取模 | 从左到右 |
4 | + – | 加、减 | 从左到右 |
5 | << >> | 位左移、位右移 | 从左到右 |
6 | < <= > >= | 关系运算符 | 从左到右 |
7 | == != | 相等性运算符 | 从左到右 |
8 | & | 位与 | 从左到右 |
9 | ^ | 位异或 | 从左到右 |
10 | | | 位或 | 从左到右 |
11 | && | 逻辑与 | 从左到右 |
12 | || | 逻辑或 | 从左到右 |
13 | ? : | 条件运算符 | 从右到左 |
14 | = += -= *= /= %= etc. | 赋值运算符 | 从右到左 |
15 | , | 逗号运算符 | 从左到右 |
• 优先级高的运算符先执行,同级运算符按结合性顺序执行
• 使用括号可以明确指定运算顺序,使代码更清晰
• 如果不确定优先级,使用括号是最安全的选择
• 自增自减在表达式中使用需特别注意顺序
int a = 5 + 3 * 2; // 先乘后加,结果11
int b = (5 + 3) * 2; // 括号改变顺序,结果16
// 结合性示例:
int c = 15 / 3 * 2; // 除法左结合:(15/3)*2=10
int d = a = b = 10; // 赋值右结合:b=10, a=b, d=a
八、其他运算符
作用:连接多个表达式,整个表达式的值是最右边表达式的值
示例:
for (i = 0, j = 10; i < j; i++, j--) {
// 循环体
}
作用:计算数据类型或变量所占字节数
示例:
double d;
int d_size = sizeof(d); // 通常是8
int arr[10];
int arr_size = sizeof(arr); // 10 * sizeof(int)
作用:获取变量的内存地址
示例:
int *ptr = # // ptr指向num的地址
int *ptr = &value; // ptr是指向整数的指针
int num = *ptr; // 获取ptr指向的值(5)