2013-09-26 2 views
0
"스칼라 프로그래밍"책에서

(마틴 오더 스키, 제 2 판)에 그들은이 연산자 우선 순위 테이블 (여기을 완료 할)을 얻었다 :연산자 우선 순위 및 | 스칼라

*/% 
+ - 
: 
= ! 
< > 
& 
^ 
| 

그래서 경우의 첫 번째 문자 연산자는이 테이블에서 다른 연산자의 첫 번째 문자 인 이전 연산자가 먼저 평가된다는 높은 위치에 있습니다.

가에 따르면,이 코드는 yy를 인쇄해야하지만 x를 출력 :

def x() = { print('x'); true } 
def y() = { print('y'); true } 

x || y && y  // prints `x` but should `yy` 

나의 이해는 그 & 테이블에서 높은 경우 그 | 인 경우 먼저 평가해야합니다. *+보다 우선합니다. 따라서 x + y * y에 마지막 문장이 먼저 평가됩니다.


편집 : 그들 표에 따라 권리 그러나 "로 해결할 수있는 문제"왼쪽에서 그들을 평가처럼

는 또한이 코드를

def x() = { print('x'); 1 } 
def y() = { print('y'); 3 } 

x == x + y * y  // xxyy 

봐 봐.

+0

두 번째 경우에는'x'와'y'가'Int'가되고 부울의 경우에는 다른 평가 모델을 사용하기 때문에 – 4lex1v

+0

'|'은'||'와 같지 않으며 책에서 제공하지 않습니다 논리적 피연산자의 우선 순위 나는'&&'가 여전히'||'보다 높지만 여기서 작업에서 단락이 발생하는 자바와 같은 우선 순위가 사용된다고 가정합니다. Java는 'x'도 인쇄합니다. – maksimov

답변

2

그것은 왼쪽 부분을 반환 true의 경우, 오른쪽 부분이 계산되지 xtrue 호출이 반환 x() 때문에 || 논리 연산자의 경우 인쇄합니다. 그 왼쪽 부분이 오른쪽 부분이

부울와

예 업데이트

을 평가됩니다 true 경우에도 다음 |을 사용하여 계산하기 때문에 그래서 "단락"평가라는 논리 값을 가진 경우에 좋지 않다 가 사용되고 왼쪽 칸이 true이면 scalac은 심지어 or 표현의 두 번째 부분을 보지 않을 것입니다.

def || (a: => Boolean) = ??? 
+0

나는 그것을 알고 있지만 설명하지는 않는다. 저를 위해 ** ** ** ** ** ** ** ** ** **을 보지 말았어야합니다. – Graduate

+0

@ 대학원 설명에 따르면, 부울 연산자가 스칼라에서 단락 회로 평가를 사용하기 때문에 일반적으로 좋은 예는 아닙니다. 스칼라는 왼쪽이 참이면 올바른 부분을 보지 않을 것입니다. – 4lex1v

3

원시 버전 : 우선 순위가

적용 : 같은이 작업의 생각. (참고, 우선 순위는 그것이 (x || y) && y 될 것이라고 반전 된 경우)

x || (y && y) 

이제이전에 (y && y)이 평가 될 것으로 예상됩니다.이지만 스칼라는 항상 왼쪽에서 오른쪽으로 평가합니다 (language spec의 §6.6 참조). 그리고 다른 사람들이 언급했듯이 ||은 단락 연산자이므로 첫 번째 피연산자가 true를 반환하면 두 번째 피연산자도 평가되지 않습니다.

그것을 생각하는 또 다른 방법은 두 가지 방법은 모두의 두 번째 피연산자이고, 호출과 같다 패스에 의해 이름 : 왼쪽에서 오른쪽으로 평가 모델에서

or (x, and(y, y)) 

def or(a: Boolean, b: => Boolean): Boolean = if (a) true else b 
def and(a: Boolean, b: => Boolean): Boolean = if (!a) false else b 

, x은 항상 먼저 y 두 번 평가됩니다. 아직 수행하지 않은 경우 그가 강의 1 또는 2

두 번째 예에서 아주 대상이에 대해 이야기 곳

, 당신은 에 마틴 오더 스키의 함수형 프로그래밍 코스를 따라 수있는 것은

add(x, mult(y, y)) 

def add(a: Int, b: Int) = a + b 
def mult(a: Int, b: Int) = a * b 
에 해당

x이 항상 먼저 계산 된 다음 y이 두 번 평가됩니다.

+1

여기서 중요한 오해는 OP가 * 연산자 우선 순위 *가 * 평가 순서 *에 해당한다고 가정한다는 것입니다. – Impredicative