猿问

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

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


MYYA
浏览 129回答 2
2回答

MMTTMM

请不要再纠结这种和编译器细节有关的东西了,因为第一你不需要了解,第二如果你需要了解那只能是你在写这个编译器,第三你了解的再多也可能和平台、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++<<"&nbsp;"<<i++<<endl;//输出1&nbsp;0等价于operator<<(&nbsp;operator<<(&nbsp;operator<<(cout,&nbsp;i++),&nbsp;"&nbsp;"),&nbsp;i++);

隔江千里

我记得曾经有过这样一个问题,C语言中:#include&nbsp;<stdio.h>int&nbsp;main(){&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;a,&nbsp;b; &nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;2; &nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;=&nbsp;(++a)&nbsp;*&nbsp;(++a)&nbsp;*&nbsp;(++a);&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;b);&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0; }gcc输出结果是80,但是TC的结果是60。据我们几个人推测原因是,gcc编译器是这样处理的:&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;++a;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//a&nbsp;==&nbsp;3&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;++a;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//a&nbsp;==&nbsp;4 &nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;=&nbsp;a&nbsp;*&nbsp;a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//b&nbsp;==&nbsp;4&nbsp;*&nbsp;4==16 &nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;++a;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//a&nbsp;==&nbsp;5 &nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;=&nbsp;b&nbsp;*&nbsp;a;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//b&nbsp;==&nbsp;16&nbsp;*&nbsp;5&nbsp;==&nbsp;80而TC编译器是这样处理的:&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;++a;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//a&nbsp;==&nbsp;3 &nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;=&nbsp;3&nbsp;*&nbsp;(++a); &nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;++a;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//a&nbsp;==&nbsp;4 &nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;=&nbsp;3&nbsp;*&nbsp;4; &nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;++a;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//a&nbsp;==&nbsp;5 &nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;=&nbsp;b&nbsp;*&nbsp;a;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//b&nbsp;==&nbsp;12&nbsp;*&nbsp;5&nbsp;==&nbsp;60个人理解呢,C语言也好C++也好只是一种标准,每个编译器在不违反标准的前提下有自己实现的办法,所以在写代码的时候注意不要写这种模棱两可的东西,不然移植性太差,以及容易出各种问题。事实上也没必要深究,除非是研究需要之类的。
随时随地看视频慕课网APP
我要回答