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

이 코드는 n을 6으로 계산하지만 4 일 것으로 생각했습니다. --x부터 선행 감소 연산자 및 */보다 우선 순위 나는 그것이 2*4x 같은 3*4 이미 감소 된 아니라 가정 그래서 2 * 4/2을 것을 가지고, 그래서 여기에 무엇을 놓치고? 동일한 질문에 here을 요청했지만 그 대답은 PHP에 따라 다릅니다. 우리가이 코드를 컴파일하고 ILDASM을 사용하여 검사하는 경우변수 할당 이전에 사전/사후 증가 연산자가 어떻게 작동합니까?

+0

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

+0

@kbunarjo 그 아무튼 내 질문에 대답하지 마라. –

+0

x는 - x에 도달하기 전에 이미 평가되었으므로 x는 여전히 3입니다. – kbunarjo

답변

2

, 우리는 다음과 같은 지침 (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를 호출 한 다음 이전 값 i로 메소드 G를 호출하고 마지막으로 메소드 을 호출하여 예제의 경우 H는 i의 새로운 값으로 호출됩니다. 이것은 연산자 우선 순위와 관련이 없으며 연산자 우선 순위와 관련이없는 입니다. '

+0

기능을 사용하지 않고 LTR 평가에 대한 예를 들어 주시겠습니까? –

+1

귀하의 예는 하나입니다. 피연산자는 LTR ('x' 다음에'y','-x')로 평가됩니다._operations_의 순서는 연산자 우선 순위에 따라 결정되지만 _operands_ 자체는 왼쪽에서 오른쪽으로 계산됩니다. –

+0

@ Stanley가 쓴 것은 정확히 내가 말하려고했던 것이 었습니다. 피연산자와 연산자에는 차이가 있습니다. 연산자 우선 순위는 피연산자가 처리되는 순서를 정의하지만 표현식을 처리하기 전에 표현식의 연산자와 상관없이 모든 피연산자가 왼쪽에서 오른쪽으로 계산됩니다. – mstaessen