带标准输出的运算符 ++ 在 C/C++ 中给出意外结果
Operator ++ with stdout giving unexpected result in C/C++
在学校学习C++的时候,当我们学习C++中的运算符++时,我们知道++c和c++是不同的。
当我们使用这种代码对此进行更多测试时:
#include <iostream>
using namespace std;
int main(){
int c=10;
cout<<++c<<" "<<c++<<endl;
return 0;
}
为什么上面的代码在 C++ 中给出了 12 和 10 的输出?
计算机(我们用 cout 和 printf 测试,我们也试过 VC++ 和 g++)给我:
12 10
"cout" 和 "printf" 都给出了相同的结果。
但是我们在计算中测试的时候,结果是可以的。
#include <iostream>
using namespace std;
int main(){
int c=10;
int r=++c^c++;
cout<<r<<endl;
return 0;
}
上面的源代码给了我 0 这意味着当上面的 XOR 操作执行时,左侧 (++c) 和右侧 (c++) 为 XOR 运算符提供相同的值,即 11(我们得到值11 通过用 11 替换 c++ 和计算机给出相同的结果 0).
这真的是有线的。有人注意到了吗?
顺便说一句,我们在 Windows 和 Lubuntu 中都在调试模式和发布模式下进行了测试。所以我们认为这与标准库有关。但是我们并不期望我们可以将 stdlib 作为 NOOB 来阅读。所以希望有人能找到原因或解决办法。
代码int r=++c^c++;是未定义的行为,不应该使用,永远不会。序列点之前不能修改变量两次。
在学校学习C++的时候,当我们学习C++中的运算符++时,我们知道++c和c++是不同的。
当我们使用这种代码对此进行更多测试时:
#include <iostream>
using namespace std;
int main(){
int c=10;
cout<<++c<<" "<<c++<<endl;
return 0;
}
为什么上面的代码在 C++ 中给出了 12 和 10 的输出?
计算机(我们用 cout 和 printf 测试,我们也试过 VC++ 和 g++)给我:
12 10
"cout" 和 "printf" 都给出了相同的结果。
但是我们在计算中测试的时候,结果是可以的。
#include <iostream>
using namespace std;
int main(){
int c=10;
int r=++c^c++;
cout<<r<<endl;
return 0;
}
上面的源代码给了我 0 这意味着当上面的 XOR 操作执行时,左侧 (++c) 和右侧 (c++) 为 XOR 运算符提供相同的值,即 11(我们得到值11 通过用 11 替换 c++ 和计算机给出相同的结果 0).
这真的是有线的。有人注意到了吗?
顺便说一句,我们在 Windows 和 Lubuntu 中都在调试模式和发布模式下进行了测试。所以我们认为这与标准库有关。但是我们并不期望我们可以将 stdlib 作为 NOOB 来阅读。所以希望有人能找到原因或解决办法。
代码int r=++c^c++;是未定义的行为,不应该使用,永远不会。序列点之前不能修改变量两次。