要回答这个问题, 首先要理解 ostream object 的工作方式, (在这里 cout 就是 ostream object)
#include <iostream.h>
#include <stdlib.h>
char a[] = \"你好\n\";
char b[] = \"大家好\n\";
int i=0;
char * f()
{
i++;
char * p = NULL;
if (i==1)
p = a;
else if (i==2)
p = b;
return p;
}
int main()
{
cout <<\"Hello\"; // 单步调试到这里请你看一下屏幕,
// 你会发现屏幕上没有显示hello 这个单词
// 如果你在这行代码后面加上<<flush; 或者 <<endl;
// 你再单步调试一下, 看看屏幕上显示了什么.
cout <<\"World\"<<endl;
system(\"pause\");
return 0;
}
为了便于单步调试程序, 我改写了你的程序, 你看一下那一段注释, 照样做一下, 想一想为什么是这样的.
我的理解是, 在没有释放 ostream 的 buffer 之前屏幕上将不显示 内容. 这是第一点.
第二点, 你的代码中不是直接输出一个String 或 其他 数据类型, 而是调用了一个函数, 通过这个函数来返回一个 CString 的指针, 也就是说返回一个地址, 该地址下存放着那个 CString 数据. 你的本意想让 cout 直接输出, 但是 cout 并没有直接输出, 而是 紧接着调用了函数 f(), 这个地方是关键, 程序先运行了f(), 接着又去运行了 f(). 这意味着什么呢? 这意味着 char 指针首先被放入一个 Stack 中, 然后再从Stack中读入 ostream buffer, 所以次序就反掉了. 要阻止连续放入Stack中, 程序稍微改一下就可以了.
代码如下:
//这段代码可以正确运行, 但是不符合题意
#include <iostream.h>
char a[] = \"你好\n\";
char b[] = \"大家好\n\";
char c[] = \"Hello\n\";
int i = 0;
char * f()
{
i++;
if(i == 1)
return a;
if(i == 2)
return b;
}
int main()
{
cout<<f(); // 指针放入 ostream buffer 中
cout<<f()<<endl; // 指针放入 ostream buffer 中, 然后输出, 清空 ostream buffer
return 0;
}
当然由于你的题目已经规定死了必须采用 cout<<f()<<f()<<endl; 可以知道, 那个出题的人很狡猾, 他不让你按照次序的将数据放入 ostream buffer, 而是逼迫你从Stack 中读取数据, 这就造成了输出次序反掉的结果, 为了符合题意, 那么只能在 f() 这个函数上做文章了, 也就是说, 每调用一次 f() 我就让它输出内容, 那个返回 "" 其实什么也没干, 只是为了迎合cout 而已.