位运算符:&,|,^,<<,>>,~
都是基于二进制数的移动,其他进制都要转换成二进制进行
左移n位,相当于乘以2的n次方;右移n位,相当于除以2的n次方。
^:a^a=0,遵行交换律,结合律 a^b^a=a^a^b=b:如果a的个数为偶数,那么计算结果永远是b
++,--与逗号表达式的运算:
1 int x=3; 2 int y=(++x,x++,x+10);
逗号表达式的运算:从左到右,依次计算每个表达式的值,最后一个表达式的值就是逗号表达式的值
1 int i=3; 2 i+++i+++i++;
贪心法:
编译器处理的每一个字符应该尽可能多的包含字符,编译器从左到右的顺序一个一个尽可能多的读入字符,即当读入的字符不能和已经读入的字符组合合法为止。
所以上式的处理方式:(i++)+(i++)+(i++)
1 int i=1; 2 ++i+++i+++i++;
处理方式:(++i++)+(i++)+(i++)
++i++,++i=2,2++,是个错误的表达式,所以上式编译不能通过。
优先级+类型转换:
*p.f==>*(p.f)
int *ap[]==>int *(ap[])
int *fp()==> int *(fp())
==和!=优先级高于位操作符:val & mask !=0 -->val & (mask !=0)
==和!=优先级高于赋值运算符:val =getchar() !=EOF -->val = (getchar() !=EOF)
算术运算符高于位移运算符:msk<<4+sg-->msk<<(4+sg)
逗号运算优先级最低:a=1,2-->(a=1),2
c语言隐式类型转换:(先转换再执行相应的运算操作)
算术运算式中,低类型转换为高类型 (char,short-->int)
赋值表达式中,表达式的值转换为左边变量的类型
函数调用时,实参转换为形参类型
函数返回时,return表达式转换为返回值类型。
1 #include <stdio.h> 2 int main() 3 { 4 int i = -2; 5 unsigned int j = 1; 6 if( (i + j) >= 0 ) //i先转换为unsigned int类型,注意负数的存储 7 { 8 printf("i+j>=0 "); // i+j>=0 9 } 10 else 11 { 12 printf("i+j<0 "); 13 } 14 printf("i+j=%d ", i + j); // -1,%d表示有符合的整型 15 return 0; 16 }