我们可以在表达式的左侧调用一个函数吗?
此代码段效果很好,但是如何? function calling
怎么能在左侧,请详细说明此代码段如何执行和正常工作,如果我在函数定义中不使用static int
怎么办。谢谢!
#include<iostream>
using namespace std;
int &fun()
{
static int x;
return x;
}
int main()
{
fun() = 10;
/* this line prints 10 on screen */
printf(" %d ", fun());
getchar();
return 0;
}
答案 0 :(得分:3)
任何返回非常量左值的表达式都可以位于赋值的左侧,并且函数调用也是与其他表达式一样的表达式。由于 lvalue 在历史上的确切含义是-左侧的 value 变成了递归定义。因此,您可以考虑使用左值可以接收的地址:
int x = 5;
&x; //valid, takes the address of the variable
&5; //invalid, integer literal has no address
int func1();
&func1(); //invalid, can't take the address of the temporary value
int &func2();
&func2(); //valid, since the function returned reference
//which itself is almost the same as the address
因此,可以将导致可寻址的任何表达式分配给该表达式。您甚至可以执行以下操作:
int x = 0;
int y = 0;
int z = 5;
(z > 5 ? x : y) = 10;
关于第二个问题,如果从函数中删除static
,则将返回对该函数的局部变量的引用。函数退出时,局部变量将停止存在,因此您将返回对已被破坏的变量的引用。但是,它将编译并运行,但是执行的结果将是不可预测的,这就是为什么将其称为未定义行为。