【问题标题】:function doesn't display the return value?函数不显示返回值?
【发布时间】:2013-09-24 22:58:31
【问题描述】:

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

【问题讨论】:

  • Void 不返回值
  • @CAO....谢谢,但这不是我的问题。我在问为什么 fun(fun(fun(fun( fun(i))))));这个说法有效吗?

标签: c function return-value


【解决方案1】:

案例 1undefined behavior,如果我们查看 C99 draft standard 部分 6.8.6.4 返回声明说(强调我的 ):

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

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

warning: implicit declaration of function 'fun' [-Wimplicit-function-declaration]
warning: conflicting types for 'fun' [enabled by default]

【讨论】:

    【解决方案2】:

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

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

    extern int fun();
    

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

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

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

    【讨论】:

    • 好的,但是为什么它的打印为 0?为什么它不返回任何值作为 printf 的参数?
    • @user2322888 未定义行为未定义,明天它可能返回42
    • @user2322888:确定回答问题的唯一方法是查看生成的机器码;最有可能的是,0 值只是未定义行为的处理方式的意外。如果您使用不同的优化设置进行编译,或者在fun 中添加额外的打印语句等,您很可能会得到不同的结果(甚至可能会崩溃)。
    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多