C 运算符
1. 基本概念
C 语言通过提供大量的运算符来支持我们对数据进行处理。运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 语言内置了丰富的运算符,并提供了以下类型的运算符:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 杂项运算符
2. 算术运算符
运算符 | 名称 | 例子 | 结果 |
---|---|---|---|
+ | 加法运算符(双目) | 5 + 3 | 8 |
- | 减法运算符(双目) | 5 - 3 | 2 |
* | 乘法运算符(双目) | 5 * 3 | 15 |
/ | 除法运算符(双目) | 5 / 3 | 1 |
5.0/3.0 | 1.667 | ||
% | 求余运算符(双目) | 5 % 3 | 2 |
5.0 % 3.0 | 出错 | ||
+ | 正号运算符(单目) | +5 | 5 |
- | 负号运算符(单目) | -5 | -5 |
++ | 自增运算符(单目) | 5++ | 6 |
-- | 自减运算符(单目) | 5-- | 4 |
- 整数间的除法会直接舍去小数部分,输出整数。
- 浮点数间的除法则能得到一个相近结果的值(除不尽或者限定了位数)。
- 百分号(%)则是求余数,且必须是整数才可以求余。
- a++表示先赋值后运算,++a表示先运算再赋值,--同理。
3. 关系运算符
假设变量A = 10, B = 20。则:
运算符 | 描述 | 实例 |
---|---|---|
== | 检查两个操作数的值是否相等,如果相等则条件为真。 | (A == B) 为假。 |
!= | 检查两个操作数的值是否相等,如果不相等则条件为真。 | (A != B) 为真。 |
> | 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 | (A > B) 为假。 |
< | 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 | (A < B) 为真。 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 | (A >= B) 为假。 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 | (A <= B) 为真。 |
4. 逻辑运算符
假设变量A = 1, B = 0。则:
运算符 | 描述 | 实例 |
---|---|---|
&& | 逻辑与运算符。如果两个操作数都非零,则条件为真。 | (A && B) 为假。 |
|| | 逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 | (A || B) 为真。 |
! | 逻辑非运算符。用来逆转操作数的逻辑状态。 | !(A && B) 为真。 |
5. 位运算符
位运算符作用于位,并逐位执行操作。&、| 和 ^ 的真值表如下所示:
p | q | p & q | p | q | p ^ q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
假设A = 60 ( 0011 1100 ) ,B = 13 ( 0000 1101 )。 则:
运算符 | 描述 | 实例 |
---|---|---|
& | 按位与操作,按二进制位进行"与"运算。 运算规则: 0&0=0; 0&1=0; 1&0=0; 1&1=1; | (A & B) 将得到 12,即为 0000 1100 |
| | 按位或运算符,按二进制位进行"或"运算。 运算规则:`0 | 0=0; 0 |
^ | 异或运算符,按二进制位进行"异或"运算。 运算规则: 0^0=0; 0^1=1; 1^0=1; 1^1=0; | (A ^ B) 将得到 49,即为 0011 0001 |
~ | 取反运算符,按二进制位进行"取反"运算。 运算规则: ~1=-2; ~0=-1; | (~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。 |
<< | 二进制左移运算符。将一个运算对象的各二进制位全部左移若干位 (左边的二进制位丢弃,右边补0)。 | A << 2 将得到 240,即为 1111 0000 |
>> | 二进制右移运算符。将一个数的各二进制位全部右移若干位, (正数左补0,负数左补1,右边丢弃)。 | A >> 2 将得到 15,即为 0000 1111 |
6. 赋值运算符
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符,把右边操作数的值赋给左边操作数 | C = A + B 将把 A + B 的值赋给 C |
+= | 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 | C += A 相当于 C = C + A |
-= | 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 | C -= A 相当于 C = C - A |
*= | 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 | C *= A 相当于 C = C * A |
/= | 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 | C /= A 相当于 C = C / A |
%= | 求模且赋值运算符,求两个操作数的模赋值给左边操作数 | C %= A 相当于 C = C % A |
<<= | 左移且赋值运算符 | C <<= 2 等同于 C = C << 2 |
>>= | 右移且赋值运算符 | C >>= 2 等同于 C = C >> 2 |
&= | 按位与且赋值运算符 | C &= 2 等同于 C = C & 2 |
^= | 按位异或且赋值运算符 | C ^= 2 等同于 C = C ^ 2 |
|= | 按位或且赋值运算符 | C |= 2 等同于 C = C | 2 |
7. 杂项运算符
运算符 | 描述 | 实例 |
---|---|---|
sizeof() | 返回变量的大小 | sizeof(a)将返回4,其中a是整数 |
& | 返回变量的地址 | &a;将给出变量的地址 |
* | 指向一个变量 | *a;将指向一个变量。 |
? : | 条件表达式 | 如果条件为真 ?则值为 X:否则为 Y |
8. C 语言中运算符的优先级
类别 | 运算符 | 结合性 |
---|---|---|
后缀 | () [] -> . ++ - - | 从左到右 |
一元 | + - ! ~ ++ - - (type)* & sizeof | 从右到左 |
乘除 | * / % | 从左到右 |
加减 | + - | 从左到右 |
移位 | << >> | 从左到右 |
关系 | < <= > >= | 从左到右 |
相等 | == != | 从左到右 |
位与 AND | & | 从左到右 |
位异或 XOR | ^ | 从左到右 |
位或 OR | | | 从左到右 |
逻辑与 AND | && | 从左到右 |
逻辑或 OR | || | 从左到右 |
条件 | ?: | 从右到左 |
赋值 | = += -= *= /= %=>>= <<= &= ^= |= | 从右到左 |
逗号 | , | 从左到右 |
实际代码:
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a = 20;
int b = 10;
int c = 15;
int d = 5;
int e;
e = (a + b) * c / d; // ( 30 * 15 ) / 5
printf("(a + b) * c / d 的值是 %d\n", e );
e = ((a + b) * c) / d; // (30 * 15 ) / 5
printf("((a + b) * c) / d 的值是 %d\n" , e );
e = (a + b) * (c / d); // (30) * (15/5)
printf("(a + b) * (c / d) 的值是 %d\n", e );
e = a + (b * c) / d; // 20 + (150/5)
printf("a + (b * c) / d 的值是 %d\n" , e );
return 0;
}