左值,右值 及(++a)+=(a++)和(++a)=(++a)+(a++)计算

       在赋值语句中,赋值运算符“=”左,右两边的变量名扮演者两种不同的角色。对赋值运算符右边的B我们需要的是它的值,对左边的A我们需要的是他所代表的存储单元(的地址)。为了区分一个名字的这两种特征,

我们把一个名字所代表的单元(地址)称为该名的左值把一个名字的值称为该名的右值

(左值既可以在等号右边又可以在等号左边,但是右值只能在等号右边)

前置自增和后置自增的重要区别?

  ++a    前置自增能够用做左值表达式(前置自增返回操作数本身)

  a++    后置自增只能用与右值表达式(后置自增返回一个临时变量)。

 如:

 int main{
	   int  a=3;
	  a+=(a++);     //+=运算符是从右向左运算,temp=a;a+=temp;a=a+temp=3+3;所以cout<<a+=(a++);结果为6(cout<<(a=a+temp),a++;),最后执行a+1 
          cout<<a<<endl; //7    再次强调 ,如果上面直接输出cout<<a+=(a++)结果为6.理解这个下面就好理解了
	  a+=(++a);
	  cout<<a<<endl; //16
	  (++a)+=(a++);                   //改为(++a)+=(++a)
	  cout<<a<<endl; //35             //此时cout<<a<<endl;   //结果为36
	  //(a++)+=a; 会出现编译错误
	  return 0;
	}


  (++a)+=(a++)和(++a)=(++a)+(a++)的区别?

[cpp]  view plain copy
  1. #include <iostream>  
  2. using namespace std;  
  3. void main()  
  4. {  
  5.   int a=4;  
  6.   cout<<((++a)+=(a++))<<endl;   //结果为10 
  7.   cout<<a<<endl;              //结果为11  
  8.   system("pause");  
  9. }  
[cpp]  view plain copy
  1. #include <iostream>  
  2. using namespace std;  
  3. void main()  
  4. {  
  5.   int a=4;  
  6.   cout<<((++a)=(++a)+(a++))<<endl; //结果为12   
  7.   cout<<a<<endl;              //结果为13  
  8.   system("pause");  
  9. }  

两者结果不一致,为什么呢?

首先先说说为什么(i++)不能做左值而(++i)可以。

[cpp]  view plain copy
  1. //前缀形式,如++a  
  2. int &int::operator++()  
  3. {  
  4.    *this+=1;  
  5.    return *this;  
  6. }  
  7.   
  8. //后缀形式,如a++,由于返回的是副本,所以设定了const int,因为给oldvalue赋值是危险的,函数出栈动作结束后,oldvalue就消失了。  
  9. const int int::operator++(int)  
  10. {  
  11.    int oldvalue=*this;  
  12.    ++(*this);  
  13.    return oldvalue;  
  14. }  
那么(++a)+=(a++)和(++a)=(++a)+(a++)的结果为什么不同呢?

(++a)+=(a++)

其实是先++a,那么a变成5,(a++)之后返回副本值temp还是5,所以出现cout<<(++a)+=(a++)结果为a=a+temp=10.(此时a中的值不变,还为5) 当这条语句执行结束后,此时a++ ,a 的值由10变为11;

若改为(++a)+=(++a) 那结果就变为12咯。所以++a返回的是变量a所在内存单元的地址这点很重要((++a)执行后就可看为a+=(++a),此时的a的初始化值可以看做5. 所以a+=(++a)==>a=a+a===>a=6+6=12 

(++a)=(++a)+(a++);

同样是先++a,那么a变成5,遇到“=”时从右向左执行,此时++a后,a变为6,(++a)这部分值为6,在执行a++,将a赋值给临时变量temp=6;

所以cout<<(++a)=(++a)+(a++) 结果为cout<<(a=6+temp) ==> cout<<a==>12;  所以此时a=12,当这条语句执行完后再执行a++,a变为13.此时表达式cout<<a;结果为13;

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值