【问题标题】:What does it mean when a function does not return a value?函数不返回值是什么意思?
【发布时间】:2020-02-07 17:43:43
【问题描述】:

函数不返回值是什么意思?您如何在程序中说明这一点?那么一个函数如何执行任何有用的事情呢?没有返回值是什么意思?

【问题讨论】:

  • 在 Pascal 中有“过程”,它们基本上是不返回值的函数。无论如何,要使这样的函数有用,它需要引起一些副作用(即 - 修改一些全局变量、环境、执行一些 IO)。
  • 在 C 语言中,指针可用于修改传递的参数,而无需从函数返回值。 void 函数还可能执行其他任务,例如写入数据、暂停执行等......
  • 如果您可以用代码说明您的问题(如果没有代码,您的问题可能会关闭),我们更容易提供答案
  • 这个问题不是太专注,无法回答。函数的潜在影响包括返回值和 C 2018 5.1.2.3 2 中列出的副作用。所以这是一个简洁的问题,一个简洁的答案。

标签: c function


【解决方案1】:

函数的潜在影响包括:

  • 返回一个值。
  • 修改对象,包括函数可以通过指针访问的对象或具有外部链接的对象。
  • 访问 volatile 对象,如上所述。1
  • 修改文件(流)。

所以,如果一个函数没有返回值,它仍然可以修改一个对象,如:

void SetState(SomeStructure *S, int Value)
{
    S->State = Value;
}

或者它可以修改一个流:

void PrintValue(FILE *Stream, int Value)
{
    fprintf(Stream, "%d", Value);
}

您可以通过声明返回类型void 来告诉编译器函数不返回值。但是,C 标准也允许具有非void 返回类型的函数不返回值。例如,您可以拥有一个根据命令参数设置或获取值的函数:

int AccessState(int Command, SomeStructure *S,...)
{
    switch (Command)
    {
        case 0: // Get the state.
            return S->Value;
        case 1: // Set the state from the optional int parameter following S.
             va_list ap;
             va_start(ap, S);
             S->Value = va_arg(S, int);
             va_end(ap);
             break;
    }
}

在这种情况下,没有办法告诉编译器该函数有时不返回值,但您不需要这样做。但是,您应该告诉那些使用和阅读代码的人,该函数有时会执行,有时不会返回值,并在 cmets 或其他地方提供清晰的文档。

脚注

1 访问 volatile 对象是 C 程序执行 C 标准之外的事情的一种方式,例如向物理设备发送命令或数据。

【讨论】:

    【解决方案2】:

    函数不返回值是什么意思?

    这意味着该函数不会显式地向调用者返回值。

    你如何在程序中说明这一点?

    您可以通过为函数提供void 的返回类型来声明它。此返回类型向编译器表明该函数不返回值。

    那么一个函数如何执行任何有用的事情?

    它可以执行 §5.1.2.3 2 (ISO/IEC 9899:2011) 中规定的一种或多种副作用:

    访问易失性对象、修改对象、修改文件或调用执行任何这些操作的函数都是副作用,它们是执行环境状态的变化。表达式的求值 通常包括值计算和副作用的启动。左值表达式的值计算包括确定指定对象的身份。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      相关资源
      最近更新 更多