调用具有本地静态变量的函数

3
假设我们有一个带有本地静态变量的最简单的函数:
int f()
{
    static int a = 0;
    return ++a;
}

让我们多次调用此函数并打印结果:

int main()
{
    int a  = f();
    int b  = f();
    std::cout<<a<<b;
}

输出结果为"12" - 没问题,符合预期。但这个调用

int main()
{
   std::cout<<f()<<f();
}

产生相反的顺序 - "21"。为什么?
2个回答

7
由于复合语句中函数执行顺序未定义。这意味着在 std::cout<<f()<<f() 语句的末尾,您保证已调用 f() 两次,并且已打印出两个结果,但是哪个结果先打印不是定义好的,并且可能因编译器而异。
之所以有区别是因为 f() 具有副作用。副作用是无法通过其返回值来衡量函数结果的结果。在这种情况下,副作用就是静态变量被修改了。如果该函数没有副作用(或者您正在调用多个没有重叠副作用的函数),那么先调用哪个函数都不会改变任何东西。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接