C/C++/C#面试题精选(23)-(25)

本文解析了两个C++代码示例的执行流程与结果。第一个示例通过逻辑运算符展示了函数调用顺序及短路效应,涉及字符串的打印输出。第二个示例则通过基类与派生类的关系说明了虚函数的多态特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题(23):运行下图中的C++代码,打印出的结果是什么?

bool Fun1(char* str)
{
    printf("%s\n",str);
    return false;
}

bool Fun2(char* str)
{
    printf("%s\n",str);
    return true;
}

int _tmain(int argc, _TCHAR* argv[])
{
    bool res1,res2;
    res1 = (Fun1("a")&& Fun2("b")) || (Fun1("c") || Fun2("d"));
    res2 = (Fun1("a")&& Fun2("b")) &&(Fun1("c") || Fun2("d"));

    return res1|| res2;
}


答案:打印出4行,分别是a、c、d、a。

            在C/C++中,与、或运算是从左到右的顺序执行的。在计算rest1时,先计算Fun1(“a”)&& Func2(“b”)。首先Func1(“a”)打印出内容为a的一行。由于Fun1(“a”)返回的是false,无论Func2(“b”)的返回值是true还是false,Fun1(“a”)&& Func2(“b”)的结果都是false。由于Func2(“b”)的结果无关重要,因此Func2(“b”)会略去而不做计算。接下来计算Fun1(“c”)|| Func2(“d”),分别打印出内容c和d的两行。

              在计算rest2时,首先Func1(“a”)打印出内容为a的一行。由于Func1(“a”)返回false,和前面一样的道理,Func2(“b”)会略去不做计算。由于Fun1(“a”)&& Func2(“b”)的结果是false,不管Fun1(“c”)&& Func2(“d”)的结果是什么,整个表达式得到的结果都是false,因此Fun1(“c”) || Func2(“d”)都将被忽略。

 

问题(25):运行下面的C++代码,打印的结果是什么?

class Base
{
public:
    voidprint() { doPrint();}

private:
    virtual void doPrint() {cout << "Base::doPrint" << endl;}
};

class Derived : public Base
{
private:
    virtual void doPrint() {cout << "Derived::doPrint" << endl;}
};

int _tmain(int argc, _TCHAR* argv[])
{
    Base b;
    b.print();

    Derived d;
    d.print();

    return 0;
}

答案:输出两行,分别是Base::doPrint和Derived::doPrint。在print中调用doPrint时,doPrint()的写法和this->doPrint()是等价的,因此将根据实际的类型调用对应的doPrint。所以结果是分别调用的是Base::doPrint和Derived::doPrint2。如果感兴趣,可以查看一下汇编代码,就能看出来调用doPrint是从虚函数表中得到函数地址的。

 

 

http://blog.youkuaiyun.com/cadcisdhht/article/details/6694248
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值