0

たぶんこれは悪いプログラミングのケースでした、しかしそれは6.0から11.1へのXLC++のアップグレードでそれ自身を明らかにしています。

コードは次のようになります:

     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

整数/戻り値の処理方法に変更はありましたか?

4

1 に答える 1

2

startAt = startAt++未定義動作です。未定義であるため、コンパイラーは、バージョン6.0の結果とバージョン11.1の別の結果のように、自由に結果を出すことができます。

;-)

GCCを使用すると、-Wsequence-point(または-Wall)はこの構成に対して警告を発します。XLCに同等の警告があるかどうかわからない。

于 2012-10-29T15:25:10.743 に答える