void main()
{
int y=0;
clrscr();
printf("%d\n",Testing());
y=Testing();
printf("%d",y);
getch();
}
int Testing()
{
int x=100;
//return x;
}
Result
512
4
我没有从测试功能返回任何东西仍然值即将到来?
另一个问题也是
void main()
{
char Testing();
int y=0;
clrscr();
printf("%d\n",Testing());
if(Testing())
printf("if--exi");
else
printf("else--exi");
getch();
}
char Testing()
{
char y;
//return y;
}
Result
0
if--exi
如果注释了printf,则结果为
else--exi
为什么会这样发生
答案 0 :(得分:5)
声明为返回到达没有返回路径的值的函数具有未定义的行为。你不幸的是它似乎仍然会返回一个半合理的价值。编译器假定在函数的所有出口中调用return
,并且返回值将在特定位置可用。
在你的第二个例子中,任何事情都会发生,包括每次调用都会返回不同的值。
g ++有一个警告来检测这个问题,它非常值得启用。
答案 1 :(得分:3)
为什么你的问题同时标记了C和C ++,而标题特指C?这两种语言在这方面有很大不同。
在C语言中,这些功能“起作用”,因为语言要求它们起作用。为什么不?使用某种返回类型声明的函数可能仍会执行一些有用的工作(除了返回任何内容)。因此,从正式的角度来看,在这样的函数中没有return
语句是完全没问题的。然而,这不是一个好的编程实践。只要您不尝试使用返回的值(函数没有真正返回),该函数就会起作用。您正在尝试使用该值,这会使代码的行为不确定。你声称它“有效”。实际上它没有。在这种情况下会发生什么以及为什么 - 这些问题没有答案。出于所有方式和目的,您的代码行为基本上是随机且不可预测的。
在C ++语言中,“忘记”返回带有return
语句的值的函数总是会立即导致未定义的行为,无论调用者是否使用该值。
答案 2 :(得分:2)
它只是内存中的随机垃圾你回来了,因此,第二个例子中的每个调用产生不同的结果
答案 3 :(得分:2)
获取函数的返回值是未定义的行为,该函数被声明为不返回任何内容。
未定义的行为意味着任何事情都是可能的,并且C ++标准没有定义操作的结果。您无法估算或估算任何程序运行中的结果。
答案 4 :(得分:1)
您正在导致未定义的行为,因此字面上任何输出都是可能的。
答案 5 :(得分:0)
从技术上讲,您正在调用“未定义的行为”。未定义的行为表现良好,没有定义。如果程序的行为未定义,则可能会打印512,499,甚至是葛底斯堡地址的完整文本。
我不会将你在任何合理意义上表现为“工作”的结果描述出来。
P.S。如果您使用的是GNU Compiler Collection,我建议至少使用 这些开关:“ - Wall -Werror”。
P.p.s。在过去的几年中,在ANSI标准C之前的日子里,某个非优化的Z-80 C编译器会接受这个程序片段:
int ReturnThree() {
3;
}
并生成与用户指定的代码相同的代码:
int ReturnThree() {
return 3;
}