我不理解此代码的输出:
#include <stdio.h>
long func(long pass)
{
long ret;
long i = pass;
if (i == 6)
{
printf("i=%ld\n",i);
return i;
}
printf("ended\n");
}
void main()
{
int j;
long it = 0;
for(j = 0; j < 12; j++)
{
printf("%ld\n",func(it));
it++;
}
}
输出显示&#34;结束&#34;和&#34; 6&#34;每次除非达到i = 6,那时它打印i = 6和6.
为什么?每次都不应该进入i == 6吗?
答案 0 :(得分:3)
当i
不等于6时,在没有return语句的情况下运行函数的结尾,这会给你未定义的行为 - 任何可能发生的事情。
在这种情况下,它可能只返回在函数末尾的硬件返回寄存器中发生的任何事情,这可能只是常量6,因为编译器可能已经将它放在那里进行比较。一个不同的编译器(甚至是在不同的一天运行的相同编译器)可能会给你一个不同的结果。
答案 1 :(得分:2)
当i == 6
不为真时,执行到达func
的末尾而不会遇到return
语句。这会导致函数返回不确定值。
然后行printf("%ld\n",func(it));
访问不确定的值,这会导致未定义的行为。
答案 2 :(得分:0)
控件到达long func(long)的末尾,因为return语句在if条件内,如果&#39; i&#39;不等于6。
答案 3 :(得分:0)
When i is not equal to 6 it throws the warning as :: warning C4715: 'func' : not all control paths return a value
and returns an indeterminate values and printf("%ld\n",func(it)); prints that value like,
ended
1
ended
1
ended
1
ended
1
ended
1
ended
1
i=6
6
ended
6
ended
6
ended
6
ended
6
ended
6