标题:一个简单的程序,不太明白
只看楼主
fxzjw
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2006-1-22
 问题点数:0 回复次数:12 
一个简单的程序,不太明白

有一个题目是要求构造一个函数f(),要求在主函数中运行:
cout <<f()<<f() <<endl;
后输出:

你好
大家好

我设计了一个程序如下,在C++Builder 6运行后却是:(“大家好”为什么先出现了?)

大家好
你好

程序如下:
#include <iostream.h>
char a[] = "你好\n" ;
int i=0;
char b[] = "大家好\n";
char* f(){
i++ ;
if (i==1)return a;
if (i==2)return b;
}
void main(){
cout <<f()<<f() <<endl;
}

搜索更多相关主题的帖子: include color 
2006-02-11 21:20
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
得分:0 

#include <iostream.h>

char a[] = \"你好\n\";
char b[] = \"大家好\n\";
char c[] = \"Hello\n\";

int i = 0;

char * f()
{
switch(i)
{
case 0:
i++;
cout<<a<<flush;
return \"\";
case 1:
i++;
cout<<b<<flush;
return \"\";
case 2:
i++;
cout<<c<<flush;
return \"\";
}
}

int main()
{
cout<<f()<<f()<<f()<<endl;
return 0;
}


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2006-02-11 22:26
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 
oh,yeah!!!!!!!

key man is back!

[此贴子已经被作者于2006-2-11 22:35:26编辑过]

2006-02-11 22:34
fxzjw
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2006-1-22
得分:0 

谢谢kai,测试通过!

但我的程序问题是什么呢?能不能解释一下?


2006-02-11 23:55
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
得分:0 
要回答这个问题, 首先要理解 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 而已.


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2006-02-12 02:06
DarkHero
Rank: 1
等 级:新手上路
威 望:2
帖 子:191
专家分:0
注 册:2006-1-14
得分:0 
有理!

for( ; me.alive() ; ) { 淡泊名利,志存高远 } //Forever
2006-02-12 20:31
fxzjw
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2006-1-22
得分:0 
谢谢KAI了,但KAI在5楼所说:
以下内容为程序代码:

#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;
}
我用C++Builder 6进行单步调试时,发现:
cout <<"Hello"; 这一行 后面无论加不加 <<flush; 或者 <<endl;
单步调试时,屏幕上都不显示 "Hollo"
这是不是说明你的理论有点问题呢?



2006-02-13 14:14
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
得分:0 
fxzjw,
我问你一个问题,5楼的第二段代码在C++Builder 6是否运行正确?如果正确,那么有点就是肯定的,那就是编译器对两种不同写法做出了不同的处理,或许那个Stack对两者都存在,但是关键的是,
cout<<f(); // 地址数据存入Ostream Buffer 中了。

cout<<f()<<f()<<endl; //执行过程: 1) fun()
// 2) 地址数据放入 Stack中
// 3) fun()
// 4) 地址数据放入 Stack中
// 5) 从Stack中读入数据到Ostream Buffer
// 6) 输出到屏幕
// 7) 清空Ostream Buffer

[QUOTE]
我用C++Builder 6进行单步调试时,发现:
cout <<"Hello"; 这一行 后面无论加不加 <<flush; 或者 <<endl;
单步调试时,屏幕上都不显示 "Hollo"
这是不是说明你的理论有点问题呢?650)this.style.width=650;if(this.height>450)this.style.width=(this.width*450)/this.height;" align="middle" border="0">

[/QUOTE]
看来不同的编译器做出的处理也会有所不同。

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2006-02-14 08:29
aimarho8308
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2006-2-10
得分:0 
kai 谢谢你的回复 让我们这些新手学到了很多
2006-02-15 16:01
fxzjw
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2006-1-22
得分:0 
谢谢kai了

2006-02-17 23:22



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-45199-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.080558 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved