m = (++i)+(++i)+(++i) 问题

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 
using namespace std;

int main() {
    int i = 1;
    int m = (++i)+(++i)+(++i);

    cout << m << endl;

    return 0;
}

当i采用volatile修饰,结果则为9。代码如下所示:

代码2:(结果为9)

#include 
using namespace std;

int main() {
    volatile int i = 1;
    int j = (++i)+(++i)+(++i);

    cout << j << endl;

    return 0;
}

说明:

实际上,跟编译器也有关。

你可能感兴趣的:(C/C++以及新特性)