使用本地静态变量调用函数

时间:2013-12-20 23:28:08

标签: c++ function static-variables

假设我们使用局部静态变量具有最简单的函数:

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 个答案:

答案 0 :(得分:7)

因为未定义复合语句中执行函数的顺序。这意味着在std::cout<<f()<<f()行的末尾,您可以保证两次调用f(),并且您可以保证打印出两个结果,但是哪个结果首先未定义且可能会有所不同跨编译器。

存在差异,因为f()有副作用。副作用是无法通过其返回值测量的函数的结果。在这种情况下,副作用是修改静态变量。如果函数没有副作用(或者如果你调用多个没有重叠副作用的函数),那么首先调用哪个函数不会改变任何东西。

答案 1 :(得分:0)

之前已经提出/回答过:what is wrong here? associativity? evaluation order? how to change order?

并非所有运算符都是用C ++命令的。该链接有一个很好的解释。