为什么它不会返回任何值? 输出应该是155,但它总是显示0.为什么?
int main()
{
int i=5;
printf("%d",fun(fun(fun(fun( fun(i))))));
return 0;
}
void fun(int i)
{
if(i%2) return (i+(7*4)-(5/2)+(2*2));
else return (i+(17/5)-(34/15)+(5/2));
}
但如果我改变
void fun(int i) // It doesn't work, case 1
to
int fun(int i) //It works fine, case 2
如果fun在case 1中没有返回任何值(void fun(int i)),那么怎么来
fun(fun(fun(fun( fun(i)))))); this statement is working?
答案 0 :(得分:2)
您的fun
函数在调用时没有声明,因此编译器隐式声明了int
返回值的声明。
在C89中,如果没有可见的声明,就好像声明:
extern int fun();
在函数调用之前出现。但是,由于函数定义实际上具有void
返回值,因此程序会调用未定义的行为。
在C99中,已删除隐式函数声明的规则,并且必须发出诊断信息。
编辑:实际上如@Shafik Yaghmour所述,您在void
函数中也有一个return语句。这是C89(和C99 / C11)中的约束违规,编译器有权停止翻译。
答案 1 :(得分:2)
案例1 是undefined behavior,如果我们查看C99 draft standard部分6.8.6.4
返回声明表示(强调我的):
带有表达式的return语句不应出现在返回类型的函数中 无效。不带表达式的return语句只能出现在函数中 其返回类型为无效
但是如果你没有声明,那么很可能编译器暗示返回类型为int
,但是声明和实现之间存在不匹配,据我所知,这就是未定义的行为再次。我可以在最新的gcc
上运行此结果,结果相同,但我收到以下警告:
warning: implicit declaration of function 'fun' [-Wimplicit-function-declaration]
warning: conflicting types for 'fun' [enabled by default]
答案 2 :(得分:1)
到目前为止(Shafik和ouah)提供的答案都是正确和互补的(和+1)。但是我想再次强调一下:不要忽略编译器给你的警告。 C中的警告通常可以帮助您避免很多麻烦。
编译代码时(例如在gcc
中),您会看到:
warning: ‘return’ with a value, in function returning void
这明确地说你有一个不应该返回任何东西的函数,但是,你仍然试图从中返回一个整数。结果类型显式声明为void
,编译器选择忽略您返回的内容;这似乎总是返回零。这可能看起来很奇怪,但是,正如您所做的那样是未定义的行为,编译器有权这样做。