第四章运算符及其优先级

表达式具有一个值
语句没有值
左值=右值,赋值操作符的左操作数必须是非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,所有赋值运算优先级相同,从右向左集合

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值