-2

このプログラムを実行すると、2として出力されます

#include<iostream.h>
#include<conio.h>
void main(){
    clrscr();
    int a = 10;
    int c = a-- - --a;
    cout<<c;
    getch();
}

...しかし私がそれを変更するとき

#include<iostream.h>
#include<conio.h>
void main(){
    clrscr();
    int a = 10,c;
    c = a-- - --a;
    cout<<c;
    getch();
}

...出力0を取得します。なぜですか?Javaでは、両方とも2として出力されました。C++の何が問題になっていますか?説明 :(

4

2 に答える 2

3

C ++には何の問題もありませんが、C++の使用方法に問題があります。

a-- - --aはC++で未定義の動作をしており、何でも起こり得ます。

最もクリーンな解決策は、そのようなコードを書かないことです(合法であっても書きません)。

于 2012-07-11T09:47:47.313 に答える
1

Luchianの答えについて少し詳しく説明します。C ++では、式内で部分式が評価される順序は指定されていません。これは、次の式で次のことを意味します。

int c = a-- - --a;

2つの同等に有効な評価オーダーがあります。

  1. a--最初に評価し(returns 10)、次に--a(returns 8)、次に減算します(returns 2)。
  2. --a最初に評価し(returns 9)、次に a--(returns 9)、次に減算します(returns 0)。

これは、コンパイラーの最適化の機会を改善することを目的としています。当然、これは、コンパイラがどの順序を選択するかを知る方法がないため、C++では評価順序に依存する式を使用するのは間違いであることを意味します。効率とエラー回避の間のトレードオフは、C++とJavaで異なります。

于 2012-07-11T09:56:35.053 に答える