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; }
유사하다?
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; }
유사하다?
어떤 방법으로 컴파일러가 주먹을 실행합니까?
지침을 실행하는 컴파일러가 아니라 JVM입니다.
Java 프로그래밍 언어는 연산자의 피연산자가 JVM에 의해 왼쪽에서 오른쪽으로 평가된다는 것을 보장합니다. JLS Sec 15.7 :
Java 프로그래밍 언어는 연산자의 피연산자가 특정 평가 순서, 즉 왼쪽에서 오른쪽으로 평가되는 것으로 보입니다.
컴파일러가 컴파일 된 클래스에서 동등한 표현식의 순서를 재구성할지 여부는 "최적화"의 경우 일 수 있습니다. 이것들은 하나의 Java 버전에서 다른 버전으로 바뀔 수 있으므로 일반적으로 고려하지 않아야합니다.
당신은 컴파일러가 명령을 실행하지 않는다는 것이 맞지만, 평가 순서를 결정하는 컴파일러는 여전히 그렇다. (물론, 표준은 평가 순서를 결정하지만, JVM이 아닌 컴파일러의 표준을 구현한다.) . JVM은 위에서 아래로 컴파일러가 생성 한 순서대로 명령을 실행합니다. JVM 수준에서는 좌우가 없습니다. – sepp2k
달리 수정되지 않는 한 평가는 왼쪽에서 오른쪽입니다. 그래서이 경우 f (++ i)가 먼저 나옵니다.
EDIT : @sanA가 지적했듯이 컴파일러 최적화가있을 수 있습니다. 귀하의 경우에는 기능이 부작용으로 간주 될 가능성이 있기 때문에 불가능하지는 않습니다.
실행하여 보았습니까? 또는 프로그램을 디버그하려고합니까? – anacron
읽어보기 http://stackoverflow.com/questions/9081393/is-the-left-to-right-order-of-operations-guaranteed-in-java –
@ sanA의 링크는 읽기 아주 좋습니다. 귀하의 사례에 대한 제 답변은 사실이지만 다른 사람들에게는 해당되지 않을 수도 있습니다. – Malachi