【问题标题】:does return statement actually return the value or store it in function?return 语句实际上是返回值还是将其存储在函数中?
【发布时间】:2016-05-23 16:44:18
【问题描述】:
#include <stdio.h>

int add(int a, int b)
{ return a+b;}

int main()
{
 printf("%d\n",add(7,9));
 return 0;
}

在上面的代码中, “add(int,int)”也是变量吗? 因为我们可以像变量一样打印它。

在添加功能中, return 语句是将值 (a+b) 存储到 "(*add) (int, int)" 还是只在调用函数时返回值?

如果函数存储返回值,那么如何找到存储返回值的内存位置?

【问题讨论】:

    标签: c function return-value


    【解决方案1】:

    在您的代码中,

     printf("%d\n",add(7,9));
    

    转换说明符%d 的参数是表达式 add(7,9) 的值。

    引用C11,第 6.5.2.2 章

    如果表示被调用函数的表达式具有指向函数的类型指针,返回一个 对象类型,函数调用表达式具有与该对象类型相同的类型,并且具有 根据 6.8.6.4.[...]

    中的规定确定的值

    在第 6.8.6.4 章中,我们可以看到,

    如果执行带有表达式的return 语句,则表达式的值为 作为函数调用表达式的值返回给调用者。

    现在,add(7,9) 是一个函数调用(函数调用 表达式),函数将被调用,函数的返回值将被视为参数。

    所以,不,"add(int, int)" 不是变量。

    【讨论】:

    • 您的 C 编译器可以选择将实际的机器代码汇编指令转储到文件中。如果启用此功能,然后在编辑器中打开文件,您将看到从函数返回的值通常会传递回处理器寄存器中的调用函数。这不能有地址,因为它不是内存。
    【解决方案2】:

    在C语言中存在左值和右值的概念。
    根据定义,左值是一个持续存在于单个表达式之外的对象,或者更简单地说是一个指向存储位置的值,可能允许为其分配新值。
    所有其他都是右值,一个临时值,不会在使用它的表达式之外持续存在。
    在您的情况下,函数 int add(int a, int b) 返回一个存在的右值,并且只能在使用它的表达式中使用。在您的情况下,printf().
    所有变量都是左值,因此使用赋值表达式为:

    int result = add(4, 5);
    

    将调用add()返回的右值保存到变量结果中,即左值。

    【讨论】:

      【解决方案3】:

      为了扩展弗兰基的答案,左值是可以分配的东西。这意味着它有一个地址。这与右值相反,右值不存在于使用它的表达式之外,因此没有地址。

      因为函数的返回值是一个右值,所以它没有地址。因此,为了回答您的问题,当您 return 时,它基本上只是将值返回到调用它的任何表达式,并且不会将其存储在任何地方。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-15
        • 2012-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-23
        相关资源
        最近更新 更多