假设我们使用局部静态变量具有最简单的函数:
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”。为什么呢?
答案 0 :(得分:7)
因为未定义复合语句中执行函数的顺序。这意味着在std::cout<<f()<<f()
行的末尾,您可以保证两次调用f()
,并且您可以保证打印出两个结果,但是哪个结果首先未定义且可能会有所不同跨编译器。
存在差异,因为f()
有副作用。副作用是无法通过其返回值测量的函数的结果。在这种情况下,副作用是修改静态变量。如果函数没有副作用(或者如果你调用多个没有重叠副作用的函数),那么首先调用哪个函数不会改变任何东西。
答案 1 :(得分:0)
之前已经提出/回答过:what is wrong here? associativity? evaluation order? how to change order?
并非所有运算符都是用C ++命令的。该链接有一个很好的解释。