MSVC和GCC对某种for循环编译结果不同的记录

  • 二月 01,2019
  • Coding

今天写了一个小的cpp程序,用gcc编译后结果总是不正确,由于自己对gdb不是很熟悉,就用visual studio重新编译了一遍,打算用vs调试一下定位问题。万万没想到,程序在vs里的结果是完全正确的。因此,快速学习了一下gdb,定位到了出问题的地方,是一个简单的for循环,而MSVC和GCC的编译结果竟然是不一样的。但原因还不明确,因此先记录一下,以便后续研究。

具体来说,编译结果不一样的是这样一句:

for (int i = 0; i < 6; B[i] = elem[i++]);

MSVC中,是先将elem[i]赋给B[i],然后再执行i++;而GCC中,是先执行的i++,然后将elem[i]赋给B[i],下面是一个复现的程序段:

#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编译执行的结果如下:

VS2015的编译执行结果如下:

CONTACT