我的环境是vs2013-update-5,我发现我的代码在调试和发布之间有不同的结果,例如:
#include <iostream>
#include <string>
using namespace std;
int increase(int* x) {
int previous = *x;
*x += 1;
return previous;
}
int main() {
int data = 1;
int p = 2;
cout << ((p-data) + increase(&p)) << endl;
}
在调试模式下打印 3 ,在发布模式下打印 4 。我知道那里的解决方法如下:
int x = p-data;
int y = increase(&p);
cout << (x + y) << endl;
使用一些临时变量来确保结果。但在我的实际情况中,代码用于解析一些缓冲区到struct,有很多长度检查,如:
if((p-data) + 4 + forward<int>(&p) != data_len) return false;
// forward<unsigned>() increases p with sizeof(int), and return origin p
// just like the previous example
所以最好用一行代码编写,而不是使用临时变量。
为什么会这样?任何编译标志都会导致此问如何确保代码按顺序执行?