操作符
分类:
- 算术操作符
- 移位操作符
- 位操作符
- 赋值操作符
- 单目操作符
- 关系操作符
- 逻辑操作符
- 条件操作符
- 逗号表达式
- 下标引用、函数调用、结构成员
算术操作符
操作符 | 描述 | 用法示例 | 结合性 |
---|---|---|---|
+ | 加法 | rexp + rexp | L-R |
- | 减法 | rexp - rexp | L-R |
* | 乘法 | rexp * rexp | L-R |
/ | 除法 | rexp / rexp | L-R |
% | 整数取余 | rexp % rexp | L-R |
“/”若两个操作数都为整数→整数除法;只要含浮点数→浮点数除法
“%”两个操作数都必须为整型,返回的是整除之后的余数。
移位操作符
操作符 | 描述 | 用法示例 | 结合性 |
---|---|---|---|
<< | 左移位 | rexp << rexp | L-R |
>> | 右移位 | rexp >> rexp | L-R |
①左移位操作符移位规则:“左边抛弃,右边补0”
左移一位 (×2的效果)
左移二位 (×4的效果)……
②右移操作符移位规则:
-算术右移“左边补原符号位,右边丢弃” 大多数编译器,以保持正负不变
-逻辑右移“左边补0,右边丢弃”
右移一位 (÷2的效果)
右移二位 (÷4的效果)
特别说明:a<<-1 是不合法的写法
位操作符
操作符 | 描述 | 用法示例 | 结合性 |
---|---|---|---|
& | 位与 | rexp & rexp | L-R |
| | 位或 | rexp | rexp | L-R |
^ | 位异或 | rexp ^ rexp | L-R |
位(二进制位)
练习:求一个数字的二进制中1的个数(运用到位与&)
参考链接:https://blog.csdn.net/sillyxue/article/details/80287609
赋值操作符
-初始化 int weight = 120;
-赋值 weight = 89;
赋值操作符可以连续使用:例: a = x = y+1; → x=y+1 ; a=x ;
但是拆分比较清晰可见。
复合赋值符
+=、-=、*=、/=、%=、>>=、<<=、&=、|=、^=
举例:a=a+1; → a+=1;
单目操作符
-单目(只有一个操作数)
操作符 | 描述 | 用法示例 | 结合性 |
---|---|---|---|
! | 逻辑反 | ! rexp | R-L |
- | 单目,表示负值 | -rexp | R-L |
+ | 单目,表示正值 | +rexp | R-L |
& | 取地址 | &lexp | R-L |
sizeof | 取其长度,以字节表示 | sizeof rexp ; sizeof(类型) | R-L |
~ | 按位取反 | ~rexp | R-L |
– | 前缀自增 | –lexp | R-L |
++ | 前缀自减 | ++lexp | R-L |
* | 间接访问 | *rexp | R-L |
(类型) | 类型转换 | (类型)rexp | R-L |
①取地址操作符(&+变量)
Example: int num=10 ; (一级指针)int *p=& num ;(二级指针) int **pp=&p ;
(三级指针) int ***ppp=&pp ;
②sizeof 以字节为单位计算变量所占空间的大小/类型所创建空间的大小,且内部的表达式不计算。
补充:arr[10] = { 0 };
数组所占空间大小计算sizeof(arr)
数组类型空间大小计算sizeof(int [10])
③++a( 先加1再使用 );a++( 先使用再加1 )
④间接访问操作符Example:*P,表示通过P里存的值找到它指向的内容。
关系操作符
操作符 | 描述 | 用法示例 | 结合性 |
---|---|---|---|
> | 大于 | rexp > rexp | L-R |
>= | 大于等于 | rexp >= rexp | L-R |
< | 小于 | rexp < rexp | L-R |
<= | 小于等于 | rexp <= rexp | L-R |
!= | 不等于 | rexp != rexp | L-R |
== | 等于 | rexp == rexp | L-R |
!=(用于测试“不相等”)
== (用于测试“相等”)
注意:判断两个字符串/数组是否相等不能用“==”!
逻辑操作符
操作符 | 描述 | 用法示例 | 结合性 |
---|---|---|---|
&& | 逻辑与 | rexp && rexp | L-R |
|| | 逻辑或 | rexp || rexp | L-R |
-&&都为真才真
-||有真则为真
练习:打印结果是多少?
include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
//i = a++ && ++b && d++;//答案:1 2 3 4
//i = a++ || ++b || d++; //答案:1 3 3 4
printf("%d %d %d %d\n",a,b,c,d);
return 0;
}
条件操作符
操作符 | 描述 | 用法示例 | 结合性 |
---|---|---|---|
?: | 条件操作符 | rexp?rexp1:rexp2 | N/A |
若为真:rexp1 ;若为假:rexp2
练习:实现比较两个数的最大值
max = a > b? a : b ;
逗号表达式
exp1,exp2,exp3……expN
从左到右依次执行,整个表达式的结果是最后一个表达式的结果。
练习:打印结果是什么?
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);
printf("%d\n",c);
return 0;
}
答案:13(即最后一个逗号表达式的结果)。
下标引用、函数调用、结构成员
操作符 | 描述 | 用法示例 | 结合性 |
---|---|---|---|
[ ] | 下标引用 | rexp[rexp] | L-R |
( ) | 函数调用 | rexp(rexp,..,rexp) | L-R |
. | 访问结构成员 | lexp.member_name | L-R |
-> | 访问结构指针成员 | rexp->member_name | L-R |
①下标引用操作符:两个操作数(一个数组名+一个索引值)
下标为i元素的地址可以表示为:arr[ i ] = i [arr] = (arr+i) = (i+arr)
②()函数调用操作符
test(); 可接受一个或多个操作数。
③结构成员访问操作符
. 结构体.成员名
-> 结构体指针->成员名
Example :
#include <stdio.h>
struct Stu
{
char name[10];
int age;
char sex[5];
};
int main()
{
struct Stu stu;//结构体变量
struct Stu* pStu = &stu;//结构体指针
stu.age = 20;//结构成员访问
pStu->age = 20;//结构指针成员访问
return 0;
}