【问题标题】:Why does my user-defined function work without a return statement? [duplicate]为什么我的用户定义函数在没有 return 语句的情况下工作? [复制]
【发布时间】:2018-12-26 16:29:27
【问题描述】:

学习 C. 使用用户定义函数。

#include <stdio.h>
#include <stdlib.h>

int print_random_matrix (int m, int n);

void main (void)
{
    int m, n;

    printf("m: "); scanf("%d", &m);
    printf("n: ");   scanf("%d", &n);

    print_random_matrix(m, n);
}

int print_random_matrix (int m, int n)
{
    int i, j, a[20][20];
    for (i= 1; i<= m; i++)
    {
        for (j= 1; j<= n; j++)
        {
             printf("%d ", rand()%10);
        }
        printf("\n");
    }
    //why does this work without RETURN?
}

据我所知,您需要一个 return 语句来从您定义的函数中返回值,但是没有它就可以工作,我不明白为什么。 这段代码对我来说看起来不正确。

代码正确吗?

&

为什么它现在可以工作?

&

如何编写带有 return 语句的 print_random_matrix 函数?(如果必须)

【问题讨论】:

  • 无论如何你都没有收集或使用任何返回值,但编译器应该会警告你。
  • 嗯,你没有将返回值存储在任何地方,你怎么能说它有效呢?
  • gcc -Wall yourprog.cwarning: control reaches end of non-void function [-Wreturn-type]。 C 允许你这样做,但行为是未定义的,所以任何事情可能发生,包括“工作”的外观。
  • "如何编写带有 return 语句的 print_random_matrix 函数?"你希望它返回什么?
  • 我很想重新打开,因为根据 C 标准,示例及其行为有很大不同。

标签: c matrix return


【解决方案1】:

无法从具有非void 返回类型的函数返回值将调用undefined behavior

未定义行为的一种表现方式是程序似乎可以正常工作。然而,一个看似无关的变化可能会改变未定义行为的表现方式。在这种情况下,您永远不会尝试使用返回值,所以这可能就是您看不到任何奇怪行为的原因。

所以仅仅因为一个程序可能会崩溃或输出奇怪的东西并不意味着它会。

在这种特殊情况下,正确的做法是将函数的返回类型更改为void

编辑:

即使您未能从函数返回值,您的程序也可以正常工作,因为您没有尝试使用该返回值。如果您确实尝试使用返回值,然后您将调用未定义的行为。不过,您应该将函数更改为返回 void 或返回一些有意义的值。

【讨论】:

  • 从技术上讲,我认为未能返回值不是未定义的行为,除非调用者访问返回值,这里不是这种情况。
  • @Arkku 除非调用者访问返回值,否则返回值失败并不是未定义的行为 我似乎记得类似的事情。但是,我似乎无法在 C 标准中找到引用。
  • @Arkku - 你确实是对的。这是6.9.1p12
猜你喜欢
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 2017-09-23
  • 1970-01-01
相关资源
最近更新 更多