0

次の異常の理由は何ですか?

次の C プログラム (PstFixInc.c という名前) を検討してください。

#include <stdio.h>
int main (int argc, char *argv [])
{
  int num = 0;
  num = (num++) % 4;
  printf ("num: %d\n",num);
  return 0;
}

でコンパイルした場合gcc 4.8.1:

gcc -o PstFix.exe PstFixInc.c

そして実行すると、次の結果が得られます。

数: 0

Microsoft (R) C/C++ 最適化コンパイラ バージョン 18.00.21005.1 for x86 でコンパイルした場合

cl PstFixInc.c

そして実行すると、次の結果が得られます。

数: 1

4

3 に答える 3

4

これは未定義の動作です。

インターリーブシーケンス ポイントなしで、同じ変数に 2 回割り当てています。

于 2014-07-24T17:46:19.333 に答える
4

あなたが持っているのは未定義の動作ですnum。同じシーケンスポイント内に格納される値を決定する以外に、以前の値を変更して使用しています。これは、ドラフト C99 標準セクション6.5パラグラフ 2 でカバーされており、次のように述べられています。

前のシーケンス ポイントと次のシーケンス ポイントの間で、オブジェクトは格納された値を式の評価によって最大 1 回変更する必要があります。

また、未定義の動作の例が 2 つあります。

i = ++i + 1;
a[i++] = i;

最初のものはあなたの例にかなり似ています。even を使用clangすると、適切な警告が表示されます。

 warning: multiple unsequenced modifications to 'num' [-Wunsequenced]
  num = (num++) % 4;
  ~     ^
于 2014-07-24T17:46:49.070 に答える
0

この行:

num = (num++) % 4;

C 標準では未定義の動作です。コードが生成する結果はすべて「正しい」ものです。

于 2014-07-24T17:46:48.663 に答える