我参加了一次面试,在面试中我被问到了两个我无法解决的问题。我想知道下面两段代码的问题是什么
第一个问题:
问题是:下面的代码有什么问题?
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);
}发布于 2015-07-31 06:32:59
在程序中有两件事是错误的,都是同一个问题,我将首先处理最大的一个问题。
void main()是不是有效的C++!main()必须返回int!Bjarne Stroustrup自己这么说的!
第二个问题是C++不指定函数参数的求值顺序。,这意味着这两个程序都有潜在的问题。
foo(pa = new A, pb = new B);A或B可能首先得到分配(不管是哪一个),如果另一个在分配期间抛出异常,则会泄漏内存。两个对象都应该先创建,然后传递到foo中。当然,您可以使用智能指针;)
printf("Foo() = %d , counter = %d", foo(), counter);counter可以是0,也可以是12。这取决于counter是在foo之前计算,还是在C++未指定的情况下进行计算。同样,您应该首先运行foo,存储值,然后使用printf。但是,当然,无论如何,您都会使用std::stringstream!
发布于 2015-07-31 06:26:37
您可以挑剔这两个程序,但两者都是无效的,因为没有定义有效的入口点。
void main()这不是程序的有效C++入口点。因此,整件事都是未定义的行为。
这可能不是面试官想知道的,但不要接受那些基本错误的人的琐碎问题。
发布于 2015-07-31 06:34:23
对于第二个问题,未指定printf()将打印计数器的0或12。foo()和counter的计算顺序未指定。
https://stackoverflow.com/questions/31739353
复制相似问题