2011-11-11 7 views
2

次のプログラムが "4,4"ではなく "4,6"を出力する理由を説明してください。戻り値と出力パラメータの実行順序

MainProgram() 
{ 
    int x = 2; 
    int y = 0; 

    parse(4, out y); 
    Console.Write(y + ","); 
    y = y + parse(x, out y); 
    Console.Write(y); 
} 

int parse(int x, out int y) 
{ 
    y = x; 
    return y; 
} 

多くの感謝!

+2

FYI - Eric Lippertは、この正確な問題について素晴らしい投稿をしています。http://blogs.msdn.com/b/ericlippert/archive/2008/05/23/precedence-vs-associativity-vs-order.aspx "評価の順序"のセクションを参照してください) –

+4

なぜこのコードを最初に書くのは夢中ですか? –

+3

私は4,4が賢明な出力であると思っている理由を説明することをお勧めします。そしてあなたの間違いを指摘することができます。推論の連鎖が間違っているところ。 –

答えて

6

parseの2回目の電話に本当に関心があると思いますか?

+のオペランドは、左から右へ評価され、加算が行われ、最終的な代入が行われます。

このライン:

y = y + parse(x, out y); 

は論理的である:あなたを助ける

int lhs = y; 
// Now lhs = 4, x = 2, y = 4 
int rhs = parse(x, out y); 
// Now rhs = 2, x = 2, y = 2 
y = lhs + rhs; 
// Now y = 6 

していますか?

1

y + parse(x, out y)では、構文解析の呼び出し前のyの値が式評価の一部として取得されます。次に、事後にyの値を変更するparse(x、out y)が呼び出されます。したがって、式は4 + 2と評価されます。

0

ここには問題はありません。最初に4がyに割り当てられます。次に、parse()の戻り値から2が追加されます。結果6が最終的に再びyに割り当てられる。 最初に、 "+"が評価される前にyが評価され(4)、 "+"が評価された後にparse()されます(2)。最後に4 + 2がyに割り当てられます。