不运行,写出程序运行结果:

Paradin 2008-05-30 10:17:39

#include <iostream>
using namespace std;

int gv = 5;

double getDouble()
{
gv++;
const double& rd = gv;
double& ra = const_cast<double&>(rd);
ra *= 5;
return rd;
}

struct A
{
char c;
int i;
double d;
public:
A() : d(getDouble()), i(gv++) {}
};

A a;

int main()
{
cout << a.c + 3 << endl;
cout << a.i << endl;
cout << a.d;
}


这题如果做面试的话出得还行吧,征求点意见
...全文
244 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
Paradin 2008-05-31
  • 打赏
  • 举报
回复
恩!此题忽略!
向大家学习!
dwen20 2008-05-30
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 dahua010 的回复:]
引用 18 楼 dwen20 的回复:
引用 16 楼 dahua010 的回复:
我想知道一个答案~~
就是在执行完了
cout < < a.c + 3 < < endl;
cout < < a.i < < endl;
cout < < a.d;

以后~ gv的值为什么还是7~~~ 我本以为是35的...

请指教下~~~

因为它实际并不是gv的引用了。


我当然知道实际不是gv的引用了...但是我想知道为什么不是了? 是从那一步开始就不是了呢?
[/Quote]
const double& rd = gv;定义为常引用就不能再改变了。
dahua010 2008-05-30
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 dwen20 的回复:]
引用 16 楼 dahua010 的回复:
我想知道一个答案~~
就是在执行完了
cout < < a.c + 3 < < endl;
cout < < a.i < < endl;
cout < < a.d;

以后~ gv的值为什么还是7~~~ 我本以为是35的...

请指教下~~~

因为它实际并不是gv的引用了。
[/Quote]

我当然知道实际不是gv的引用了...但是我想知道为什么不是了? 是从那一步开始就不是了呢?
dwen20 2008-05-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 taodm 的回复:]
兄弟啊,C++标准没有规定说getDouble()先执行还是gv++先执行,
只规定了d和i谁先被赋值。
[/Quote]
恩,受教了,继续研究。
dwen20 2008-05-30
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 dahua010 的回复:]
我想知道一个答案~~
就是在执行完了
cout < < a.c + 3 < < endl;
cout < < a.i < < endl;
cout < < a.d;

以后~ gv的值为什么还是7~~~ 我本以为是35的...

请指教下~~~
[/Quote]
因为它实际并不是gv的引用了。
Paradin 2008-05-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 taodm 的回复:]
兄弟啊,C++标准没有规定说getDouble()先执行还是gv++先执行,
只规定了d和i谁先被赋值。
[/Quote]

谢谢提醒,我再去查查
dahua010 2008-05-30
  • 打赏
  • 举报
回复
我想知道一个答案~~
就是在执行完了
cout << a.c + 3 << endl;
cout << a.i << endl;
cout << a.d;

以后~ gv的值为什么还是7~~~ 我本以为是35的...

请指教下~~~
fuqd273 2008-05-30
  • 打赏
  • 举报
回复
好吧,我承认,我不行。

不过,你拿这个做面试题,招进来10个人组成个项目组,做出来的东西你敢用么?

我只会C..
Paradin 2008-05-30
  • 打赏
  • 举报
回复
这个题的结果真的游离在标准之外么?
不妨大家先做做吧
bitxinhai 2008-05-30
  • 打赏
  • 举报
回复
A() : d(getDouble()), i(gv++) {}
先初始化i:i = gv++ = 5;
gv变为6;
double getDouble()
{
gv++;//gv变为7
const double& rd = gv;
double& ra = const_cast<double&>(rd);
ra *= 5;
return rd;//返回35
}
执行:A() : d(getDouble()), i(gv++) {}
后d = 35,i= 5;
因为全局变量系统提供初始值:则c = 空字符,就是0,c+3 = 3;
输出结果为:
3
5
35
taodm 2008-05-30
  • 打赏
  • 举报
回复
兄弟啊,C++标准没有规定说getDouble()先执行还是gv++先执行,
只规定了d和i谁先被赋值。
qmm161 2008-05-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 taodm 的回复:]
引用 3 楼 Paradin 的回复:
呵呵你看清楚了,这是初始化列表,顺序规定了的。也没有你说的那个问题。

兄弟,是你要看清楚点。是参数的求值顺序,不是成员的初始化顺序。
也许目前99%的编译器下,你都能得到相同的结果。
但是,C++标准的规定也是再清楚不过的。
[/Quote]
c++标准还没看,不过初始化列表的初始化顺序似乎是固定的,mark
Paradin 2008-05-30
  • 打赏
  • 举报
回复

5 Initialization shall proceed in the following order:
— First, and only for the constructor of the most derived class as described below, virtual base classes shall
be initialized in the order they appear on a depth-first left-to-right traversal of the directed acyclic graph
of base classes, where “left-to-right” is the order of appearance of the base class names in the derived
class base-specifier-list.
— Then, direct base classes shall be initialized in declaration order as they appear in the base-specifier-list
(regardless of the order of the mem-initializers).
Then, nonstatic data members shall be initialized in the order they were declared in the class definition
(again regardless of the order of the mem-initializers).
— Finally, the body of the constructor is executed.


C++03标准 12.6.2.5
taodm 2008-05-30
  • 打赏
  • 举报
回复
当然在C++标准里。
你可以google More Exceptional C++ item21看看 。
dwen20 2008-05-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 taodm 的回复:]
引用 3 楼 Paradin 的回复:
呵呵你看清楚了,这是初始化列表,顺序规定了的。也没有你说的那个问题。

兄弟,是你要看清楚点。是参数的求值顺序,不是成员的初始化顺序。
也许目前99%的编译器下,你都能得到相同的结果。
但是,C++标准的规定也是再清楚不过的。
[/Quote]

在哪可以找到这个规定?我现在也被搞昏了,但是说初始化列表按成员声明顺序进行初始化倒确实看过,指点指点吧。
Paradin 2008-05-30
  • 打赏
  • 举报
回复
d(getDouble()), i(gv++)
首先这两个谁先谁后是不是确定了的?getDouble()函数体里才有对gv的操作.
难道老兄你是说i = gv 或i = gv + 1? 不是就请你列出一些反应结果不定的可能情况吧
taodm 2008-05-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Paradin 的回复:]
呵呵你看清楚了,这是初始化列表,顺序规定了的。也没有你说的那个问题。
[/Quote]
兄弟,是你要看清楚点。是参数的求值顺序,不是成员的初始化顺序。
也许目前99%的编译器下,你都能得到相同的结果。
但是,C++标准的规定也是再清楚不过的。
dahua010 2008-05-30
  • 打赏
  • 举报
回复
感觉公司要是做汇编或者嵌入式的出这题还有点意义.
不过如果真的是做这个的,题就不能用c++出了..
dwen20 2008-05-30
  • 打赏
  • 举报
回复
涉及到char和int类型的转化
类初始化列表初始化成员顺序,即按变量声明顺序初始化
除此之外,那个引用变来变去的没有什么意义吧,如果
double gv=5.5;
...
const int &rd=gv;
倒更有迷惑性
struct里成员默认都是public的,没必要再给构造函数加public修饰符
Paradin 2008-05-30
  • 打赏
  • 举报
回复
呵呵你看清楚了,这是初始化列表,顺序规定了的。也没有你说的那个问题。
加载更多回复(10)

64,654

社区成员

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

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