现在的位置: 首页 > 综合 > 正文

自增自减问题

2013年07月19日 ⁄ 综合 ⁄ 共 1474字 ⁄ 字号 评论关闭

分析题1:

写出判断ABCD四个表达式的是否正确, 若正确, 写出经过表达式中a的值: 

#include <iostream>
using namespace std;

void main(){
 int a=4;
 //a+=(a++);//A
 //cout<<a<<endl; // 9
 //a+=(++a);//B
 //cout<<a<<endl; // 10
 //(a++)+=a;//C error!
   //(++a)+=a;// C 改成这样的
 //cout<<a<<endl; //10
 //(++a)+=(a++);  // D
 //cout<<a<<endl; //11
 getchar();
}

答案:9 10 10 11
a+=(a++);

a=a+(a++); 由于int a=4 则 a++这个表达式的值为5,对于a++,先使用a参加运算,然后再使a自增1

所以a=4+(5)=9

 

(a++)+=a;//error!

++a这个表达式产生的是一个左值,可以把这个表达式用在一个需要左值的地方;a++ 后产生的是一个右值,不是一个有效变量,不能用在一个需要做值的地方,不能赋值。

 

(++a)+=a;

++a后,值存在了变量a中,随意

(++a)=(++a)+a;  a=(5)+5=10。

 

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

(++a)=(++a)+(a++);  a=(5)+6=11。

 

分析题2:

#include<iostream>

using namespace std;

void main(){

int a,b,c,d;  
 a=10;  
 b=a++;  
 c=++a;  
 d=10*a++; 
    cout<<a<<endl;
    cout<<b<<endl;
    cout<<c<<endl;
    cout<<d<<endl;
 getchar();
}

  b=a++;//这个地方要先赋值再计算
也就b=10 赋值完后a=a+1=11
   

 c=++a;//要先计算++
因为是先++ 也就是c=12 赋值后a=12
   

 d=10*a++;//这个地方要进行'*'运算
得到的值 在赋值给d 然后再做a++ 所以计算完 d=120 a=13
  

更深刻的理解:

首先:++运算符优先级是比=高
a++你要当作一个表达式。你说“先++再赋值”从字面看是对的,但是你的理解是错误的。你要分清赋值到底赋的是什么?
在b=a++这个计算种,我们先计算a++这个表达式,这个表达式的计算使得a变为11,同时这个表达式的值为10,这就是先++
再赋值的过程,我们不是把a赋给b,而是把a++这个表达式的值赋给b,而这个表达式的值为10
理解了“再赋值”到底赋的是什么,后面的就不难理解了。

c=++a赋的是++a的值(也就是12)

d=10*a++种,a++先被计算,使得a变为13

而a++的值是12,10*12赋给d就是120

在所有这些情况下,我们都不是把a的值赋给左值,而是把一个表达式的值赋给它,要能区别a++这个表达式和a本身,才是真理解了

b=a++; 
等价于b=a; 
a++; 
而c=++a; 
等价与++a; 
c=a; 

 

++a和a++的区别:

效率:

++a的效率确实比a++的要高,因为对++a来说,整个表达式的值就是a的值,没有进行中间值的拷贝工作,所以效率高;而对于a++来说,整个表达式的值是a增1之前的值,它会拷贝一份a增1之前的值作为整个表达式的值,所以效率低。 
表达式的值类型的区别:
2、++a这个表达式产生的是一个左值,可以把这个表达式用在一个需要一个左值的地方,如赋值表达式的左边:++a   =   8;   而a++产生的是一个右值,不能用在一个需要左值的地方。

抱歉!评论已关闭.