为了账号安全,请及时绑定邮箱和手机立即绑定

对下面代码的输出如何解释?不太明白

对下面代码的输出如何解释?不太明白

C++
MYYA 2023-04-18 11:15:04
#include <iostream>using namespace std;int main(){ int i=0; cout<<i++<<" "<<i++<<endl;//输出1 0 i=0; cout<<++i<<" "<<++i<<endl;//输出2 2}
查看完整描述

2 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

请不要再纠结这种和编译器细节有关的东西了,因为第一你不需要了解,第二如果你需要了解那只能是你在写这个编译器,第三你了解的再多也可能和平台、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++);


查看完整回答
反对 回复 2023-04-21
?
隔江千里

TA贡献1906条经验 获得超10个赞

我记得曾经有过这样一个问题,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++也好只是一种标准,每个编译器在不违反标准的前提下有自己实现的办法,所以在写代码的时候注意不要写这种模棱两可的东西,不然移植性太差,以及容易出各种问题。事实上也没必要深究,除非是研究需要之类的。


查看完整回答
反对 回复 2023-04-21
  • 2 回答
  • 0 关注
  • 128 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信