【问题标题】:What happens when you call a function with return value without assigning it to any variable?当您调用具有返回值的函数而不将其分配给任何变量时会发生什么?
【发布时间】:2016-02-22 17:04:23
【问题描述】:
#include <stdio.h>
#include <stdlib.h>

int f(int x) {
    return x;
}

int main ( int argc,char * argv[]) {
    int a=4;
    f(a);
    printf("PASSED!\n");
    return 0;
}

当您调用f(a) 而不将其分配给任何东西时会发生什么?

【问题讨论】:

  • 什么都没有,返回值被忽略。这是你想知道的吗?
  • 同写10;
  • 考虑返回值,是的,但是调用函数的副作用是会有的,比如修改一个静态变量的值。
  • 写入4; 会导致编译器产生“没有效果的语句”警告。但是写作f(4) 没有任何警告。怎么会?
  • @AndrewHenle:考虑到a = b 是一个表达式,如果有这样的要求会很有趣。

标签: c function return-value


【解决方案1】:

当您调用具有返回值的函数而不将其分配给任何变量时会发生什么?

函数的返回值不需要被使用或赋值。它被忽略(通常是悄悄地)。

函数仍然执行并且它的副作用仍然发生。


考虑 3 个函数:int scanf()int f()int printf(),它们的返回值都被忽略,但函数仍被执行。

int a=4;
scanf("%d", &a);
f(a);
printf("PASSED!\n");

在健壮的代码中忽略返回值是不好的,尤其是scanf()


正如@Olaf 所评论的,某些编译器可能会启用警告。

有时用(void) 表示显式忽略函数的结果以消除该警告。

(void) f(a);

【讨论】:

  • 为什么在“在健壮的代码中忽略返回值是不好的,尤其是 scanf()。”中说尤其是scanf()?您的意思是来自stdio.h 库的实际scanf() 函数,或者您的意思是您的自定义函数,即int scanf()?提前致谢!
【解决方案2】:

使用您的示例,我们可以逐行查看它是如何评估的。从 main 开始。

int a=4;

我们现在有了一个值为 4 的变量 a

f(a);

所以现在函数 fa 调用,它的值为 4。所以在函数 f 中,第一个参数被命名为 x,它只返回那个参数 x

所以评价

f(a);

只是

4;

这样的程序可以编译并运行得非常好。

int main(int argv, char *argv[]) {
   1 + 1;
   return 0;
}

【讨论】:

    【解决方案3】:

    当你调用 f(a) 而不将它分配给任何东西时会发生什么?

    --> 没有根本

    当你调用一个函数(它有返回值)而不将它分配给任何东西时会发生什么?

    -->函数将被执行,要么像你的情况没有意义,要么像修改静态变量或全局变量一样有意义。返回值将被忽略。

    【讨论】:

      【解决方案4】:

      返回值通常会存储在寄存器中并且不会褪色。
      当编译器需要该寄存器时,它将被覆盖。

      如果函数是inline,编译器可能会检测到该值没有被使用,并完全忽略该值的计算。

      【讨论】:

        猜你喜欢
        • 2013-10-31
        • 1970-01-01
        • 2023-01-04
        • 1970-01-01
        • 1970-01-01
        • 2016-01-10
        • 1970-01-01
        • 2017-09-15
        • 2021-02-03
        相关资源
        最近更新 更多