Loading... 今天写了一个小的cpp程序,用gcc编译后结果总是不正确,由于自己对gdb不是很熟悉,就用visual studio重新编译了一遍,打算用vs调试一下定位问题。万万没想到,程序在vs里的结果是完全正确的。因此,快速学习了一下gdb,定位到了出问题的地方,是一个简单的for循环,而MSVC和GCC的编译结果竟然是不一样的。但原因还不明确,因此先记录一下,以便后续研究。 具体来说,编译结果不一样的是这样一句: ```cpp hljs for (int i = 0; i < 6; B[i] = elem[i++]); ``` MSVC中,是先将elem[i]赋给B[i],然后再执行i++;而GCC中,是先执行的i++,然后将elem[i]赋给B[i],下面是一个复现的程序段: ```cpp hljs #include "iostream" using namespace std; int elem[6] = {1, 5, 2, 9, 10, 22}; int main(int argc, char const *argv[]) { int* B = new int[6]; int* C = new int[6]; cout << "Origin array:" << endl; for (int i = 0; i < 6; ++i) cout << elem[i] << endl; for (int i = 0; i < 6; B[i] = elem[i++]); cout << "After first method:" << endl; for (int i = 0; i < 6; ++i) cout << B[i] << endl; for (int i = 0; i < 6; i++) C[i] = elem[i]; cout << "After second method:" << endl; for (int i = 0; i < 6; ++i) cout << C[i] << endl; return 0; } ``` GCC编译执行的结果如下: ![](http://cdn.lxalxy.com/blog/20190201/CmfiL8m8niio.png) VS2015的编译执行结果如下: ![](http://blog.lxalxy.com/usr/uploads/2021/03/2222075415.png) © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏