算术运算符
运算符 | 描述 |
---|---|
+ | 把两个操作数相加 |
- | 从第一个操作数中减去第二个操作数 |
* | 把两个操作数相乘 |
/ | 分子除以分母 |
% | 取模运算符,整除后的余数 |
注:
- 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
- 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
- % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
代码示例
//算术运算符:+ - * / %
int main()
{
//+ - 相加
int a = 1 + 1;
printf("%d\n", a);// 2
//- - 相减
int b = 2 + 1;
printf("%d\n", b);// 3
//* - 相乘
int c = 2 * 2;
printf("%d\n", c);// 4
//整数除整数,结果为小数时,会把小数部分去除
int d = 9 / 2;
//如果想得到小数,就得把其中的一个整数改为浮点数
float e = 9 / 2.0;
printf("%d %f\n", d, e);// 4 4.500000
//% - 取余
int f = 9 % 2;
printf("%d\n", f);// 1
return 0;
}
移位运算符
运算符 | 描述 |
---|---|
<< | 二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。 |
>> | 二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。 |
代码示例
//移位运算符:<< >>
int main()
{
int a = 2;
//整数型2的二进制表示:
//00000000 00000000 00000000 00000010
//<<:为左移运算符,表示整体向左移动一位
//00000000 00000000 00000000 00000100
int b = a << 1;
//00000000 00000000 00000000 00000010
//>>:为右移运算符,表示整体向右移动一位
//00000000 00000000 00000000 00000100
int c = a >> 1;
printf("%d %d", b, c);// 4 1
return 0;
}
位操作符
运算符 | 描述 |
---|---|
& | 按位与操作,按二进制位进行"与"运算。 |
| | 按位或运算符,按二进制位进行"或"运算。 |
^ | 异或运算符,按二进制位进行"异或"运算。 |
代码示例
//位运算符:& | ^
int main()
{
int a = 2;
int b = 3;
int c = 0;
//& - 按位与同位两个数字都为1得1,其他结果得0
//2的二进制: 00000000 00000000 00000000 00000010
//3的二进制: 00000000 00000000 00000000 00000011
//2 & 3操作:00000000 00000000 00000000 00000010
c = a & b;
printf("%d\n", c);// 2
//| - 按位或同位两个数字其中一个为1或两个都为1得1,其他结果得0
//2的二进制: 00000000 00000000 00000000 00000010
//3的二进制: 00000000 00000000 00000000 00000011
//2 | 3操作:00000000 00000000 00000000 00000011
c = a | b;
printf("%d\n", c);// 3
//^ - 按位异或同位两个数字相同得0,不同得1
//2的二进制: 00000000 00000000 00000000 00000010
//3的二进制: 00000000 00000000 00000000 00000011
//2 ^ 3操作:00000000 00000000 00000000 00000001
c = a ^ b;
printf("%d\n", c);// 1
return 0;
}
赋值运算符
运算符 | 描述 |
---|---|
= | 简单的赋值运算符,把右边操作数的值赋给左边操作数 |
+= | 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 |
-= | 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 |
*= | 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 |
/= | 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 |
%= | 求模且赋值运算符,求两个操作数的模赋值给左边操作数 |
<<= | 左移且赋值运算符 |
>>= | 右移且赋值运算符 |
&= | 按位与且赋值运算符 |
|= | 按位或且赋值运算符 |
^= | 按位异或且赋值运算符 |
代码示例
//赋值运算符 = += -= *= /= %= <<= >>= &= |= ^=
int main()
{
int a = 0;
a = 5;//把2赋予给a
a += 3;//等同于a = a + 3;
a -= 3;//等同于a = a - 3;
a *= 3;//等同于a = a * 3;
a /= 3;//等同于a = a / 3;
a %= 3;//等同于a = a % 3;
a <<= 3;//等同于a = a << 3;
a >>= 3;//等同于a = a >> 3;
a &= 3;//等同于a = a % 3;
a |= 3;//等同于a = a % 3;
a ^= 3;//等同于a = a % 3;
return 0;
}
单目运算符
运算符 | 描述 |
---|---|
! | 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 |
+ | 表示为整数 |
- | 表示为负数 |
sizeof() | 返回变量的大小。 |
~ | 取反运算符,按二进制位进行"取反"运算。 |
++ | 自增运算符,整数值增加 1(后置++,先使用,再++;前置++,先++,后使用) |
– | 自减运算符,整数值减少 1(后置–,先使用,再–;前置–,先–,后使用) |
& | 返回变量的地址。 |
* | 指向一个变量。 |
(类型) | 强制类型转换。 |
代码示例
//单目运算符 ! + - sizeof ~ ++ -- & * (类型)
int main()
{
//0 表示假,非0就是真
int a = 0;
printf("%d\n", !a);//1
a = -5;
a = -a;
a = +a;
//sizeof是一个操作符
//不是函数
//计算类型或者变量的大小的
int b = 10;
printf("%d\n", sizeof(int));// 4
printf("%d\n", sizeof(b));// 4
//10*4 = 40
int arr[10] = { 0 };
printf("%d\n", sizeof(arr));//40 计算的是数组的总大小,单位是字节
printf("%d\n", sizeof(arr[0]));//4
int sz = sizeof(arr) / sizeof(arr[0]);//数组的长度
printf("%d\n", sz);// 10
//~ 按位取反
int c = 0;
//0的二进制:00000000 00000000 00000000 00000000
//~取反 :11111111 11111111 11111111 11111111
//整数在内存中的形式为补码
//正整数的原码、反码、补码相同
//负整数(拿-1举例)
//原码:10000000 00000000 00000000 00000001 (头位属于符号位,1为负数)
//反码:11111111 11111111 11111111 11111110 (原码符号位不变,其余取反)
//补码:11111111 11111111 11111111 11111111 (反码加1,最后得到补码)
printf("%d\n", ~c);// -1
//++ 和 --
int d = 10;
int e = d++;//后置++,先使用,再++
printf("%d\n", d);//11
printf("%d\n", e);//10
int f = 10;
int g = ++f;//前置++ - 先++,后使用
printf("%d\n", f);//11
printf("%d\n", g);//11
//&返回变量的地址。
int h = 6;
int* p = &h;
printf("%p\n", p);// 0000005C13AFFA24(这是内存地址,不是固定的)
//*指向一个变量
int i = *p;
printf("%d\n", i);// 6
//强制类型转换
int j = (int)3.14;
printf("%d\n", j);// 3
return 0;
}
关系运算符
运算符 | 描述 |
---|---|
== | 检查两个操作数的值是否相等,如果相等则条件为真。 |
!= | 检查两个操作数的值是否相等,如果不相等则条件为真。 |
> | 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 |
< | 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 |
代码示例
//关系运算符 == != > < >= <=
int main()
{
int a = 6;
int b = 8;
if (a == b)
{
printf("a == b\n");
}
if (a != b)
{
printf("a != b\n");
}
if (a > b)
{
printf("a > b\n");
}
if (a < b)
{
printf("a < b\n");
}
if (a >= b)
{
printf("a >= b\n");
}
if (a <= b)
{
printf("a <= b\n");
}
return 0;
}
运行结果
a != b
a < b
a <= b
逻辑运算符
运算符 | 描述 |
---|---|
&& | 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 |
|| | 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 |
! | 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 |
代码示例
//逻辑运算符 && || !
int main()
{
//在C语言中程序把非零和非空的值判断为true,把零和NULL判断为false
int a = 0;
int b = 1;
if (a && b)
{
printf("a && b为真\n");
}
else
{
printf("a && b为假\n");
}
if (a || b)
{
printf("a || b为真\n");
}
else
{
printf("a || b为假\n");
}
if (!b)
{
printf("!b为真\n");
}
else
{
printf("!b为假\n");
}
return 0;
}
运行结果
a && b为假
a || b为真
!b为假
三目运算符
运算符 | 描述 |
---|---|
? : | 条件表达式 |
代码示例
//三目运算符
int main()
{
int a = 0;
int b = 3;
int max = 0;
max = a > b ? a : b;
printf("%d\n", max);// 3
return 0;
}
逗号运算符
代码示例
//逗号运算符
int main()
{
//(2, 4 + 5, 6);
int a = 0;
int b = 3;
int c = 5;
//a=5 c=1 b=3
int d = (a = b + 2, c = a - 4, b = c + 2);
//逗号表达式,是从左向右依次计算的
//整个表达式的结果是最后一个表达式的结果
printf("%d\n", d);
return 0;
}
运算符优先级
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
---|---|---|---|---|---|
1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 | ----- |
() | 圆括号 | (表达式)/函数名(形参表) | ----- | ||
. | 成员选择(对象) | 对象.成员名 | ----- | ||
-> | 成员选择(指针) | 对象指针->成员名 | ----- | ||
2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 |
(类型) | 强制类型转换 | (数据类型)表达式 | ----- | ||
++ | 前置自增运算符 | ++变量名 | 单目运算符 | ||
++ | 后置自增运算符 | 变量名++ | 单目运算符 | ||
-- | 前置自减运算符 | --变量名 | 单目运算符 | ||
-- | 后置自减运算符 | 变量名-- | 单目运算符 | ||
* | 取值运算符 | *指针变量 | 单目运算符 | ||
& | 取地址运算符 | &变量名 | 单目运算符 | ||
! | 逻辑非运算符 | !表达式 | 单目运算符 | ||
~ | 按位取反运算符 | ~表达式 | 单目运算符 | ||
sizeof | 长度运算符 | sizeof(表达式) | ----- | ||
3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 |
* | 乘 | 表达式*表达式 | 双目运算符 | ||
% | 余数(取模) | 整型表达式/整型表达式 | 双目运算符 | ||
4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 |
- | 减 | 表达式-表达式 | 双目运算符 | ||
5 | << | 左移 | 变量 | 左到右 | 双目运算符 |
>> | 右移 | 变量>>表达式 | 双目运算符 | ||
6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 |
>= | 大于等于 | 表达式>=表达式 | 双目运算符 | ||
< | 小于 | 表达式 | 双目运算符 | ||
<= | 小于等于 | 表达式 | 双目运算符 | ||
7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 |
!= | 不等于 | 表达式!= 表达式 | 双目运算符 | ||
8 | & | 按位与 | 表达式&表达式 | 左到右 | 双目运算符 |
9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | 双目运算符 |
10 | | | 按位或 | 表达式|表达式 | 左到右 | 双目运算符 |
11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 |
12 | || | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 |
13 | ?: | 条件运算符 | 表达式1? 表达式2: 表达式3 | 右到左 | 三目运算符 |
14 | = | 赋值运算符 | 变量=表达式 | 右到左 | ----- |
/= | 除后赋值 | 变量/=表达式 | ----- | ||
*= | 乘后赋值 | 变量*=表达式 | ----- | ||
%= | 取模后赋值 | 变量%=表达式 | ----- | ||
+= | 加后赋值 | 变量+=表达式 | ----- | ||
-= | 减后赋值 | 变量-=表达式 | ----- | ||
<<= | 左移后赋值 | 变量 | ----- | ||
>>= | 右移后赋值 | 变量>>=表达式 | ----- | ||
&= | 按位与后赋值 | 变量&=表达式 | ----- | ||
^= | 按位异或后赋值 | 变量^=表达式 | ----- | ||
|= | 按位或后赋值 | 变量|=表达式 | ----- | ||
15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 | 从左向右顺序运算 |
说明:
同一优先级的运算符,运算次序由结合方向所决定。
简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符
本文出现任何错误,欢迎留言批评指正。