函数返回静态变量C ++

时间:2012-02-11 15:49:42

标签: c++ static

我无法理解为什么以下程序出错:

 int& getID(){
   static int r = 0;
   return r++;
 }

主:

 int main(){
   int a = getID();
   std::cout << "a=" << a << std::endl;
   return 0;
 }

为什么如上所述返回静态变量会产生问题而不会返回 想要的价值?

5 个答案:

答案 0 :(得分:7)

您正在使用后增量(r ++而不是++ r)。后增量的结果是暂时的,您试图返回对该临时值的引用。你不能这样做。如果要返回对r的引用,则可以使用预增量,或者只需执行增量,然后在单独的语句中返回r。

答案 1 :(得分:2)

您遇到的是未定义的行为。任何事情都可能发生。

r++返回一个临时的,它的UB通过引用返回临时值。

例如,在我的平台上,它甚至无法编译。

答案 2 :(得分:1)

它不会返回对r的引用,而是在r递增之前引用r++; return r; 的值。这可能在行动中失去了。

尝试

return ++r;

{{1}}

答案 3 :(得分:1)

让你的函数返回int而不是int &,一切都会好起来的。您想要返回新id的值,而不是对函数内部的引用。

答案 4 :(得分:0)

您应该阅读有关前缀和后缀运算符以及they are implemented

的内容

基本上,++i执行此操作(前缀):

i += 1;
return i;

i++做(后缀):

ans = i;
i += 1;
return ans;

根据提到的页面,只有前缀operator++返回对升级变量的引用。 Postfix(i++)返回新变量。