2016-12-28 9 views
0
int x=3, y=4, n=0; 
int n = x * y/--x; 

このコードでは、nは6と計算されていますが、私は4と考えました。 --xはプリデクリメント演算子であり、*/よりも優先順位が高いので、それは2 * 4/2だろうので、私はそれが2*4だとない3*4xとしてすでに減らされているので、私はここで何をしないのですか?仮定しましたか同じ質問にはhereと尋ねましたが、答えはPHP固有のものでした。変数割り当て前にプリ/ポストインクリメント演算子はどのように動作しますか?

+0

http://stackoverflow.com/questions/2371118/how-do-the-post-increment-i-and-pre-increment-i-operators-work-in-java – kbunarjo

+0

@kbunarjoそれは」doesnの私の質問に答えてください。 –

+0

xは--xになる前に評価されているので、xはまだ3です。 – kbunarjo

答えて

2

私たちは、このコードをコンパイルしてからILDASMを使用して、それを検査した場合、我々は次の手順(https://en.wikipedia.org/wiki/List_of_CIL_instructionsを使用して翻訳された)を取得:

IL_0000: nop   // I compiled in debug mode, this does nothing 
IL_0001: ldc.i4.3  // Push 3 onto the stack as int32. 
IL_0002: stloc.0  // Pop a value from stack into local variable 0. 
IL_0003: ldc.i4.4  // Push 4 onto the stack as int32. 
IL_0004: stloc.1  // Pop a value from stack into local variable 1. 
IL_0005: ldloc.0  // Load local variable 0 onto stack. 
IL_0006: ldloc.1  // Load local variable 1 onto stack. 
IL_0007: mul   // Multiply values. 
IL_0008: ldloc.0  // Load local variable 0 onto stack. 
IL_0009: ldc.i4.1  // Push 1 onto the stack as int32. 
IL_000a: sub   // Subtract value2 from value1, returning a new value. 
IL_000b: dup   // Duplicate the value on the top of the stack. 
IL_000c: stloc.0  // Pop a value from stack into local variable 0.  
IL_000d: div   // Divide two values to return a quotient or floating-point result. 
IL_000e: stloc.2  // Pop a value from stack into local variable 2. 
IL_000f: ret   // Return from method, possibly with a value. 

これは、式がさえ--x先行かかわらず、左から右に評価されていることがわかります*および/

これは、C#言語仕様(セクション7.3演算子)に記載されている:

式の演算子の評価の順序は演算子(の 優先順位と結合することによって決定される§7.3.1 )。

式のオペランドは左から右に評価されます。 の例では、F(i)+ G(i ++)* H(i)では、メソッドFが古い の値を使用して呼び出され、メソッドGが古い値iで呼び出され、最後にメソッド Hはiの新しい値で呼び出されます。これはオペレータの優先順位とは無関係の別個の です。

+0

機能を使用しないLTR評価の例を挙げてください。 –

+1

あなたの例は1つです。オペランドはLTR( 'x'、次に' y'、次に '-x')で評価されます。_operations_の順序は演算子の優先順位によって決まりますが、_operands_自体は左から右に評価されます。 –

+0

スタンリーが書いたことは、まさに私が言うつもりでした。オペランドと演算子には違いがあります。演算子の優先順位は、オペランドの処理順序を定義しますが、式を処理する前に、式の演算子に関係なく、すべてのオペランドが左から右に評価されます。 – mstaessen

関連する問題