“+” “-” “*” “/” “%”
注意点:
%号 只能用于整数
2.除数不能为0
/号,如果两数都是整数,结果为整数;如果有一个数为小数,结果为小数。
整型提升:凡是针对char,short型的数学运算,此时都会隐式转换为 int 型
(因为CPU运算一般以整型为基本单位)
算数转换:
long double
double 8个
float 4个
unsigned long int
long int 4个
long long 8个
unsigned int
int 4个
short 2个字节
如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。
警告: 但是算术转换要合理,要不然会有一些潜在的问题。
“<<” 左移操作符 左移相当于乘以2
">>"右移操作符 右移相当于除以2
左移操作符:左边抛弃,右边补0
右移操作符:1. 逻辑移位 :左边用0填充,右边丢弃
算术移位 :左边用原该值的符号位填充,右边丢弃。
符号位就是最高位,代表这个十进制数的正负:
最高位如果是0,就是正数,
最高位如果是1,就是负数,
对于移位运算符,不要移动负数位,这个标准是未定义的
例如:int num=10;
num>>-1;
& 按位与 两个操作数都为1,结果才是1
| 按位或 两个操作数都为0,结果才是0
^ 按位异或 两个操作数相同,结果是0,两个操作数不相同,结果是1
~ 按位取反 按位取相反数 0变成1,1变成0
复制操作符最常见的就是“=”,赋值操作符可以连续使用,连续赋值
复合赋值操作符:
+= *= /= %= >>= <<= &= |= ^=
! 逻辑反操作
负值
正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
(如果要计算数组的长度,则数组在哪里定义,在哪里计算)
“~” 对一个数的二进制按位取反
“–” 前置、后置–
“++” 前置、后置++
间接访问操作符(解引用操作符)
(类型) 强制类型转换
注意:* 间接访问操作,这个会在指针里面广泛用到。
++i,–i 先运算,再使用
i++,i-- 先使用,再运算
=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
&& 逻辑与 两个条件同时满足
|| 逻辑或 两个条件至少满足一个
特别:
短路性:&&左侧表达式为假时,右侧表达式不会进行求值
||左侧表达式为真时, 右侧表达式不会进行求值
exp1 ? exp2 : exp3
exp1 为真 结果为exp2 为假 结果为exp2
exp1, exp2, exp3, …expN
逗号表达式,就是用逗号隔开的多个表达式。 逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
练习:
int a=-16;
int b=a>>1;//右移操作符,移动的是二进制位
//存储到内存的是补码
//右移操作符:
//1、算术右移:右边丢弃,左边补原符号位(通常一般都是该种右移)
//2、逻辑右移:右边丢弃,左边补0
printf("%d\n",b);
int c=5;
int d=c<<1;
printf("%d\n",d);
//左移操作符:左边丢弃,右边补0
&--按位与,两个都是1才为1,只要有一个是0则为0
int e=3;
int f=5;
int g=e&f;
printf("%d\n",g);
|--按位或,两个都是0才为0,只要有一个是1则为1
int h=3;
int i=5;
int j=h|i;
printf("%d\n",j);
^--按位异或,相同为0,相异为1
int k=3;
int l=5;
int m=k^l;
printf("%d\n",m);
//C语言中没有同或符号,但是只要取异或的非即可,例如: m=!(k^l)
int n=10;
char o='r';
char*p=&c;
int arr[10]={0};
printf("%d\n",sizeof n);//4 此处可省略n的括号
printf("%d\n",sizeof(int));//4 类型不能省略括号
printf("%d\n",sizeof(o));//1 字符类型为1
printf("%d\n",sizeof(char));//1
printf("%d\n",sizeof(p));//8或者4 指针大小看是64位还是32位
printf("%d\n",sizeof (char*));//8 指针的类型
printf("%d\n",sizeof(arr));//40
printf("%d\n",sizeof(int [10]));//40 数组去掉名字,等号前面的就是数组的类型