有条件的分支

时间:2012-03-16 17:54:00

标签: c++ c

为什么这段代码会编译?

#include <iostream>

int foo(int x)
{
   if(x == 10)
     return x*10;
}

int main()
{
int a;
std::cin>>a;
std::cout<<foo(a)<<'\n';
}

编译器不应该给我一个错误,例如“并非所有代码路径都返回值”?当x不等于10时,会发生什么/返回我的函数?

2 个答案:

答案 0 :(得分:10)

结果是未定义的,因此编译器可以自由选择 - 你可能会得到坐在调用者期望结果的适当堆栈地址处发生的事情。激活编译器警告,编译器会通知您遗漏。

答案 1 :(得分:3)

编译器不是必需在这种情况下给你一个错误。许多人会,有些人只会发出警告。有些人显然不会注意到。

这是因为你的代码确保可能在这个函数之外确保条件总是为真。因此,它不是必然坏(虽然它几乎总是如此,这就是大多数编译器至少会发出警告的原因)。

规范将声明退出应返回值但未返回值的函数的结果是未定义的行为。可以返回值。或者程序可能崩溃。或任何可能发生的事情这是未定义的。