以下功能没有“返回等级”,只返回0,但它可以正常工作并返回等级。怎么会这样?
int Grade(double points)
{
int grade = floor(0.25*points - 1.5);
if (grade < 0)
return 0;
}
答案 0 :(得分:5)
这怎么可能?
当grade
小于零(修改后)时,函数返回0,或者当grade
不小于零时,程序的行为未定义。如果函数返回非void,则它不能在没有返回表达式的情况下结束,否则将有UB。
答案 1 :(得分:2)
拥有一个不返回值的代码路径在这里显然是未定义的行为,所以问题是未定义的行为如何在这里返回正确的值?据推测,函数末尾应该有一个return grade;
。
一种可能性是如何从函数返回值。在x86系统上,int返回值通常在返回函数之前放在EAX寄存器中。其他架构可能使用不同的寄存器名称,但在寄存器中放置返回值非常常见。
首先计算grade
值的行可能会将grade
的值留在EAX寄存器中。或者,将grade
与0进行比较的行可能会将其加载到EAX寄存器中。在任何一种情况下,当函数返回时,它将恰好在EAX中具有正确的值。如果您真的想知道它在做什么,请让编译器生成汇编列表,或者在汇编语言级别使用调试器逐步执行代码。
未定义的行为意味着代码在技术上可以做任何事情。这意味着有时它会(显然)正确。