在求职面试中提出的问题

时间:2015-07-31 06:22:34

标签: c++

我接受了面试,在那里我被问到两个我无法解决的问题。我想知道下面两段代码的问题是什么

第一个问题:

问题是:以下代码出了什么问题?

class A
{
    // Some properties ans methods
};

class B
{
    // Some properties ans methods
};

void foo(A* pa, B* pb)
{
    //Do somthing with pa and pb
};

void main()
{
    A* pa = NULL;
    B* pb = NULL;
    foo(pa = new A, pb = new B);
}

第二个问题:

问题是:打印的是什么(最终,面试官告诉我答案是17和0,但我不明白为什么)

int counter = 0; //Global variable

int foo()
{
    int i = 0;
    while (i < 12)
    {
        // Do somthing
        counter++;
        i++;
    }
    return 17;
}

void main()
{
    printf("Foo() = %d , counter = %d", foo(), counter);
}

5 个答案:

答案 0 :(得分:13)

程序中有两个问题,都是同一个问题,我会先处理最大的问题。

void main() 有效的C ++! main()必须返回intBjarne Stroustrup said so himself!

第二个问题是C++ leaves the order of evaluation of function arguments unspecified,这意味着两个程序都可能存在潜在问题。

foo(pa = new A, pb = new B);

AB可能首先被分配(它不重要),如果另一个在分配期间抛出异常,那么你将泄漏内存。应首先创建两个对象,然后将其传递到foo。当然,你可以使用智能指针;)

printf("Foo() = %d , counter = %d", foo(), counter);

counter可以是012。这取决于counter之前是foo的评估还是反过来,C ++没有指定。同样,您应首先运行foo,存储值,然后使用printf。但是,当然,无论如何,你都要使用std::stringstream

答案 1 :(得分:7)

你可以挑选两个程序,但两者都是无效的,因为没有定义有效的入口点。

void main()

这不是程序的有效C ++入口点。因此,整个事情都是未定义的行为。

这可能不是面试官想要知道的,但是不要从一个基本错误的人那里得到琐事问题。

答案 2 :(得分:1)

对于第二个问题,未指明printf()是否会为计数器打印012foo()counter的评估顺序未指定。

答案 3 :(得分:-2)

嘿,你的第二个问题的答案是, CAN BE 打印为零,因为@Andreas说没有定义处理参数的顺序,所以它可以是0,因为你在foo()中增加它。

第一个问题:

首先让我告诉您,如果您想将指针设置为nullpointer,则应该避免使用NULL,如果您使用的是C ++ 11,因为编译器无法识别NULL作为指针类型(参见Scott Meyer的更有效的C ++)。您应该使用nullptr代替。我不确定编译器是否会接受foo(pa = new A, pb = new B);语句,看起来像标准参数的函数的语法可能其他人可以在注释中给出提示。

答案 4 :(得分:-6)

在第二个问题中,无论foo()中的代码是什么,它总会返回&#39; 17&#39;

现在,由于counter是全局变量,它的值在foo()内部被操纵,所以当在main()中时,printf();使用counter计数器的值将初始化为零,因为它是一个全局变量。

永久更改其值并非静态。