2017-03-17 5 views
0
int i = 10, j = 5, k; 

k = f(++i) + g(++i) + j+ 25; 

f(++i) 또는 g(++i)이 먼저 계산됩니까?어떤 컴파일러가 먼저 실행됩니까?

프로그램을 실행하지 않고 어떻게 알 수 있습니까?

f 가정 및 순서 변경이 컴파일러에 따라 않는 방법 g

int f(int a) 
{ return a; } 

유사하다?

+4

실행하여 보았습니까? 또는 프로그램을 디버그하려고합니까? – anacron

+0

읽어보기 http://stackoverflow.com/questions/9081393/is-the-left-to-right-order-of-operations-guaranteed-in-java –

+0

@ sanA의 링크는 읽기 아주 좋습니다. 귀하의 사례에 대한 제 답변은 사실이지만 다른 사람들에게는 해당되지 않을 수도 있습니다. – Malachi

답변

1

어떤 방법으로 컴파일러가 주먹을 실행합니까?

지침을 실행하는 컴파일러가 아니라 JVM입니다.

Java 프로그래밍 언어는 연산자의 피연산자가 JVM에 의해 왼쪽에서 오른쪽으로 평가된다는 것을 보장합니다. JLS Sec 15.7 :

Java 프로그래밍 언어는 연산자의 피연산자가 특정 평가 순서, 즉 왼쪽에서 오른쪽으로 평가되는 것으로 보입니다.

컴파일러가 컴파일 된 클래스에서 동등한 표현식의 순서를 재구성할지 여부는 "최적화"의 경우 일 수 있습니다. 이것들은 하나의 Java 버전에서 다른 버전으로 바뀔 수 있으므로 일반적으로 고려하지 않아야합니다.

+0

당신은 컴파일러가 명령을 실행하지 않는다는 것이 맞지만, 평가 순서를 결정하는 컴파일러는 여전히 그렇다. (물론, 표준은 평가 순서를 결정하지만, JVM이 아닌 컴파일러의 표준을 구현한다.) . JVM은 위에서 아래로 컴파일러가 생성 한 순서대로 명령을 실행합니다. JVM 수준에서는 좌우가 없습니다. – sepp2k

0

달리 수정되지 않는 한 평가는 왼쪽에서 오른쪽입니다. 그래서이 경우 f (++ i)가 먼저 나옵니다.

EDIT : @sanA가 지적했듯이 컴파일러 최적화가있을 수 있습니다. 귀하의 경우에는 기능이 부작용으로 간주 될 가능성이 있기 때문에 불가능하지는 않습니다.

관련 문제