c++ - XLC++ 11.1 的奇怪问题

标签 c++ aix xlc

也许这是一个糟糕的编程案例,但它在 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/

相关文章:

bash - 使用 Bash 计算 AIX 中两个日期之间的天数

c++ - apache 上的 ap_log_error 转储从 apache 2.4 开始

c - sprintf 的什么输入会产生 0 个结果?

c++ - 我如何在 Media Foundation 中正确配置 ASF 媒体接收器

java - 如何将健康中心连接到 AIX 上的 IBM J9 7

c++ - UUID生成器问题

gcc - 对于 gnu 和 ibm openmp 库,KMP_AFFINITY=verbose 等效吗?

c++ - 显式模板实例化在 XLC 上产生编译错误,但在其他编译器上有效

c++ - 如何获取屏幕的尺寸?

c++ - 通用(构建)系统上 C/C++ 标识符的最大长度是多少?