也许这是一个糟糕的编程案例,但它在 XLC++ 从 6.0 升级到 11.1 时表现出来
代码如下:
int startAt = 140;
startAt = parseAndSaveResponseINSTANTID_MODEL(response, startAt);
COUT << "After tokenize INSTANTID_MODEL startAt=" <<startAt <<ENDL;
startAt = startAt++;
startAt = parseAndSaveResponseINSTANTID_CHRON_HISTORY(response, startAt);
COUT << "After tokenize INSTANTID_MODEL startAt=" <<startAt <<ENDL;
startAt = startAt++;
startAt = parseAndSaveResponseINSTANTID_FOLLOWUP_ACTION(response, startAt);
COUT << "After tokenize TSTID_INSTANTID_FOLLOWUP_ACTION startAt=" <<startAt <<ENDL;
startAt = startAt++;
startAt = parseAndSaveResponseINSTANTID_RISK_INDICATOR(response, startAt);
COUT << "After tokenize TSTID_INSTANTID_RISK_INDICATOR startAt=" <<startAt <<ENDL;
在每个解析方法中,我们执行一个return (startAt + 1 + vRows * 81);
vRows 在所有方法中都是零。
使用旧编译器,输出如下:
After tokenize INSTANTID_MODEL startAt=141
vRows=0
After tokenize INSTANTID_MODEL startAt=142
vRows=0
After tokenize TSTID_INSTANTID_FOLLOWUP_ACTION startAt=143
vRows=0
After tokenize TSTID_INSTANTID_RISK_INDICATOR startAt=144
但是,使用新的编译器,输出看起来像
After tokenize INSTANTID_MODEL startAt=141
vRows=0
After tokenize INSTANTID_MODEL startAt=143
vRows=0
After tokenize TSTID_INSTANTID_FOLLOWUP_ACTION startAt=145
vRows=0
After tokenize TSTID_INSTANTID_RISK_INDICATOR startAt=147
处理整数/返回值的方式有变化吗?
最佳答案
startAt = startAt++
是 undefined behaviour .因为它是未定义的,所以编译器可以自由地给出它想要给出的任何结果,例如 6.0 版中的这个结果和 11.1 版中的另一个不同的结果。
;-)
使用 GCC,-Wsequence-point
(或 -Wall
)会针对此构造发出警告。不确定 XLC 中是否有等效警告。
关于c++ - XLC++ 11.1 的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13124121/