功能不显示返回值?

时间:2013-09-19 17:57:40

标签: c function return-value

为什么它不会返回任何值? 输出应该是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?

3 个答案:

答案 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,编译器选择忽略您返回的内容;这似乎总是返回零。这可能看起来很奇怪,但是,正如您所做的那样是未定义的行为,编译器有权这样做。