算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用、函数调用和结构成员
+ - * / %
/ 操作符:整型的除法 1/2 -->0
浮点型的除法 1.0/2 1/2.0--->0.5
%操作符:取模操作符两端必须是整数
移位操作符移动的是二进制位。
<< 左移操作符 >> 右移操作符 注:移位操作符的操作数只能是整数
整数的二进制表示有三种 源码,
反码,
补码
正的整数的源码,反码,补码相同。
负的整数的源码,反码,补码是要计算的。
最高位0表示正数,1表示负数

整数在内存中存储的是补码。


左移操作符有乘二的效果。
左移右移只针对整数,不支持浮点数。
右移操作符:
(1)算术移位:右边丢弃,左边补原符号位
(2)逻辑移位:右边丢弃,左边补0

对于移位运算符,不要移动负数位。这个是标准未定义的。
& // 按位与 | // 按位或 ^ // 按位异或 注:他们的操作数必须是整数。
// & - 按(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;
//}
复合赋值符
+= -= *= /= %= >>= <<= &= |= ^=
! 逻辑反操作:真变假,假变真 - 负值 + 正值 & 取地址 sizeof 操作数的类型长度(以字节为单位) ~ 对一个数的二进制按位取反 -- 前置、后置 -- ++ 前置、后置 ++ * 间接访问操作符 ( 解引用操作符 ) ( 类型 ) 强制类型转换
单目操作符:只有一个操作数

C语言中0表示假,非0表示真





按位取反符号位也会取反。




sizeof是操作符,不是函数。
strlen是库函数,是用来求字符串长度。

> >= < <= != 用于测试 “ 不相等 ” == 用于测试 “ 相等

&& 逻辑与 //并且 || 逻辑或 //或者
&& 左边为假,右边不计算
|| 左边为真,右边不计算
exp1 ? exp2 : exp3

逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。


接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。


表达式求值的顺序一部分是由操作符的优先级和结合性决定。
有些表达式的操作数在求值的过程中可能需要转换为其他类型。

C 的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为 整型 提升 。

整型提升的意义 :
表达式的整型运算要在 CPU 的相应运算器件内执行, CPU 内整型运算器 (ALU) 的操作数的字节长度 一般就是int 的字节长度,同时也是 CPU 的通用寄存器的长度。 因此,即使两个 char 类型的相加,在 CPU 执行时实际上也要先转换为 CPU 内整型操作数的标准长 度。 通用 CPU ( general-purpose CPU )是难以直接实现两个 8 比特字节直接相加运算(虽然机器指令 中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int 长度的整型值,都必须先转换为int 或 unsigned int ,然后才能送入 CPU 去执行运算。
char short 发生整型提升
//无符号整形提升,高位补0

long double double float unsigned long int long int unsigned int int
复杂表达式的求值有三个影响的因素。
1. 操作符的优先级
2. 操作符的结合性
3. 是否控制求值顺序。
两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。
我们写出的表达式如果不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在问题
的。