在表达式左侧调用的函数

时间:2018-07-15 17:36:02

标签: c++ function static

我们可以在表达式的左侧调用一个函数吗? 此代码段效果很好,但是如何? 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;
}

1 个答案:

答案 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,则将返回对该函数的局部变量的引用。函数退出时,局部变量将停止存在,因此您将返回对已被破坏的变量的引用。但是,它将编译并运行,但是执行的结果将是不可预测的,这就是为什么将其称为未定义行为