一.算术操作符
操作符 | 作用 | 举例 |
+ | 数与数的相加 | 1+1=2 |
- | 数与数的相减 | 2-1=1 |
* | 数与数的相乘 | 2*3=6 |
/ | 数与数的相除(应注意是否需要保留小数) | 5/2=2 5.0/2=2.5 |
% | 数与数的相除取余 | 5%3=2 |
可以看到除数与被除数是否有小数对结果也会有影响
二.移位操作符(需转换成二进制)
1.向左移位:<<,向右移位:>>
例如
int a=1;
int b=a<<1;
1的二进制表示为 00000000000000000000000000000001,
向左移一位表示为00000000000000000000000000000010,即为2
2.负数的移位
负数移位相比正数就要麻烦很多
原码,如-1原码为10000000000000000000000000000001
反码,如-1反码为1111111111111111111111111111111111110
补码,如-1补码为1111111111111111111111111111111111111
可以看出,原码即为数字直接转换为二进制,反码将0变为1,1变为0,补码即为反码+1
移位时移动补码后的值,向右移位,左边空缺的数用1补齐,向左则用0,然后再将其转为反码,补码后即为所求值
三.位操作符
操作符 | 作用(二进制中) |
&(与) | 同一位置的两个数都为1时为1 |
|(或) | 同一位置的两个数至少有一个为1时为1 |
^(异或) | 同一位置的两个数不同时为1 |
四.赋值运算符
操作符 | 举例 |
+ | 1+2=3 |
+= | a+=3 == a=a+3 |
-= | a-=3 == a=a-3 |
*= | a*=3 == a=a*3 |
/= | a/=3 == a=a/3 |
<<= | a<<=1 == a=a<<1 |
>>= | a>>=1 == a=a>>1 |
%= | a%=3 == a=a%3 |
五.单目操作符
操作符 | 作用 |
! | 逻辑反操作 |
- | 负值 |
+ | 正值 |
& | 取地址 |
sizeof | 操作数的类型长度 |
~ | 二进制按位取反 |
-- | 分为前置后置a--,--a |
++ | 分为前置后置a++,++a |
* | 间接访问操作符(解引用) |
(类型) | 强制类型转换 |
sizeof算长度的时候int为4,char为1
char a=1;
int b=(int)a;
这就实现了数据类型转换
六.关系操作符
>,>=,<,<=,!=,==
这里需要注意==的使用,赋值时使用=,判断相等时使用==
七.逻辑操作符
&&,||
a&&b&&c,当a为假时,系统将不再进行后面的运算
同样a||b||c,当a为真时,系统也不再进行后面的运算
八.条件操作符
?: int max=(2<3?2:3),max就将赋值为3
括号中的式子如果成立就将输出:前的值,不成立则输出:后的值
九.逗号表达式
int a=(1+3,2+3,3+3)在这里括号中从左往右运算,但是赋的值是最后一个表达式,也就是a=6
十.其他操作符
1.下标引用操作符
即数组中的[]
2.函数引用操作符
我们在主函数外定义一个函数,这时就需要()来调用该函数
void test()
{}
int main()
{
test();
}
3.访问结构体成员
struct people
{
char name[20];
int age;
};
int main()
{
struct people a={"张三",20};
printf("%s %d",a.name,a.age);
struct people*p=&a;
printf("%s %d",p->name,p->age);
}
① . 适用于结构体中
②->适用于指针结构体