目录
1.操作符分类
算术操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符逗号表达式下标引用、函数调用和结构成员
2.算术操作符
+ - * / %
/ 操作符:整型的除法 1/2 -->0
浮点型的除法 1.0/2 1/2.0--->0.5
%操作符:取模操作符两端必须是整数
3.移位操作符
移位操作符移动的是二进制位。
<< 左移操作符>> 右移操作符注:移位操作符的操作数只能是整数
整数的二进制表示有三种
源码,
反码,
补码
正的整数的源码,反码,补码相同。
负的整数的源码,反码,补码是要计算的。
最高位0表示正数,1表示负数
整数在内存中存储的是补码。
左移操作符有乘二的效果。
左移右移只针对整数,不支持浮点数。
右移操作符:
(1)算术移位:右边丢弃,左边补原符号位
(2)逻辑移位:右边丢弃,左边补0
对于移位运算符,不要移动负数位。这个是标准未定义的。
4.位操作符
& // 按位与| // 按位或^ // 按位异或注:他们的操作数必须是整数。
// & - 按(2进制)位与:有0都为0,都是1按位与后才是1
// | - 按(2进制)位或:只要有1就是1,都为0按位或后才是0
// ^ - 按(2进制)位异或 - 相同为0,相异以1
按位与:
按位或:
按位异或:
按位异或举例:
//不能创建临时变量(第三个变量),实现两个数的交换。
//3^3 = 0 -> a^a=0
//011
//011
//000
//0^5=5 -> 0^a = a
//000
//101
//101
//3^3^5 = 5
//3^5^3 = 5
//异或操作符支持交换律
//011
//101
//110
//011
//101
//只适用于整型,有局限性,可读性不高
//int main()
//{
// int a = 3;
// int b = 5;
//
// printf("交换前:a=%d b=%d\n", a, b);
// a = a ^ b;//a=3^5
// b = a ^ b;//3^5^5 --> b=3
// a = a ^ b;//3^5^3 --> a=5
//
// printf("交换后:a=%d b=%d\n", a, b);
//
// return 0;
//}
//
//int main()
//{
// int a = 3;
// int b = 5;
// //这种方法会有溢出的问题
// printf("交换前:a=%d b=%d\n", a, b);
// a = a + b;
// b = a - b;
// a = a - b;
// printf("交换后:a=%d b=%d\n", a, b);
//
// return 0;
//}
//int main()
//{
// int a = 3;
// int b = 5;
// int c = 0;//空瓶
//
// printf("交换前:a=%d b=%d\n", a, b);
// c = a;
// a = b;
// b = c;
// printf("交换后:a=%d b=%d\n", a, b);
//
// return 0;
//}
5.赋值操作符
+=-=*=/=%=>>=<<=&=|=^=
6. 单目操作符
6.1 单目操作符介绍
! 逻辑反操作:真变假,假变真- 负值+ 正值& 取地址sizeof 操作数的类型长度(以字节为单位)~ 对一个数的二进制按位取反-- 前置、后置 --++ 前置、后置 ++* 间接访问操作符 ( 解引用操作符 )( 类型 ) 强制类型转换
单目操作符:只有一个操作数
C语言中0表示假,非0表示真
按位取反符号位也会取反。
6.2sizeof 和数组
sizeof是操作符,不是函数。
strlen是库函数,是用来求字符串长度。
7.关系操作符
>>=<<=!= 用于测试 “ 不相等 ”== 用于测试 “ 相等
8.逻辑操作符
&& 逻辑与 //并且|| 逻辑或 //或者
&& 左边为假,右边不计算
|| 左边为真,右边不计算
9.条件操作符
exp1 ? exp2 : exp3
10.逗号表达式
11.下标引用,函数调用和结构成员操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
12.表达式求值
表达式求值的顺序一部分是由操作符的优先级和结合性决定。
有些表达式的操作数在求值的过程中可能需要转换为其他类型。
12.1隐式类型转换
表达式的整型运算要在 CPU 的相应运算器件内执行, CPU 内整型运算器 (ALU) 的操作数的字节长度 一般就是int 的字节长度,同时也是 CPU 的通用寄存器的长度。因此,即使两个 char 类型的相加,在 CPU 执行时实际上也要先转换为 CPU 内整型操作数的标准长 度。通用 CPU ( general-purpose CPU )是难以直接实现两个 8 比特字节直接相加运算(虽然机器指令 中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int 长度的整型值,都必须先转换为int 或 unsigned int ,然后才能送入 CPU 去执行运算。
char short 发生整型提升
//无符号整形提升,高位补0
12.2算术转换
long doubledoublefloatunsigned long intlong intunsigned intint