c++上次运行结果 0x1果

以下试题来自:
填空题以下程序运行后的输出结果是 _______ 。
fun(int a)
int b=0; static int c=3; b++;c++; return(a+b+c);
int i,a=5;
for(i=0;i<3;i++) printf("%d%d",i,fun(a));
printf("\n");
为您推荐的考试题库
你可能感兴趣的试题
1.填空题 对象2.填空题 ~test( );3.填空题 1 2 3 4 54.填空题 类5.填空题 2
热门相关试卷
最新相关试卷51CTO旗下网站
C++中几个值得分析的小问题
下面3个小问题都是我认为C++ Beginner应该能够解答或辨别清楚的。希望我们能通过题目挖掘更多的信息,而不仅仅局限在解题。我最喜欢说的话:能力有限,所以作为抛砖引玉,希望共同讨论,指出错误。
作者:来源:青藜学士的博客| 11:19
下面3个小问题都是我认为C++ Beginner应该能够解答或辨别清楚的。希望我们能通过题目挖掘更多的信息,而不仅仅局限在解题。我最喜欢说的话:能力有限,所以作为抛砖引玉,希望共同讨论,指出错误。
另外,我都是碰到一个觉得有必要记录的问题,就写下来说说,所以每一篇内容可能不是单一主题。
1、先来看一道简单题目。有下面这个继承类:
class&Person&{&public:&void&Walk()&&{&cout&&&&&Person::Walk&I&am&an&Ordinary&People.&&&&&&};&};&&class&Student&:&public&Person&{&public:&void&Walk()&&{&cout&&&&&Student::Walk&I&am&a&student.&&&&&&};&};&
你没看错Walk()是非虚函数。请解释下面代码:
Student&s;&Person*&pp&=&&s;&pp-&Walk();&&Student*&ps=&&s;&ps-&Walk();&
结果是这样的:
分析:Walk()是非虚函数,被静态绑定所限制,所以pp、ps是什么类型就决定了调用的版本。这里,我还要说明的一点是:明白接口继承和实现继承。声明一个non-virtual函数的目的是为了令derived class继承函数的接口及一份强制性实现。所以,绝不要重新定义继承而来的non-virtual函数。
2、下面这个问题实质上也是静态绑定与动态绑定的问题,但看起来不那么明显。
class&Shape&{&public:&enum&ShapeColor{Red,&Green,&Blue};&&&virtual&void&Draw(ShapeColor&color&=&Red)&const&=&0;&};&&class&Circle&:&public&Shape&{&public:&virtual&void&Draw(ShapeColor&color)&const&{&cout&&&&&I&am&Circle::Draw.&&;&cout&&&&&My&color&=&&&&&&color&&&&&}&};&&class&Rectangle&:&public&Shape&{&public:&virtual&void&Draw(ShapeColor&color&=&Green)&const&&{&cout&&&&&I&am&Rectangle::Draw.&&;&cout&&&&&My&color&=&&&&&&color&&&&&}&};&
我主要想说两个问题。
(1)当你下面这样调用时,请解释会发生什么情况。
Circle&&&cr.Draw();&Shape&*ps&=&&&&ps-&Draw();&
没错,(1)通过对象调用而不指定参数是错误的,而(2)的结果是这样的:color = 0代表Red这你应该是知道的。
分析:通过对象调用是静态绑定,一定要指定参数值,因为静态绑定这个函数不从base class继承缺省参数值。动态绑定却可以从base class继承参数值。注意,这里我就不强调动态绑定和静态绑定的概念了,但下面这个一定是静态绑定:
Circle&&Circle&*ps&=&&&&ps-&Draw();&
(2)第二个我想说的问题,请解释下面的调用结果。
Shape*&ps1&=&new&R&ps1-&Draw();&Shape*&ps2&=&new&C&ps2-&Draw();&
是这样令人可喜的结果:
你是说,你在Rectangle中已经将Draw的缺省值改为1(Green)了,怎么没效果?
分析:Rectangle::Draw的缺省参数值为GREEN,但ps2的静态类型为Shape*,所以此调用的缺省参数值来自Shape class。
如果你非要让Rectangle::Draw的参数有所改变,可以这样调用(提供参数):
Shape*&ps4&=&new&R&ps4-&Draw(Shape::Green);&Shape*&ps5&=&new&C&ps5-&Draw(Shape::Green);&
这个问题是想提醒你:virtual函数是动态绑定,缺省参数值是静态绑定。所以,不应该重新定义这个缺省参数值。
3、多重继承为什么会含有多个虚表指针而不是一个?
这道题是我看一位同学面试经验时,面试官提的,我试着回答一下,不知道在不在点子上,还请补充和指正。
答:多重继承下,因为编译器对一个derived class实现了n-1个虚表,n表示上一层base class的个数,当然假设每个base class都有至少有一个virtual函数,否则编译器是不会为其添加vptr和vtbl了。所以说有多少个虚表,自然就有多少个指针指向,而不是一个。
这样说我不知道合理不合理,可能面试官要问的点是&为什么需要多个虚表?一个虚表行不行?&
这个属于编译器厂商做的事情,标准并未规范。C++的父亲就做出过这样的一款编译器原型,通过增大vtbl的体积,每个slot上不只有一个指针,还有一个offset,用来调整this指针的指向。
这样做的弊端是:所有vtbl中的虚函数指针都包含这样一个offset,并且假设不需要调整this指向,调用时还是要做offset的加法操作,尽管offset此时为0。另外,vtbl中每个slot体积的膨胀。这些都是效率问题。
实际上,用来调整this的指向用的比较多的是trunk技术,必须以汇编编写才能获得高效率。另外,sun编译器就是把多个虚表连锁为1个,每个表格中含有下一个表格的指针(通过offset方式),这样就需要一个指针就好了。
理解能力有限,不知道问的是不是这么一回事?
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
热点头条热点关注头条
24H热文一周话题本月最赞
讲师:206570人学习过
讲师:304789人学习过
讲师:90581人学习过
精选博文论坛热帖下载排行
本书讲述怎样把UNIX环境下的应用程序移植到Linux环境上运行,是一本综合的开发和解决问题的参考手册 。本书详细描述了当前IT行业中被广泛应...
订阅51CTO邮刊大家帮忙看下这个程序运行结果是什么?Visual c++运行无结果【c语言吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:577,337贴子:
大家帮忙看下这个程序运行结果是什么?Visual c++运行无结果收藏
#include&stdio.h& main()
int c=0,k;
for(k=1;k&3;k++)
default:c+=k;
case 2:c++;
case 4:c+=2;
printf(&%d\n&,c);
}return 0; } 运行无结果 为什么?
c语言,学软件开发选博为峰,技术新,学习氛围轻松,随到随学免费试学,学费低,学时短,博为峰c语言!
#include&stdio.h&main() { int c=0,k;for(k=1;k&3;k++){switch(k){ default:c+=k;case 2:c++;case 4:c+=2;}printf(&%d\n&,c);}} 我觉得return 0是不需要的
谢谢,初学者,不过看我要自学网上,c二国家二级考试小冲哥的视频5--6那节的,讲的不明白,问下看看 这题怎么讲?
应该只有结果1。因为c中的switch语句始终先执行case。case选项不满足才执行default。与default位置无关。所以只输出了第一次循环的1。第二次是2但是有breaak语句直接跳出了。所以没有输出
登录百度帐号如何把c++最后运行结果的窗口放在word里
如何把c++最后运行结果的窗口放在word里
09-09-12 &匿名提问

我要回帖

更多关于 c程序运行结果怎样知道 的文章

 

随机推荐