Skip to main content

C 运算符

1. 基本概念

C 语言通过提供大量的运算符来支持我们对数据进行处理。运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 语言内置了丰富的运算符,并提供了以下类型的运算符:

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 位运算符
  • 赋值运算符
  • 杂项运算符

2. 算术运算符

运算符名称例子结果
+加法运算符(双目)5 + 38
-减法运算符(双目)5 - 32
*乘法运算符(双目)5 * 315
/除法运算符(双目)5 / 31
5.0/3.01.667
%求余运算符(双目)5 % 32
5.0 % 3.0出错
+正号运算符(单目)+55
-负号运算符(单目)-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. 位运算符

位运算符作用于位,并逐位执行操作。&、| 和 ^ 的真值表如下所示:

pqp & qp | qp ^ q
00000
01011
11110
10011

假设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;
}