让我们来看看这最后一行是如何工作的更详细。首先,编译器将启动一个与x(5)相同的值的x的临时副本。然后它将原来的x从5增加到6。然后编译器评估临时副本,该副本计算为5,并将该值赋给Y。然后将临时副本丢弃。
因此,Y结束了5的值,x结束的值为6。
在第三行中,x和y是递增/递减之前,他们的评价,所以他们的新值打印由cout。在第五行,一个原始值的临时副本(x = 6,y = 4)发送给cout,然后原来的x和y是递增的。这就是为什么从后缀式操作符的结果没有改变到下一行。
规则:有利于后递增和后递减的预增量和预减量。前缀版本不仅更加高效,你就不太可能遇到奇怪的问题。
副作用
一个函数或表达式被称为有一个副作用,如果它修改一些状态(例如,在内存中的任何存储信息),输入或输出,或调用有副作用的其他功能。
大部分时间,副作用是有用的:
因此,Y结束了5的值,x结束的值为6。
这里是另一个例子显示的差异之间的前缀和后缀版本:
int x = 5, y = 5;
cout << x << " " << y << endl;
cout << ++x << " " << --y << endl; // prefix
cout << x << " " << y << endl;
cout << x++ << " " << y-- << endl; // postfix
cout << x << " " << y << endl;
在第三行中,x和y是递增/递减之前,他们的评价,所以他们的新值打印由cout。在第五行,一个原始值的临时副本(x = 6,y = 4)发送给cout,然后原来的x和y是递增的。这就是为什么从后缀式操作符的结果没有改变到下一行。
规则:有利于后递增和后递减的预增量和预减量。前缀版本不仅更加高效,你就不太可能遇到奇怪的问题。
副作用
一个函数或表达式被称为有一个副作用,如果它修改一些状态(例如,在内存中的任何存储信息),输入或输出,或调用有副作用的其他功能。
大部分时间,副作用是有用的:
1
2
3
4
5
6
7
8
9
10
11
12
13
int add(int x, int y)
{
return x + y;
}
int main()
{
int x = 5;
int value = add(x, ++x); // is this 5 + 6, or 6 + 6? It depends on what order your compiler evaluates the function arguments in
std::cout << value; // value could be 11 or 12, depending on how the above line evaluates!
return 0;
}