2012-01-02 11 views
3

可能性の重複:
Unexpected order of evaluation (compiler bug?)coutの<<演算子は、演算子の優先順位に関してどのように動作しますか?

私はこのプログラムの出力を予測することができませんでした:VS2008でコンパイルすると

#include<iostream> 
using namespace std; 

int *p(int *a) 
{ 
    (*a)++; 
    return a; 
} 
int main() 
{ 
    int i=0; 

    cout<<i++<<" "<<(*p(&i))++<<" "<<i++<<" "<<i<<endl; 
    return 0; 
} 

、それは3 2 0 4を出力します。誰もなぜそれが0 2 3 4ではないか説明できますか?

注:pへの関数呼び出しがないとうまくいきます。

ありがとうございます!

+5

はい、動作は定義されていません。あなた自身に尋ねるべき質問は、あなたがそのようなコードを書いておきたい理由です。答えはあなたがしないということです。 –

答えて

4

未定義の動作。何かできました。

良い説明はthis answerを参照してください。

+3

だから 'cout << x << y'はyを印刷してからx ?! – atoMerz

+0

それは優先事項に依存するものではありません!私が "p"と呼んでいないときになぜうまくいくのですか? – Khaledvic

+2

AtoMerZ:いいえ、これは未定義ではないためです。 @Khaledvic:「何でもできます」とは、「働く」ことができる(または現れる)ことを意味します。 –

0

ポイントは、coutの優先順位ではなく++演算子です。
このオペレータの副作用は、2つのシーケンスポイントの間でいつでも発生することができます。これは、ステートメント内のどこかを意味します。それが起こる正確な順序は、@ oli-charlesworthが言うように、未定義です。
coutの優先順位は左から右のため、一番左が最初に印刷されます。しかし、各数値の値は++の振る舞いに依存します。

+0

"勘定の優先順位は左から右です " - これは意味をなさない。 'cout'はオブジェクトであり、演算子ではありません。また、シーケンスポイントは実際には問題ではありません。問題は、 'operator <<'への引数の評価のシーケンスが指定されていないということです。 –

+0

実際、<<演算子の優先順位は、左から右であり、coutではありません。そして、私はシーケンスポイントがここで重要であると思います(「i ++ + i ++」と同じように)、評価の順序がより基本的かもしれませんが。しかし、私の主なポイントは、誰かがあなたの答えから誤って理解したように、優先順位をつけることではないということでした。 – ugoren

関連する問題