1

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

3 回答 3

2

您的fun函数在调用时没有声明,因此编译器隐式地放置了一个带有int返回值的声明。

在 C89 中,如果没有可见的声明,就好像声明:

extern int fun();

出现在函数调用之前。但是由于您的函数定义实际上具有void返回值,因此您的程序会调用未定义的行为。

在 C99 中,隐式函数声明的规则已被删除,并且必须发出诊断。

编辑:实际上正如@Shafik Yaghmour所说,您在函数中也有一个返回语句void。这是 C89(和 C99 / C11)中的约束违规,编译器有权停止翻译。

于 2013-09-19T17:59:32.837 回答
2

案例 1未定义的行为,如果我们查看C99 草案标准部分6.8.6.4 返回声明说(强调我的):

带有表达式的 return 语句不应出现在返回类型为 void 的函数中。没有表达式的 return 语句只能出现在返回类型为 void 的函数中

但是如果你没有声明,那么编译器很可能暗示返回类型为,int但是声明和实现之间存在不匹配,据我所知,这再次成为未定义的行为。我能够以gcc相同的结果在最新版本上运行它,但我确实收到以下警告:

warning: implicit declaration of function 'fun' [-Wimplicit-function-declaration]
warning: conflicting types for 'fun' [enabled by default]
于 2013-09-19T18:01:27.217 回答
1

到目前为止提供的两个答案(由 Shafik 和 ouah 提供)都是正确且互补的(并且 +1)。但我想再次强调一点:不要忽视编译器给你的警告。C 中的警告通常可以使您免于很多麻烦。

当你编译你的代码时(例如 in gcc),你会看到:

warning: ‘return’ with a value, in function returning void

这清楚地表明您有一个不应该返回任何内容的函数,并且您仍然试图从中返回一个整数。由于结果类型被显式声明为void,编译器选择简单地忽略您返回的任何内容;这看起来好像你总是返回零。这可能看起来很奇怪,但是由于您正在做的是未定义的行为,编译器有权这样做。

于 2013-09-19T18:07:06.097 回答