#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)”或者它只是在调用函数时返回值?
如果函数存储返回值,那么如何找到存储返回值的内存位置?
答案 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
时,它基本上只是将值返回到它所调用的任何表达式,并且不会将它存储在任何地方。