찾다

 >  Q&A  >  본문

C++ 中关于cout和i++、++i的问题

#include <iostream>
using namespace std;
int main(){
	int i=0;
	cout<<i++<<" "<<i++<<endl;//输出1 0
	i=0;
	cout<<++i<<" "<<++i<<endl;//输出2 2

}

对以上代码的输出如何解释?不太明白(编译环境为VS2010)

PHP中文网PHP中文网2807일 전725

모든 응답(3)나는 대답할 것이다

  • 阿神

    阿神2017-04-17 11:06:20

    赞同蓝皮鼠说的,请不要再纠结这种和编译器细节有关的东西了,因为第一你不需要了解,第二如果你需要了解那只能是你在写这个编译器,第三你了解的再多也可能和平台、CPU等有关系——他们随时可以变化。一句话,这不是推荐的代码风格,请避免这种写法。

    我在我的Mac上用i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)测试,结果和你说的一样。

    可能出现这种情况的理由是:

    cout<<i++<<" "<<i++<<endl;//输出1 0

    等价于

    operator<<( operator<<( operator<<(cout, i++), " "), i++);

    关于C++里面的执行细节,参见http://en.wikipedia.org/wiki/Sequence...,而上面这个函数表现的和你想的不一样,是因为函数参数的evaluation顺序没有定义,编译器可以做它自己想做的优化,比如就先把外层函数调用的参数i++evaluate成0,i变成了1,然后内层调用再得到的就是i==1了。

    회신하다
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 11:06:20

    不要再纠结这种和编译器处理非常相关的问题了,现实世界里基本不会遇到这样的场景。
    好吧 既然被踩了就多说几句,这种傻逼情景应该只会在天朝的考试和国内作者出的垃圾书上出现。

    회신하다
    0
  • 天蓬老师

    天蓬老师2017-04-17 11:06:20

    我记得曾经有过这样一个问题,C语言中:

    #include <stdio.h>
    int main()
    {
        int a, b;
        a = 2;
        b = (++a) * (++a) * (++a);
        printf("%d\n", b);
        return 0;
    }

    gcc输出结果是80,但是TC的结果是60。据我们几个人推测原因是,gcc编译器是这样处理的:

        a = ++a;                //a == 3 
        a = ++a;                //a == 4
        b = a * a               //b == 4 * 4==16
        a = ++a;                //a == 5
        b = b * a;              //b == 16 * 5 == 80

    而TC编译器是这样处理的:

        a = ++a;                //a == 3
        b = 3 * (++a);
        a = ++a;                //a == 4
        b = 3 * 4;
        a = ++a;                //a == 5
        b = b * a;              //b == 12 * 5 == 60

    个人理解呢,C语言也好C++也好只是一种标准,每个编译器在不违反标准的前提下有自己实现的办法,所以在写代码的时候注意不要写这种模棱两可的东西,不然移植性太差,以及容易出各种问题。事实上也没必要深究,除非是研究需要之类的。

    회신하다
    0
  • 취소회신하다