本文主要是介绍左值,右值 及(++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++)的区别?
- #include <iostream>
- using namespace std;
- void main()
- {
- int a=4;
- cout<<((++a)+=(a++))<<endl; //结果为10
- cout<<a<<endl; //结果为11
- system("pause");
- }
- #include <iostream>
- using namespace std;
- void main()
- {
- int a=4;
- cout<<((++a)=(++a)+(a++))<<endl; //结果为12
- cout<<a<<endl; //结果为13
- system("pause");
- }
两者结果不一致,为什么呢?
首先先说说为什么(i++)不能做左值而(++i)可以。
- //前缀形式,如++a
- int &int::operator++()
- {
- *this+=1;
- return *this;
- }
- //后缀形式,如a++,由于返回的是副本,所以设定了const int,因为给oldvalue赋值是危险的,函数出栈动作结束后,oldvalue就消失了。
- const int int::operator++(int)
- {
- int oldvalue=*this;
- ++(*this);
- return oldvalue;
- }
(++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;
这篇关于左值,右值 及(++a)+=(a++)和(++a)=(++a)+(a++)计算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!