i++和++i
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
分类: 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)
}