1.语句和表达式的区别是:表达式具有一个值,而语句没有值。
2.赋值操作具有右结合性,当表达式含有多个赋值操作时,从右向左结合。多个赋值操作中,各变量必须具有相同的数据类型,或者具有可转换为同一类型的数据类型。
3.前缀运算时变后用,而后缀运算时先用后变。
4.自增、自减运算符只能作用于变量,而不能作用于常量或表达式。
5.前缀自增能有用作左值表达式,后缀自增只能用于右值表达式。这是因为前缀自增返回操作数本身,而后缀自增返回一个临时变量。
6.负号运算符和自增运算符优先级相同,得看结合方向,结合方向是从右向左。
7.关系与逻辑运算符
关系操作符具有左结合性
逻辑操作符将其操作数视为条件表达式。
8位运算符
与 & 都为1则为1
或| 有一个为1,就为1
取反~
异或^ 两位不同时才为1,相当于相同的时候就会消除。
移位<< >>
9关于异或
两个相同的数异或结果为零,满足交换律。
可以用作,快速查找不同的数字。交换两个变量的值。 异或求丢失!!!
10.不用运算符实现两个数的加法
a.先不考虑进位。 用异或实现累加。
b.考虑进位,只有同为1才会产生进位,用与& 实现,然后再左移动1位。
然后a,b相加 则是 a^b+((a&b)<<1 ) 如果求两个数的平均数,就右移动1位。
11.n &(n-1) 式子是去掉最右面的1.如果去掉之后变成0,则说明是2的正整数幂。因为2的正整数幂有且仅有1位是1,其余为0.去掉右面的1之后就变成0了。
上面的式子可以计算n转换成2进制后包含1的数量。
12.对于有符号类型,右移是最高位补符号位,左移动都是补0.
13.将a转换成b需改变的二进制的位数。
求异或,再计算包含的1的个数。
14.奇偶位互换。
与一个数进行与&保留出偶数为
然后再保留出奇数位。
奇数位左移动,偶数位右移,然后求或。
15.C++的基本类型转换
赋值转换:
当一个超过其取值范围的赋值给一个指定类型的对象时,会将高位舍去。
当一个取值范围较小的值赋值给一个取值范围较大的值时,会将符号位扩展。
(记住:int,short等的最高位)short是16位,无符号数最高可以表示 65536
表达式的转换:
整型提升:c++将bool、char、unsigned char 、signed char 、short 、signed short都会自动转换成int型。
运算时的转换:较小的类型会转换成较大的类型。在32为机器上,long和int一样长都是一个字节。 当表达式包含unsigned int和long时都会提升为unsigned long型。
int型负数转换成unsigned int时,会将符号位转换成数值位。-1的补码是1111111。c++中,有符号数和无符号数转换时,内容并没有变只是解释不同了。
16.运算符的优先级及结合性
a 单目运算符的优先级高于双目运算符。
[] () . ->的优先级最高。结合方向从左向右
负号的优先级高于自增、自减类型的运算符。结合性从右向左。
然后是sizeof
然后是+- *%等
然后是移位
然后是关系运算符。
然后是位
然后是逻辑
然后是三目
然后是赋值
然后是逗号等
有三目和单目、赋值运算符是从右向左的。
17.y^((x^y)&-(x<y)) 返回两个整数的最小值。
可以通过x<y表达式的结果得到全0或者全1的数。
18. float x与零值比较的语句
if(x>-0.000001&&x<0.000001)float只能保证6位有效数字,double能保证10位有效数字。