我无法理解为什么以下程序出错:
int& getID(){
static int r = 0;
return r++;
}
主:
int main(){
int a = getID();
std::cout << "a=" << a << std::endl;
return 0;
}
为什么如上所述返回静态变量会产生问题而不会返回 想要的价值?
答案 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++
)返回新变量。