1.运算符优先级
1.优先级最高者并不是真正意义上的运算符,包括:数组下标、函数调用、操作符各结构成员选择操作符 自左向右 a.b.c – (a.b).c
2.单目运算符,自右向左 (*p)() 不可省略括号 p++会被编译器解释成(p++),即取指针p所指向的对象,然后p+1;而不是(*p)++,取指针p所指向的内容,然后将内容+1
3.双目运算符
4.移位运算符
5.关系运算符
6.按位运算符
7.逻辑运算符
8.三目运算符
9.赋值运算符
10.逗号运算符 (宏定义比较多) 先计算左边的表达式,再计算右边的表达式,将右边表达式的值作为值传递。
ps:sizeof() 是在编译时期进行运算的。 ++等其他运算符是在运行时运算的
sizeof、::、.和(成员操作符)、? : 、注释符都不允许重载**
2.单目运算符里,除了++、–改变变量本身,其他的单目运算符不改变本身,只是改变其拷贝的值(存放在寄存器里,不回写),然后赋值给结果。
char ch=10; //0000 1010
~ch;// ch -- 00001010
char a=ch ;// a =11110101
++ch;// CH-- 00001011
++10;//错误
~10;//正确,不会作用于操作数,是对其的拷贝操作,不进行回写
3 编译器对于"求一个表达式的值,但不使用该值"的语句只是将该值简单的丢掉,(可以用到判断语句里,做值)
4. 当进行运算时,当运算符两边的类型不一致时会被自动类型转换。
运行时,运算符两边的类型是一致的(无论是默认转还是强转)。
编译器在处理需要默认类型转换时,将<-的类型自动转为它对应左边的类型进行计算(),如
float 转为double 进行运算,而上箭头不会自动转,而是当运算符左右两边类型还不相同时才会进行转换
横向转换(无条件转换),如两个float运算时自动转为double,提高运算的精度
纵向转换,运算(比大小)时小的转为大的(往上),赋值是截断
其他转换没有优先级,有多种转换方式
ps:指针类型都可以被强转。 结构体变量实体不能强转转换。