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 <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.
本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;
包括没有适销性和某一专用目的下的适用性担保。
  • 12
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值