m = (++i)+(++i)+(++i) 问题
问题描述
m = (++i)+(++i)+(++i)
i初始值为1,求m计算结果。
解析
计算机在计算m = (a+b)+(c+d)+(e+f)先计算(a+b)+(c+d),并把结果存储(例如:存储在j中),然后再计算j+(e+f)=j;
所以计算机先计算了两个++i(前两项i为3,++i先于+号);也就是m=3+3;然后m=6+(++i)(最后的i为4),也就是m=6+4=10。
首先++i=2,再计算第二个++i=3,此时计算机里i=3,第一个i也=3,第二个i也=3,因为计算机里只有一个i,因此原式=(3+3)+4=10,记住计算机里只有一个i,算第二个时第一个i改变了。
总之,++i返回的是引用(左值),i++返回的是临时对象(右值)。如下:
int m = (i++)++;//编译出错
int m = (++i)++;//编译正确
代码如下所示。
代码1:(结果为10)
#include <iostream>
using namespace std;
int main() {
int i = 1;
int m = (++i)+(++i)+(++i);
cout << m << endl;
return 0;
}
当i采用volatile修饰,结果则为9。代码如下所示:
代码2:(结果为9)
#include <iostream>
using namespace std;
int main() {
volatile int i = 1;
int j = (++i)+(++i)+(++i);
cout << j << endl;
return 0;
}
说明:
实际上,跟编译器也有关。上述结果采用编译器如下:
[root@VM-0-7-centos mydoc]# g++ --version
g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
Copyright © 2015 Free Software Foundation, Inc.
本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;
包括没有适销性和某一专用目的下的适用性担保。