화살표 (->) 연산자 우선 순위 / 우선 순위가 가장 낮거나 지정 / 결합 된 우선 순위가 가장 낮습니까?


18

JLS :

- (>)는 낮은 우선 운영자는 람다 식의 화살표이고 , 다음 할당 사업자.

어느 방향 (우선 순위 증가, 우선 순위 감소)을 따랐습니까? - "팔로우"는 할당이 우선 순위가 높거나 우선 순위가 낮다는 것을 의미합니다 (화살표 연산자와 관련하여)? "가장 낮은"(화살표의 경우)은 절대적으로 가장 낮기 때문에 증가하고 있다고 생각합니다.

내가 이해하는 것처럼 화살표 (->)는이 Princeton 연산자 우선 순위 테이블의 맨 아래 (모든 할당 연산자 아래에 있음)에 있어야 하므로 화살표 (->)의 우선 순위 수준은 0입니다 (표 당).

이해가 정확합니까?

ExamTray 는 화살표 우선 순위가 할당과 적어도 동일하다고 말하고 있습니다. 또한 화살표 연관성이 왼쪽-> 끝-> 오른쪽 (할당과 달리)임을 분명히했습니다. 화살표 연관성에 대한 JLS 인용문을 찾지 못했습니다.

저는 항상 과제 우선 순위가 주로 이유로 가장 낮다고 생각했습니다.


5
The lowest precedence operator is the arrow of a lambda expression.
Kayaman

2
예, 이해가 정확합니다.
Eran

4
경우 ->낮은입니다 동부 표준시 , 할당 연산자는 낮은 수 없습니다 우선합니다.
Andy Turner

IntFunction fo = a->b->a-b; // in test ->의 우선 순위 / 연관성을 의미합니다. 그래서 나는 확실하지 않기 때문에 전체 우선 순위 / 연관 표에서-> 우선 순위 / 연관성을 명확히하기로 결정했습니다.
코드 완료

1
@glglgl 당신의 예가 IntUnaryOperator op; op = x -> x;흥미 롭습니다. 프로덕션 의 유효한 인스턴스가 아니기 (op = x) -> x때문에 아마도 고려 op = x되지 않았 LambdaParameters습니까?
Andy Turner

답변:


13

인용 된 JLS 텍스트 앞에 나오는 문장에 유의하십시오 .

연산자 간의 우선 순위는 문법 제작 계층 구조로 관리됩니다.

Java 언어의 문법에 따라 연산자 우선 순위에 따라 어떤 구조가 가능한지 암시 적으로 결정됩니다.

상태를 연결 한 프린스턴 테이블 조차도 :

Java 언어 사양에는 명시적인 연산자 우선 순위 테이블이 없습니다. 웹과 교과서의 다른 테이블은 약간의 사소한 방식으로 동의하지 않습니다.

따라서 Java 언어의 문법은 대입 연산자의 왼쪽에 람다 식을 허용하지 않으며 마찬가지로의 왼쪽에 대입을 허용하지 않습니다 ->. 따라서 이러한 연산자 사이에 모호성이 없으며 우선 순위 규칙은 JLS에 명시 적으로 언급되어 있지만 의미가 없습니다.

이를 통해 모호함없이 예를 들어 gem을 컴파일 할 수 있습니다.

static Consumer<String> C;
static String S;
public static void main(String[] args)
{
  Runnable r;
  r = () -> C = s -> S = s;
}

10

먼저 실제 문제를 설명하겠습니다.

다음과 같은 정의가 있다고 가정

IntUnaryOperator op;

다음은 구문 상 허용되며 예상대로 작동합니다.

op = x -> x;

int, op변수 에 항등 함수가 할당되어 있습니다. 그러나 =우선 순위가 높은 경우 Java가이를 다음과 같이 해석 할 것으로 예상합니다.

(op = x) -> x;

구문 상 유효하지 않으므로 컴파일 오류 여야합니다. 따라서 실제로 과제는 화살표보다 우선 순위가 높지 않습니다.

그러나 다음도 괜찮습니다 ( t유형의 클래스 / 인스턴스 변수 라고 가정 int).

op = x -> t = x;

이 함수는 컴파일되고 함수가 적용되면 피연산자 값을 할당하고 t반환합니다.

즉, 화살표가 과제보다 우선 순위가 높지 않습니다 t = x. 그렇지 않으면 다음과 같이 해석되었을 것입니다.

op = ( x -> t ) = x

분명히, 이것은 일어나지 않습니다.

따라서 작업의 우선 순위가 동일한 것 같습니다. 게다가, 그들은 오른쪽 결합이라는 것입니다. 이것은 JLS 19 장의 문법에서 암시됩니다 .

Expression:
  LambdaExpression
  AssignmentExpression

LambdaExpression:
  LambdaParameters -> LambdaBody

...

LambdaBody:
  Expression
  Block

람다 본문의 오른쪽은 우리를 다시 가져옵니다. Expression즉, 람다 안에 (더 높은 우선 순위) 람다가 있거나 (더 높은 우선 순위) 람다가있을 수 있습니다. "높은 우선 순위"란 의미는 프로덕션 규칙을 더 깊이 깊게 이해할수록 표현이 더 빨리 평가된다는 것입니다.

대입 연산자도 마찬가지입니다.

AssignmentExpression:
  ConditionalExpression
  Assignment

Assignment:
  LeftHandSide AssignmentOperator Expression

다시 한 번 과제의 오른쪽이로 되돌아 가서 Expression람다 식이나 과제를 가질 수 있습니다.

따라서 문법은 JLS 텍스트에 의존하기보다는 상황에 대해 잘 정의 된 설명을 제공합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.