关于C++中cout的输出问题,请进!

myheartgon 2005-10-25 09:36:21
请解释下面的代码在屏幕上输出什么,为什么!
int f(void)
{
throw "Help!";
return 0;
}

int main(void)
{
try{
cout<<"Before"<<f()<<"After"<<endl;
}
catch(const char * s){
cout << s << endl;
}

return 0;
}

1、如果你觉得输出是:Help!,那么为什么"Before"和"After"没有被显示?
2、如果把抛出异常的函数f()后面输出的字符串"After"放在一个函数(比如g())中打印,而上面的代码改为cout<<"Before"<<f()<<g()<<endl;则可以输出"After",而对于"Before"即使放在一个函数中也不能正常输出,为什么?

...全文
203 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
doway 2005-10-25
  • 打赏
  • 举报
回复
标准 C++ 中未定义一个表达式中的求值顺序。因此,不要编写在同一个表达式中依赖求值顺序的代码。

正确的写法是:

int i = f();
cout << ... << i << ...;
myheartgon 2005-10-25
  • 打赏
  • 举报
回复
谢谢楼上两位的回答!
对于小兵的回答我有些疑问:
这么看来,确实是参数传递的顺序引起的.你上面的说的"编译器会先执行所有函数",是什么规则?
另外,如果按你写的那个g(void)函数来说,它为什么就依旧有问题呢,我觉得这时它是函数,不就可以输出了吗?
xiaocai0001 2005-10-25
  • 打赏
  • 举报
回复
cout是先把所有的输出都计算出, 之后才整体输出.

你可以看看汇编代码就知道了
yhbttfile 2005-10-25
  • 打赏
  • 举报
回复
是这样的,你的语句:
cout<<"Before"<<f()<<"After"<<endl;
编译器首先会执行所有函数,把函数的返回值作为operator<<的输入。
所以,你的问题1中调用f()时抛出异常,程序自然就不会调用operator<<了。
根据你的问题2的描述,估计你后面的g()是这样定义的:
int g(void)
{
std::cout << "After";
}
但是,如果你的个这样定义:
std::string g(void)
{
return "After";
}
问题依然存在。

另,C++的函数引用参数的顺序是从右到左,operator<<调用参数的过程也遵循了这一原则。所以,如下代码:
std::cout<<"Before"<<f()<<g()<< std::endl;
函数被调用的顺序是g()、f()。
steel007 2005-10-25
  • 打赏
  • 举报
回复
1。因为try中的cout根本没有被执行到,所以"Before"和"After"没有被显示
2。因为cout<<中的式子是从右算到左的,到了f(),便由于throw的异常而跳到了下面的catch部分,所以对于"Before"怎么都没有用~

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧