我接受了面试,在那里我被问到两个我无法解决的问题。我想知道下面两段代码的问题是什么
第一个问题:
问题是:以下代码出了什么问题?
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);
}
答案 0 :(得分:13)
程序中有两个问题,都是同一个问题,我会先处理最大的问题。
void main()
不有效的C ++! main()
必须返回int
! Bjarne Stroustrup said so himself!
第二个问题是C++ leaves the order of evaluation of function arguments unspecified,这意味着两个程序都可能存在潜在问题。
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
!
答案 1 :(得分:7)
你可以挑选两个程序,但两者都是无效的,因为没有定义有效的入口点。
void main()
这不是程序的有效C ++入口点。因此,整个事情都是未定义的行为。
这可能不是面试官想要知道的,但是不要从一个基本错误的人那里得到琐事问题。
答案 2 :(得分:1)
对于第二个问题,未指明printf()
是否会为计数器打印0
或12
。 foo()
和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计数器的值将初始化为零,因为它是一个全局变量。
永久更改其值并非静态。