++i和i++

2008-03-27 21:59

i++和++i

在TC中(i++)*(++i)+(i--)*(--i)+(i--)*(--i)为什么等于12

i初值为3
想请教大家一个问题今天看C教程时看到个题目讲解
算表达式的值 i++ * ++i + i-- * --i结果是18
说明是CPU对表达式优化后 i++ * ++i 和 i-- * --i这两个可以同时处理 然后先同时处理++i --i 并且都是从3开始一个是4 一个是2
然后同时处理i++ 和 i--也是同时从3取出来两个都是3,
所以表达式是3*4+3*2=18
但是这样理解的话表达式(i++*++i)+(i--*--i)+(i--*--i)那应该是12+6+6=24 但是运行结果是12



c程问题 a=(i++)+(i++)+(i++);b=(++j)+(++j)+(++j);

#include<stdio.h>
#define PI 3.14
void main()
{int i,j,a,b;
i=j=3;
a=(i++)+(i++)+(i++);
b=(++j)+(++j)+(++j);
printf("a=%d,b=%d,i=%d,j=%d\n",a,b,i,j);
}
我的答案是 a=12,b=15,i=6,j=6

当我运行这个程序时 结果是 a=9,b=18

我的想法是 a=(i++)+(i++)+(i++);即为3+4+5
b=(++j)+(++j)+(++j);即为4+5+6

错在哪

最佳答案
我运行了一下结果是:

i和j很简单,我就不讲了。

这一种运算不是和你想想的那样算的:

这种题是研究生考题,前一阵子刚做过。

谭浩强的书不建议做这种运算。

相当一部分的环境是这个结果(试题书上也是这样讲的):

自增(或自减)相加是:

先看 ++变量有的话,先增,后算3个i相加

再看 变量++有的话,直接算

比如

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

就是先增i变成了4,然后a=4+4+4=12


这三个是分优先级的,前面的高于后面的

所以:

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

先看,没有++i,就直接相加:a=i+i+i=9;

b=(++j)+(++j)+(++j);

有三个自增,依次计算,j一直增到6

所以是:b=18=3*6;

最后

特别建议:不要用这样的增加方式,不同的机器,不同的编译器,

由于计算方式不同,很可能结果不同!

我的电脑编的时候,求出来的b就是16!!!







这是个运算符优先级和结合性的问题。
a=(i++)+(i++)+(i++);()的优先级最大,
先算()里面的;其次是++运算。最后是+号运算,
当++在后面时,表示i的值先使用,然后再加1,
此时,系统会有个临时变量存储i自加1后的值,三个括号运算结束后,
i的临时变量为6,而i仍为3,当执行a=3+3+3后,
i的值被赋予6,即i=6。++再前面时,是j的值自动加1,
不需要临时变量。
b=(++j)+(++j)+(++j);同样的,++再前面时,j的值先加1,
再使用,先算3个括号内部的,此时j=6,最后计算相加运算。
所以b=6+6+6.


前置的++,先进行加1运算后在进行表达式的运算。第一个++j,使j=4;第二个++j,使j=5;第三个++j,
使j=6;所以b=18.后置的+ +,是先进行表达式的运算,运算完成后,
使变量加1;a=(i++)+(i++)+(i++);a=3+3+3=9;运算完成后,i的值为4.



i++ 临时变量
++i i自己存


int i,j,a,b,c,d;
i=j=3;
//a=i++;b=i++;c=i++; //a 3 b 4 c 5
//d=(++i)++;//4
//printf("%d,%d,%d\n",++i,++i,i++); //5,4,3
//printf("%d,%d,%d\n",i++,++i,i++); //4,4,3
// printf("%d,%d,%d\n",++i,i++,i++); //4,3,3
//printf("%d,%d,%d\n",++i,++i++,i++); //
//printf("%d,%d,%d\n",++i,++(i++),i++); //x
//printf("%d,%d,%d\n",++i,(++i)++,i++); //5,4,4
//printf("%d,%d\n",(++i)++,i++); //4,4
//printf("%d,%d\n",++(++i),++i);//6,5
//printf("%d,%d\n",(++i)++,++i);//5,5
 
 
*****************************************************************************************************************************
*******************************************************************************************************************************
 
i++与++i哪个效率更高? 2009-07-27 19:44:17

分类: C/C++

答案:

在内建数据类型的情况下,效率没有区别;

在自定义数据类型的情况下,++i效率更高!

 

分析:

(自定义数据类型的情况下)

++i返回对象的引用;

i++总是要创建一个临时对象,在退出函数时还要销毁它,而且返回临时对象的值时还会调用其拷贝构造函数。

(重载这两个运算符如下)

class Integer{

public:

    Integer(long data):m_data(data){}

    Integer& operator++(){//前置版本,返回引用

        cout<<” Integer::operator++() called!”<<endl;

        m_data++;

        return *this;

    }

    Integer operator++(int){//后置版本,返回对象的值

cout<<” Integer::operator++(int) called!”<<endl;

Integer temp = *this;

m_data++;

return temp;//返回this对象的旧值

    }

private:

    long m_data;

};

 

void main(void)

{

    Integer x = 1;//call Integer(long)

    ++x;//call operator++()

    x++;//call operator++(int)

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值