【问题标题】:Function calling at the left side of the expression表达式左侧的函数调用
【发布时间】:2018-07-15 17:36:01
【问题描述】:

我们可以在表达式的左侧调用一个函数吗? 此代码 sn-p 运行良好,但如何? function calling 怎么能在左边,请详细说明这个 sn-p 是如何执行和运行良好的,如果我不会在函数定义中使用 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;
}

【问题讨论】:

  • fun() 不是函数声明。这是一个函数调用,它本身就是一个表达式。由于这个特定的调用返回一个左值,所以它出现在赋值的左侧是非常好的。您可能想查看您最喜欢的 C++ 教科书中有关参考的章节。
  • 如果您不使用static int,那么该行代码将只是x;,这将是一个语法错误。我想我不明白你的这部分问题。
  • @Igor Tandetnik,很抱歉把它写成函数声明,但是一个函数调用怎么能接受一些东西,它可以返回但它怎么能接受。以及为什么当我从变量 x 的声明中删除 static 时出现语法错误,抱歉给您带来不便,我是 C++ 的新手。
  • @Shivanshu“调用函数如何接受某些东西”表明您对分配的工作方式有一个不正确的模型。函数调用不接受任何东西。该函数返回某个对象在内存中的位置。函数调用到此结束。它是 main 然后对那个对象做一些事情(即,分配给它)。
  • 了解引用的工作原理。注意函数返回类型上的&amp;

标签: c++ function static


【解决方案1】:

任何返回非 const lvalue 的表达式都可以在 assignment 的左侧,并且函数调用也像其他任何表达式一样。由于 lvalue 在历史上意味着 - 左侧的值 这变成了递归定义。因此,您可以考虑一个 lvalue 任何您可以获取地址的东西:

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

【讨论】:

  • 很好的解释,感谢消除我对左值的怀疑。