文章目录
算术操作符
-
加法+
-
减法-
-
乘法*
-
除法---- /
整形的除法: 1/2=0
浮点型的除法 1.0/2=0.5
- 取模%
注: 取模操作符的两端必须是整数
移位操作符
-
移位操作符,移动的是二进制,操作数只针对整数
-
>> 右移操作符
<< 左移操作符
//int–4个字节–32个比特位
// 正数7----原码,反码,补码相同
//00000000 00000000 00000000 00000111----原码
//00000000 00000000 00000000 00000111----反码
//00000000 00000000 00000000 00000111----补码
// 7 >> 1
//对补码操作,向右移动一位,补0
//00000000 00000000 00000000 00000011–3
// 7 << 1
//对补码操作,向左移动一位,补0
//00000000 00000000 00000000 00001110–14
//负数-7
//10000000 00000000 00000000 00000111----原码
//11111111 11111111 11111111 11111000----反码(原码符号位不变,其他位按位取反)
//11111111 11111111 11111111 11111001----补码(反码+1)
//数据存储的是补码,所以位移操作符操作的是补码;
//右移操作符
算数操作符–右边丢弃,左边补原符号位
逻辑操作符–右边丢弃,左边补零
// -7 >> 1
// //符号位不变,向右移动一位,补0
//11111111 11111111 11111111 11111100----补码
//11111111 11111111 11111111 11111011----反码
//10000000 00000000 00000000 00000100----原码
//-4
// -7<< 1
//符号位不变,向左移动一位
//11111111 11111111 11111111 11110010----补码
//11111111 11111111 11111111 11110001----反码
//10000000 00000000 00000000 00001110----原码
// -14
#include<stdio.h>
int main()
{
printf("%d\n", 7 << 1);//14
printf("%d\n", 7 >> 1);//3
printf("%d\n", -7 << 1);//-14
printf("%d\n", -7 >> 1);//-4
return 0;
}
位操作符
位操作符 | - |
---|---|
& | 按(2进制)位与----同时为1,才为1 |
| | 按(2进制)位或----只要有1,就为1,两个同时为0,才为0 |
^ | 按(2进制)位异或----相同为0,不同为1 |
例:不创建临时变量,交换2个数
方法1:
方法2:
注:
- 方法1当数据过大时,可能存在溢出的问题.
- 方法2只适用于整数.
补充:
异或操作符支持交换律
a ^ a = 0;
0 ^ a = a;
例:求一个整数存储在在内存中的二进制的1的个数
求数据在内存中的存储形式为补码,
即为求二进制中1的个数
赋值操作符
> int a = 3; //初始化
> a = 1;//赋值
> int x = 0;
> int y = 20;
> a = x = y+1; //连续赋值
复合赋值操作符
操作符 | - |
---|---|
+= | a+=1等同于a=a+1 |
-= | a-=1等同于a=a-1 |
*= | a*=1等同于a=a*1 |
/= | a/=1等同于a=a/1 |
%= | a%=1等同于a=a%1 |
>>= | a>>=1等同于a=a>>1 |
<<= | a<<=1等同于a=a<<1 |
|= | a|=1等同于a=a|1 |
&= | a&=1等同于a=a&1 |
^= | a^=1等同于a=a^1 |
单目操作符
操作符 | - |
---|---|
! | 逻辑反操作—真变假,假变真 |
- | 负值 |
+ | 正值 |
& | 取地址操作符 |
sizeof | 操作数的类型长度,单位字节 |
~ | 按(2进制)取反 |
– | 前置 后置 |
++ | 前置 后置 |
* | 间接访问操作符/解引用操作符 |
() | 强制类型转换 |
只有一个操作符数
注:
C语言中,0表示假,非0表示真.
sizeof是操作符,不是函数
strlen是库函数,只能用来求字符串长度
a |= (1<<4); //第四位0变成1
a &= (~(1<<4)); //第四位1变成0
int a=(int) 3.14; //把3.14强制转换为int
关系操作符
关系操作符 | - |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
!= | 不等于 |
== | 等于 |
逻辑操作符
逻辑操作符 | – | – |
---|---|---|
&& | 逻辑与 | 同时为真,才为真 |
|| | 逻辑或 | 只要一个为真,即为真 |
- && 只要左边为假,右边就不执行
- || 只要左边为真,右边就不执行
条件操作符(三目操作符)
表达式1 ? 表达式2 : 表达式3 ;
- 表达式1为真,则执行表达式2;
- 表达式1为假,则执行表达式3.
逗号表达式
- 从左往右依次执行,整个表达式的结果,是最后一个表达式的结果.
下标引用操作符
[ ]---下标引用操作符
arr[7] --> *(arr+7) -->*(7+arr)-->7[arr]
//arr+7就是跳过7个元素,指向第8个元素
函数调用操作符
( )----函数调用操作符
Add();
结构体成员操作符
操作符 | - |
---|---|
. | 结构体成员操作符 |
-> | 结构体指针成员操作符 |
struct Stu
{
char name[20];
int age;
double score;
};
struct Stu s={0};
set_stu(&s);
void set_stu(struct Stu* ss)
{
strcpy((*ss).name,"zhansan");
(*ss).age=20;
strcpy(ss->name,"zhansan");
ss->age=20;
ss->score=100;
}
表达式求值
- 相邻操作符的优先级–>结合性
- 相邻操作符,优先级高的,先执行,
相邻操作符,优先级相同,取决于结合性
隐式类型转换
整形提升
- 字符和短整型使用之前转换为普通整型
如何提升?
- 按照变量的数据类型的符号位来提升.
- 无符号变量提升时补0.
char a = 5;
//char 5的补码
00000101
//正数5,符号位为0,提升时补0
00000000 00000000 00000000 00000101
char b = 126;
//char 126
01111110
//提升后:
00000000 00000000 00000000 01111110
int c = a + b;
//提升后的a
00000000 00000000 00000000 00000101
//提升后的b
00000000 00000000 00000000 01111110
// a+b
00000000 00000000 00000000 10000011
//取8bit
10000011
//符号位为1,提升时,补1
11111111 11111111 11111111 10000011--补码
11111111 11111111 11111111 10000010--反码
10000000 00000000 00000000 01111101--原码
a+b = -125;