表达式具有一个值
语句没有值
左值=右值,赋值操作符的左操作数必须是非const的左值
赋值操作具有右结合性,当有多个赋值操作时,从右向左结合
++i是前缀运算,先变后用,取i,变化内容,放入寄存器
i++是后缀运算
vc++6.0, dev-c++, gcc4.5.1环境下,汇编级只能实现两个数相加
d=(++i)+(++i)+(++i)会被拆分成d=(++i)+(++i),d=d+(++i)所以答案是22
在vs2010下可以直接进行三次自加,然后在加总和,答案是24
c/c++编译器编译时,从左到右尽可能多将字符组成一个运算符或者标识符
++i+++j等效于++(i++)+j "++"作用于i++,不合法
%要求运算数必须是整形
前置自增可以做左值表达式,返回的是操作数本身。后置自增只能用于右值表达式,返回的是一个临时变量
+,-,++,–的运算级别相同,int a=-i++,运算方向是从右到左结合,所以等价于-(i++),但是后置自增是先用再加,所以是等价于int a=-i,i=i+1;
关系与逻辑运算符
if(i<j<k):等价于运算i<j有两个结果 0或者1 再将0或者1与k比较大小
如果真的需要比较三者大小用if(i<j&&j<k)
判定一个整数n是否为2的正整数次幂?不是2的整倍数
if(n>1&&((n&(n-1))==0))
cout<<"yes"<<endl;
n=10000
n-1=01111 按位与结果就为0
如果
n=11000
n-1=10111按位与结果为10000
异或运算性质:相同数异或得0,且满足交换律
1,可以用于求解:1到n某一个数缺失了,求这n-1个数中缺失的是哪一个数
2,不用第三方变量,交换两个变量的值
a=a^b
b=a^b
a=a^b
3,实现加法运算
int add_no_arithm(int a,int b)
{
if(b==0) return a;
int sum=a^b;
int carry=(a&b)<<1;
return add_no_arithm(sum,carry);
}
4,实现求平均数
(x&y)+((x^y)>>1)
第一个是取,x有1,y有1,该位置取1刚好是两者的一半
第二个是,x,y两者之中只有一个有1的地方,取1后除2,即右移一位。
移位运算符
<< >>
int 低位补0 高位补符号位
unsigned int 低位补0 高位补0
运算符优先级
1,括号,下标,->, . 的优先级最好
2,单目比双目高,算术双目比其他双目高
3,移位运算高于关系运算,关系运算高于按位运算,按位运算高于逻辑运算,逻辑运算高于三目运算
4,所有赋值运算优先级相同,从右向左集合