下表即为C语言全部常用的操作符
操作符的优先级从高至低按由上到下的顺序排列
操作符 | 描述 | 用法示例 | 结果类型 | 结合性 | 是否控制求值顺序 |
---|---|---|---|---|---|
() | 聚组 | (表达式) | 与表达式相同 | N/A | 否 |
() | 函数调用 | rexp(rexp,…,rexp) | rexp | L-R | 否 |
[ ] | 下标引用 | rexp[rexp] | lexp | L-R | 否 |
. | 访问结构成员 | lexp.member_name | lexp | L-R | 否 |
-> | 访问结构指针成员 | rexp->member_name | lexp | L-R | 否 |
++ | 后缀自增 | lexp ++ | rexp | L-R | 否 |
- - | 后缀自减 | lexp – | rexp | L-R | 否 |
! | 逻辑反 | ! rexp | rexp | R-L | 否 |
~ | 按位取反 | ~ rexp | rexp | R-L | 否 |
+ | 单目,表示正值 | + rexp | rexp | R-L | 否 |
- | 单目,表示负值 | - rexp | rexp | R-L | 否 |
++ | 前缀自增 | ++ lexp | rexp | R-L | 否 |
– | 前缀自减 | – lexp | rexp | R-L | 否 |
* | 间接访问 | * rexp | lexp | R-L | 否 |
& | 取地址 | & lexp | rexp | R-L | 否 |
sizeof | 取其长度,以字节表示 | sizeof(类型) | rexp | R-L | 否 |
(类型) | 类型转换 | (类型) rexp | rexp | R-L | 否 |
* | 乘法 | rexp * rexp | rexp | L-R | 否 |
/ | 除法 | rexp / rexp | rexp | L-R | 否 |
% | 整数取余 | rexp % rexp | rexp | L-R | 否 |
+ | 加法 | rexp + rexp | rexp | L-R | 否 |
- | 减法 | rexp - rexp | rexp | L-R | 否 |
<< | 左移位 | rexp << rexp | rexp | L-R | 否 |
>> | 右移位 | rexp >> rexp | rexp | L-R | 否 |
> | 大于 | rexp > rexp | rexp | L-R | 否 |
>= | 大于等于 | rexp >= rexp | rexp | L-R | 否 |
< | 小于 | rexp < rexp | rexp | L-R | 否 |
<= | 小于等于 | rexp <= rexp | rexp | L-R | 否 |
== | 等于 | rexp == rexp | rexp | L-R | 否 |
!= | 不等于 | rexp != rexp | rexp | L-R | 否 |
& | 位与 | rexp & rexp | rexp | L-R | 否 |
^ | 位异或 | rexp ^ rexp | rexp | L-R | 否 |
竖杠 | 位或 | rexp | rexp 竖杠rexp | L-R | 否 |
&& | 逻辑与 | rexp && rexp | rexp | L-R | 是 |
双竖杠 | 逻辑或 | rexp 双竖杠 rexp | rexp | L-R | 是 |
?: | 条件操作符 | rexp ? rexp : rexp | rexp | N/A | 是 |
= | 赋值 | lexp = rexp | rexp | R-L | 否 |
+= | 以…加 | lexp += rexp | rexp | R-L | 否 |
-= | 以…减 | lexp -= rexp | rexp | R-L | 否 |
*= | 以…乘 | lexp *= rexp | rexp | R-L | 否 |
/= | 以…除 | lexp /= rexp | rexp | R-L | 否 |
%= | 以…取模 | lexp %= rexp | rexp | R-L | 否 |
<<= | 以…左移 | lexp <<= rexp | rexp | R-L | 否 |
>>= | 以…右移 | lexp >>= rexp | rexp | R-L | 否 |
&= | 以…与 | lexp &= rexp | rexp | R-L | 否 |
^= | 以…异或 | lexp ^= rexp | rexp | R-L | 否 |
竖杠= | 以…或 | lexp 竖杠= rexp | rexp | R-L | 否 |
, | 逗号 | rexp,rexp | rexp | L-R | 是 |
(由于表格编辑问题,表中的“|”用“竖杠”代替)
操作符的分类:
算术操作符
+ - * / %
除了%操作符只能用于整数外,其他几个操作符可以用于整数和浮点数。
对于/操作符如果两个操作符都为整数,执行整数除法,当存在浮点数时就执行浮点数除法。
移位操作符
<< //左移
>> //右移
移位在二进制下进行
左移操作符规则:左边抛弃,右边补0
int num = 10;
num<<1
num在内存中的二进制00000000000000000000000000001010
变为00000000000000000000000000010100
右移操作符规则:
分为两种:1.逻辑移位左边用0填充,右边丢弃
2.算术移位左边用原该值的符号位填充,右边丢弃
具体使用哪一种取决于编译器
另外,不要移动负数位
num>>-1; //错误的使用
位操作符
& //按位与 两个二进制数比较,相同位数上的数一样返回值位1
| //按位或 相同位数上有1返回值就为1
^ //按位异或 相同位数上的数相同返回值为0,相异返回值为1
注:它们的操作数必须是整数。
输入如下代码看看它们的值是多少
#include <stdio.h>
int main()
{
int num1=2;
int num2=2;
int a = num1 & num2;
int b = num1 | num2;
int c = num1 ^ num2;
printf(“%d %d %d”,a,b,c)
return 0;
}
位操作符的妙用
不创建临时变量,实现两个数的交换
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
a = a^b;
b = a^b;
a = a^b;
printf("a = %d b = %d\n", a, b);
return 0;
}
赋值操作符
int a = 1;
a = 100;
复合赋值符
+= *= /= %= >>= <<= &= |= ^=
单目操作符
! - + & sizeof ~ -- ++ * (类型)
关系操作符
> >= < <= != ==
逻辑操作符
&& 逻辑与
|| 逻辑或
条件操作符
exp1 ? exp2 : exp3
逗号表达式
exp1, exp2, exp3, ...
下表引用、函数调用和结构成员
1.[]下标引用操作符
int arr[10];
arr[9] = 10;
这里也可以用9[arr]
来表示
2.()函数调用操作符
int main
{
test1();
test2(1);
}
3 .访问结构成员
结构体.成员名
结构体指针->成员名
#include <stdio.h>
struct Stu
{
char name[10];
int age;
char sex[5];
double score;
};
void set_age1(struct Stu stu)
{
stu.age = 18;
}
void set_age2(struct Stu* pStu)
{
pStu->age = 18;//结构成员访问
}
int main()
{
struct Stu stu;
struct Stu* pStu = &stu;//结构成员访问
stu.age = 20;//结构成员访问
set_age1(stu);
pStu->age = 20;//结构成员访问
set_age2(pStu);
return 0;
}