运算符指定数据对象要进行的操作。
算术运算符
- 二元运算符 【运算符操作两个操作数】
- + 两个操作数相加
- - 两个操作数相减
- * 两个操作数相乘
- / 两个操作数相除 【整数除法会截断结果中的小数部分,浮点数不会】
- % 两个操作数相除取余数 【不能应用于float/double类型数据】
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a = 10;
int b = 5;
printf("a + b = %d\n", a + b);
printf("a - b = %d\n", a - b);
printf("a * b = %d\n", a * b);
printf("a / b = %d\n", a / b);
printf("a %% b = %d\n", a % b);
return 0;
}
运行结果:
a + b = 15
a - b = 5
a * b = 50
a / b = 2
a % b = 0
- 一元运算符
- ++ 自增运算符 对操作数+1
- -- 自减运算符 对操作数-1
- 以上两个运算符可以放在操作数前,也可放在操作数后
- 放在操作数前表示先对操作数进行操作,然后再取值用
- 放在操作数后表示先取值用,然后再对操作数进行操作
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a = 10;
int b = 5;
int c = 0;;
printf("c = %d\n", c = a++); //先取a值,然后a=a+1--c=10 a = 11
printf("a = %d \n", a);
printf("c = %d\n", c = --b); //先对b进行-1,然后取b减完1后的值 c = 4
printf("b = %d\n", b);
return 0;
}
运行结果:
c = 10
a = 11
c = 4
b = 4
关系运算符
- > 判断第一个操作数是否大于第二个操作数
- < 判断第一个操作数是否小于第二个操作数
- >= 判断第一个操作数是否大于等于第二个操作数
- <= 判断第一个操作数是否小于等于第二个操作数
- == 判断两个操作数是否相等
- != 判断第一个操作数是否和第二个操作数不相等
- 以上运算满足条件结果为1,不满足结果为0
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a = 10;
int b = 5;
printf("a > b is %d\n", a > b);
printf("a < b is %d\n", a < b);
printf("a >= b is %d\n", a >= b);
printf("a <= b is %d\n", a <= b);
printf("a == b is %d\n", a == b);
printf("a != b is %d\n", a != b);
return 0;
}
运行结果:
a > b is 1
a < b is 0
a >= b is 1
a <= b is 0
a == b is 0
a != b is 1
逻辑运算符
- && 逻辑与运算【两个操作数结果值都为1时,与运算结果为1;其他情况都为0】
- || 逻辑或运算 【两个操作数结果中只要至少有一个是1,或运算的结果为1;其他情况都为0】
- 上述两个运算符都有短路特性 【只要通过第一个操作数可以判断出最终结果,就不再计算第二个操作数了】
- ! 逻辑非运算符 【操作数结果为1,非运算结果为0;操作数结果为0,非运算结果为1】
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a = 10;
int b = 5;
int c = 0;;
printf("(a > b) && (a - b) is %d\n", (a > b) && (a - b));
printf("(a < b) && (c = a - b) is %d\n", (a < b) && (c = a - b));
printf("c = %d\n", c); //由于短短,c不会被计算,c还是为0
printf("(a <= b) || (c = a - b) is %d\n", (a <= b) || (c = a - b));
printf("c = %d\n", c);
printf("!(a == b) is %d\n", !(a == b));
return 0;
}
运算结果:
(a > b) && (a - b) is 1
(a < b) && (c = a - b) is 0
c = 0
(a <= b) || (c = a - b) is 1
c = 5
!(a == b) is 1
按位运算符
只能用于整型操作数【有符号或无符号的char 、int、short、long】
- & 按位与 【两个操作数对应位都是1该位结果为1,其他为0】
- | 按位或 【两个操作数对应位至少有一个是1该位结果为1,其他为0】
- ^ 按位异或 【两个操作数对应位不同结果为1,其他为0】
- << 左移 【第一个操作数的二进制数左移第二个操作数位】
- >> 右移 【第一个操作数的二进制数右移第二个操作数位】
- ~ 按位取反 【一元操作符,对操作数的每一位都取反】
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a = 10; // 1010
int b = 5; // 0101
int c = 0;
printf("c = %d\n", c = a & b); // 0000-->0
printf("a = %d \n", ~a); // 1...1111110101-->取反+1 --> 1010-->10+1--> -11
printf("c = %d\n", c = a | b); // 1010 | 0101 -->1111
printf("b = %d\n", b = a ^ b); // 1010 ^ 0101 --> 1111
return 0;
}
运行结果:
c = 0
a = -11
c = 15
b = 15
赋值运算符
- = 赋值运算符 【将右侧操作数赋值给左侧的变量】
- += 【左侧操作数=左侧操作数 + 右侧操作数】
- -=【左侧操作数=左侧操作数 - 右侧操作数】
- *=【左侧操作数=左侧操作数 * 右侧操作数】
- /=【左侧操作数=左侧操作数 / 右侧操作数】
- %=【左侧操作数=左侧操作数 % 右侧操作数】
- &=【左侧操作数=左侧操作数 & 右侧操作数】
- ^=【左侧操作数=左侧操作数 ^ 右侧操作数】
- |=【左侧操作数=左侧操作数 | 右侧操作数】
- <<=【左侧操作数=左侧操作数 << 右侧操作数】
- >>= 【左侧操作数=左侧操作数 >> 右侧操作数】
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a = 10; // 1010
int b = 5; // 0101
int c = 0;
printf("c = %d\n", c += a); // c = c+a = 10;
printf("c = %d\n", c -= b); // c = c -b = 5
printf("c = %d\n", c <<= b); // c = c << b 0101 << 5--> 010100000-->160
return 0;
}
运行结果:
c = 10
c = 5
c = 160
运算符优先级
有些暂时没有提及的运算符,会在后续出现讲解。
运算符 | 结合性 |
---|---|
()、 []、 ->、 . | 从左到右 |
! 、~ 、++、 --、+(正号)、-(负号)、*、(type)、sizeof | 从右到左 |
*、/、% | 从左到右 |
+、- | 从左到右 |
<<、>> | 从左到右 |
<、<=、>、>= | 从左到右 |
==、!= | 从左到右 |
& | 从左到右 |
^ | 从左到右 |
| | 从左到右 |
&& | 从左到右 |
|| | 从左到右 |
? : | 从左到右 |
=、+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>= | 从右到左 |
, | 从右到左 |
最好还是用括号区分优先级,更易懂。