也许这是一个糟糕的编程案例,但随着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
处理整数/返回的方式有变化吗?
发布于 2012-10-29 23:25:11
startAt = startAt++
是undefined behaviour。因为它是未定义的,所以编译器可以自由地给出它想给出的任何结果,就像6.0版中的这个结果和11.1版中的不同结果。
;-)
对于GCC,-Wsequence-point
(或-Wall
)将对此构造发出警告。不确定XLC中是否有相同的警告。
https://stackoverflow.com/questions/13124121
复制相似问题