return语句实际返回值还是将其存储在函数中?

时间:2016-02-12 13:47:30

标签: c function return-value

#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)”或者它只是在调用函数时返回值?

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

3 个答案:

答案 0 :(得分:2)

在您的代码中,

 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)"不是变量。

答案 1 :(得分:1)

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

int result = add(4, 5);

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

答案 2 :(得分:0)

为了扩展Frankie的答案,可以分配一个左值。这意味着它有一个地址。这与rvalue形成对比,rvalue在其使用的表达式之外不存在,因此没有地址。

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

相关问题