2

プログラムがコンパイルされない理由を理解しようとしていますが、

int myfunction(int x)
{
   return x;
} 

int main(){
  int x = 10;
  int result=0;
  result=myfunction(x) * myfunction(++x);
  printf("Result is = %d", result);
}

実行後、エラーとして扱われる警告が表示されます 関数 'int main()' 内: 'x' の操作は未定義の可能性があります。誰かがアイデアを持っていますか?

4

4 に答える 4

1

あなたのコードは「未定義の動作」を使用しました。

C および C++ 標準では、 と を評価する順序は規定 (または定義) されていxませ++x myfunction(x)myfunction(++x)。結果が 121 または 110 (またはまったく別のもの) であると予想しますか? これらの値は両方とも完全に有効な結果であるため、両方の結果が得られても同じように満足しますか? それとも、一方が他方よりも「より正確」だと思いますか?

コンパイラは、このコードが可能な結果 (「不可能」と思われるものを含む可能性があります) と別のコンパイラ (または現在の別の設定/バージョン) のどちらを好むかを生成することを期待できないことを警告しています。コンパイラ) は異なる値になる場合があります。

于 2013-06-17T12:15:45.640 に答える
0

++ 演算子には、ステートメントを未定義にする副作用があります。

あなたはこのようにすることができます:

    result = myfunction(x) * myfunction(x + 1);

    ++i; /* or i++ in this case, doesnt matter */

    printf("Result is = %d", result)
于 2013-06-17T12:27:35.967 に答える