C语言中的运算符是用于告诉编译器执行特定操作的符号,包括算术运算符、逻辑运算符、位运算等。运算符是编程中不可或缺的一部分,掌握其用法对于编写高效、清晰的代码至关重要。
1.算术运算符
算术运算符用于执行基本的数学运算,包括加、减、乘、除、取模等。常见的算术运算符有:
| 运算符 | 描述 |
|---|---|
| + | 加法运算符,把两个操作数相加 |
| - | 减法运算符,把两个操作数相加 |
| * | 乘法运算符,把两个操作数相乘 |
| / | 除法运算符,用于两个操作数的相除 |
| % | 取模运算符,返回两个操作数相除的余数 |
| ++ | 自增运算符,整数值增加 1 |
| -- | 自减运算符,整数值减少 1 |
示例:
cpp
#include <stdio.h>
int main()
{
int a = 17, b = 4;
int c;
c = a + b;
printf("加法运算符下c的值为:%d\n", c);
c = a - b;
printf("减法运算符下c的值为:%d\n", c);
c = a * b;
printf("乘法运算符下c的值为:%d\n", c);
c = a / b;
printf("除法运算符下c的值为:%d\n", c);
c = a % b;
printf("取余运算符下c的值为:%d\n", c);
c++;
printf("自增运算符下c的值为:%d\n",c);
c--;
printf("自减运算符下c的值为:%d\n",c);
}
结果:
cpp
加法运算符下c的值为:21
减法运算符下c的值为:13
乘法运算符下c的值为:68
除法运算符下c的值为:4
取余运算符下c的值为:1
自增运算符下c的值为:2
自减运算符下c的值为:1
注意:a++与++a的区别
cpp
#include <stdio.h>
int main()
{
int a = 17, b = 4;
int c;
c = a++; //后缀形式,先使用a的值,a再自增
printf("1.c的值为:%d\n",c);
printf("此时a的值为:%d\n", a);
c = ++a; //前缀形式,a先自增,再使用a的值
printf("2.c的值为:%d\n",c);
printf("此时a的值为:%d\n", a);
}
结果:
cpp
1.c的值为:17
此时a的值为:18
2.c的值为:19
此时a的值为:19
2.关系运算符
关系运算符用于比较两个操作数的大小关系,返回一个布尔值(真或假)。常见的关系运算符有:
| 运算符 | 描述 |
|---|---|
| == | 等于,检查两个操作数的值是否相等,如果相等则条件为真 |
| != | 不等于,检查两个操作数的值是否相等,如果不相等则条件为真 |
| > | 大于,检查左操作数的值是否大于右操作数的值,如果是则条件为真 |
| < | 小于,检查左操作数的值是否小于右操作数的值,如果是则条件为真 |
| >= | 大于等于,检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真 |
| <= | 小于等于,检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真 |
示例:
cpp
#include <stdio.h>
#include <stdbool.h>
int main()
{
int a = 17, b = 4;
bool is_equal = (a == b);
bool is_not_equal = (a != b);
bool is_greater = (a > b);
bool is_less = (a < b);
bool is_greater_equal = (a >= b);
bool is_less_equal = (a <= b);
printf("a == b: %d\n", is_equal);
printf("a != b: %d\n", is_not_equal);
printf("a > b: %d\n", is_greater);
printf("a < b: %d\n", is_less);
printf("a >= b: %d\n", is_greater_equal);
printf("a <= b: %d\n", is_less_equal);
}
结果:
cpp
a == b: 0
a != b: 1
a > b: 1
a < b: 0
a >= b: 1
a <= b: 0
3.逻辑运算符
逻辑运算符用于组合多个条件,通常用于控制流程。
| 运算符 | 描述 |
|---|---|
| && | 逻辑与运算符。如果两个都为真时返回为真 |
| || | 逻辑或运算符。至少一个条件为真时返回为真 |
| ! | 逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假 |
示例:
cpp
#include <stdio.h>
#include <stdbool.h>
int main()
{
int age = 25;
bool isAdult = (age >= 18 && age<=60);
bool isTeenager = (age >= 13 && age <18);
bool isSenior = (age > 60);
bool isChild = (age < 13);
bool isNotAdult = !isAdult;
printf("Age: %d\n", age);
printf("Is Adult: %d\n", isAdult);
printf("Is Teenager: %d\n", isTeenager);
printf("Is Senior: %d\n", isSenior);
printf("Is Child: %d\n", isChild);
printf("Is Not Adult: %d\n", isNotAdult);
}
结果:
cpp
Age: 25
Is Adult: 1
Is Teenager: 0
Is Senior: 0
Is Child: 0
Is Not Adult: 0
4.位运算符
位运算符直接对操作数的二进制进行操作,适用于底层编程。
| 运算符 | 描述 |
|---|---|
| & | 按位与,两个操作数的对应位都为1时结果为1 |
| | | 按位或,两个操作数的对应位至少有一个为1时结果为1 |
| ^ | 按位异或,两个操作数的对应位不同时结果为1,相同为0 |
| ~ | 按位取反,反转操作数的所有位 |
| << | 左移,将操作数的所有位向左移动指定位数 |
| <= | 右移,将操作数的所有位向右移动指定位数 |
示例:
cpp
#include <stdio.h>
int main()
{
int a = 5, b = 3; //a=0101,b=0011
int and= a & b; //and=0001(1)
int or = a | b; //or = 0111(7)
int xor = a ^ b; //xor=0110(6)
int not_a = ~a; //not_a=1010(-6) 存在计算机中以补码形式存储,最高位为符号位,1表示负数,0表示正数,所以~5的原码为1,0110,结果是-6
int left_shift = a << 1;//left_shift=1010(10)
int right_shift = a >> 1;//right_shift=0010(2)
printf("and=%d\n,or=%d\n,xor=%d\n,not_a=%d,left_shift=%d\n,right_shift=%d\n", and, or , xor, not_a, left_shift, right_shift);
}
结果:
cpp
and=1
or=7
xor=6
not_a=-6left_shift=10
right_shift=2
5.赋值运算符
赋值运算符用于变量赋值。常见的 赋值运算符有:
| 运算符 | 描述 | 实例 |
|---|---|---|
| = | 简单的赋值运算符,把右边操作数的值赋给左边操作数 | 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 << 1 |
| >>= | 右移且赋值运算符,将左操作数右移指定位数后赋给左操作数 | C >>= 2 等同于 C = C >> 1 |
| &= | 按位与且赋值运算符,将左操作数与右操作数按位与后赋给左操作数 | C &=A 等同于 C = C & A |
| ^= | 按位异或且赋值运算符,将左操作数与右操作数按位异或后赋给左操作数 | C ^= A 等同于 C = C ^A |
| |= | 按位或且赋值运算符,将左操作数与右操作数按位或后赋给左操作数 | C |= A等同于 C = C | A |
示例:
cpp
#include <stdio.h>
int main()
{
int a = 5; //a=0101
int c;
printf("c=a:%d\n", c = a);
printf("c+=2:%d\n",c+=2);
printf("c-=2:%d\n", c -= 2);
printf("c*=2:%d\n", c *= 2);
printf("c/=2:%d\n", c /= 2);
printf("c%%=2:%d\n", c %= 2);
printf("c<<=2:%d\n", c <<= 2);
printf("c&=2:%d\n", c &= 2);
return 0;
}
结果:
cpp
c=a:5
c+=2:7
c-=2:5
c*=2:10
c/=2:5
c%=2:1
c<<=2:4
c&=2:0
6.其他运算符
?::条件运算符(三元运算符),根据条件选择两个表达式之一执行。
cpp
int max = (a > b) ? a : b;
sizeof:返回变量或数据类型的大小(以字节为单位)
cpp
int size = sizeof(int);
&:取地址运算符,返回变量的内存地址
cpp
int *ptr=&a;
*:指针运算符,用于访问指针指向的值。
cpp
int value = *ptr;
++:自增运算符,将变量的值增加1。
cpp
a++; // 后置自增
++a; // 前置自增
--:自减运算符,将变量的值减少1。
cpp
a--; // 后置自减
--a; // 前置自减
7.运算符优先级
运算符的优先级决定了表达式中运算符的执行顺序。以下是一些常见运算符的优先级(从高到低):
(1)()(括号)、[](数组下标)、.(成员访问)、->(指针成员访问)
(2)!、~、++、--、+(正号)、-(负号)、*(指针)、&(取地址)、sizeof
(3)*、/、%
(4)+、-
(5)<<、>>
(6)<、<=、>、>=
(7)==、!=
(8)&
(9)^
(10)|
(11)&&
(12)||
(13)?:
(14)=、+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=
(15),(逗号运算符)
简记:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符