수색…


소개

Java의 표현식은 계산을 수행하기위한 기본 구성입니다.

비고

표현식에서 사용할 수있는 연산자에 대한 참조를 들어, 참조 연산자 .

운영자 우선 순위

표현식에 여러 연산자가 포함되어 있으면 여러 가지 방법으로 읽을 수 있습니다. 예를 들어, 수학 식 1 + 2 x 3 은 두 가지 방법으로 읽을 수 있습니다.

  1. 12 를 더하고 그 결과에 3 곱하십시오. 답은 9 입니다. 괄호를 추가하면 ( 1 + 2 ) x 3 처럼 보일 것입니다.
  2. 23 을 곱한 결과에 1 을 더합니다. 이 대답 제공 7 . 괄호를 추가하면 1 + ( 2 x 3 ) 처럼 보일 것입니다.

수학에서 관례는 표현을 두 번째 방법으로 읽는 것입니다. 일반적으로 곱셈과 나눗셈은 더하기와 빼기 전에 수행됩니다. 보다 진보 된 수학 표기법이 사용되면 의미는 "자명하다"(훈련 된 수학자에게!) 또는 괄호가 추가되어 명확성이 확보됩니다. 두 경우 모두 의미를 전달하는 표기법의 효과는 지능과 수학자의 지식에 달려 있습니다.

Java는 사용 된 연산자의 우선 순위 에 따라 표현식을 읽는 방법에 대한 동일한 명확한 규칙을가집니다.

일반적으로 각 연산자는 우선 순위 값으로 간주됩니다. 아래 표를 참조하십시오.

예 :

  1 + 2 * 3

+ 의 우선 순위는 * 의 우선 순위보다 낮으므로 식의 결과는 9가 아닌 7입니다.

기술 연산자 / 구문 (기본) 상위 연관성
한정어
괄호
인스턴스 생성
필드 액세스
배열 액세스
메소드 호출
메소드 참조
이름 . 이름
( expr )
new
기본 . 이름
기본 [ expr ]
기본 ( expr, ... )
기본 :: 이름
15 명 왼쪽에서 오른쪽으로
게시물 증가 expr ++ , expr -- 14 -
사전 증가
단항
캐스트 1
++ expr, -- expr,
+ EXPR, - EXPR, ~ EXPR, ! expr,
( 형식 ) expr
13 -
오른쪽에서 왼쪽으로
오른쪽에서 왼쪽으로
Multiplicative * / % 12 왼쪽에서 오른쪽으로
첨가물 + - 11 왼쪽에서 오른쪽으로
시프트 << >> >>> 10 왼쪽에서 오른쪽으로
관계형 <> <=> = instanceof 9 왼쪽에서 오른쪽으로
평등 ==! = 8 왼쪽에서 오른쪽으로
비트 AND & 7 왼쪽에서 오른쪽으로
비트 배타적 논리합 ^ 6 왼쪽에서 오른쪽으로
비트 단위 OR | 5 왼쪽에서 오른쪽으로
논리적 AND && 4 왼쪽에서 오른쪽으로
논리 OR || 왼쪽에서 오른쪽으로
조건부 1 ? : 2 오른쪽에서 왼쪽으로
할당
람다 1
= = = = = = = = = = = << = >> = >>> = & = ^ = = =
->
1 오른쪽에서 왼쪽으로

1 람다 표현 우선 순위는 복소수입니다. 이는 캐스트 이후 나 조건부 삼항 연산자의 세 번째 부분으로 발생할 수도 있기 때문입니다.

상수 표현식

상수 표현식은 기본 유형 또는 문자열을 산출하는 표현식이며 컴파일 타임에 값이 리터럴로 평가 될 수있는 표현식입니다. 표현식은 예외를 발생시키지 않고 평가되어야하며 다음과 같이 구성되어야합니다.

  • 기본 및 문자열 리터럴.

  • 원시 형 또는 String 캐스트를 입력합니다.

  • 다음 단항 연산자 : + , - , ~! .

  • * , / , % , + , - , << >> , >>> , < , <= , > , >= , == != , & , ^ , | , &&|| .

  • 삼항 조건 연산자 ? : .

  • 괄호 속의 상수 표현.

  • 상수 변수를 참조하는 단순한 이름. (상수 변수는 final 로 선언 된 변수이며 이니셜 라이저 식은 그 자체가 상수 식입니다.)

  • <TypeName> . <Identifier> 형식의 정규화 된 이름입니다 <TypeName> . <Identifier> 는 상수 변수를 나타냅니다.

위의 목록 에는 ++-- , 대입 연산자, classinstanceof , 메서드 호출 및 일반 변수 또는 필드에 대한 참조가 제외됩니다.

String 유형의 상수 표현식은 "interned" String 을 생성하고 상수 표현식의 부동 소수점 연산은 FP 엄격한 의미 체계로 평가됩니다.

상수 표현식에 대한 사용

상수 표현식은 일반 표현식을 사용할 수있는 곳이면 어디에서나 사용할 수 있습니다. 그러나 이들은 다음과 같은 맥락에서 특별한 의미가 있습니다.

상수 표현식은 switch 문의 case 레이블에 필요합니다. 예 :

switch (someValue) {
case 1 + 1:            // OK
case Math.min(2, 3):   // Error - not a constant expression
    doSomething();
}

할당의 오른쪽에있는 표현식이 상수 표현식이면 할당은 원시적 인 축소 변환을 수행 할 수 있습니다. 이는 상수 표현식의 값이 왼쪽에있는 유형의 범위 내에 있으면 허용됩니다. ( JLS 5.1.35.2 참조) 예 :

byte b1 = 1 + 1;             // OK - primitive narrowing conversion.
byte b2 = 127 + 1;           // Error - out of range
byte b3 = b1 + 1;            // Error - not a constant expession
byte b4 = (byte) (b1 + 1);   // OK

상수 표현식이 do , while 또는 for 의 조건으로 사용되면 가독성 분석에 영향을줍니다. 예 :

while (false) {
    doSomething();           // Error - statenent not reachable
}
boolean flag = false;
while (flag) {
    doSomething();           // OK
}

(이 적용되지 않습니다 if 문. 자바 컴파일러가 허용 then 또는 else 의 블록을 if 문이 도달 할 수. 이것은 C와 C ++에서 조건부 컴파일의 자바 아날로그입니다.)

마지막으로, 상수 표현식 초기화 기가있는 클래스 또는 인터페이스의 static final 필드는 열정적으로 초기화됩니다. 따라서 클래스 초기화 종속성 그래프에주기가있는 경우에도 초기화 된 상태에서 이러한 상수가 관찰됩니다.

더 자세한 정보는 JLS 15.28을 참고하십시오 . 상수 표현 .

식 평가 순서

Java 표현식은 다음 규칙에 따라 평가됩니다.

  • 피연산자는 왼쪽에서 오른쪽으로 평가됩니다.
  • 연산자의 피연산자는 연산자보다 먼저 평가됩니다.
  • 연산자는 연산자 우선 순위에 따라 평가됩니다.
  • 인수 목록은 왼쪽에서 오른쪽으로 평가됩니다.

간단한 예

다음 예제에서 :

int i = method1() + method2();

평가 순서는 다음과 같습니다.

  1. = 연산자의 왼쪽 피연산자는 i 의 주소로 계산됩니다.
  2. + 연산자 ( method1() )의 왼쪽 피연산자가 계산됩니다.
  3. + 연산자 ( method2() )의 오른쪽 피연산자가 계산됩니다.
  4. + 연산이 평가됩니다.
  5. = 연산은 i 덧셈 결과를 대입하여 평가됩니다.

호출의 효과를 관찰 할 수있는 경우 method2 호출 전에 method1 호출이 발생하는 것을 관찰 할 수 있습니다.

부작용이있는 연산자를 사용한 예

다음 예제에서 :

int i = 1;
intArray[i] = ++i + 1;

평가 순서는 다음과 같습니다.

  1. = 연산자의 왼쪽 피연산자가 계산됩니다. 이것은 intArray[1] 의 주소를 제공합니다.
  2. 사전 증가가 평가됩니다. 이 추가 1i 및 평가 2 .
  3. + 의 오른쪽 피연산자가 계산됩니다.
  4. + 연산은 2 + 1 -> 3 평가됩니다.
  5. = 연산은 평가되어 3intArray[1] 할당합니다.

= 의 왼쪽 피연산자가 먼저 평가되므로 ++i 하위 표현의 부작용에 영향을받지 않습니다.

참고:

표현식 기본 사항

Java의 표현식은 계산을 수행하기위한 기본 구성입니다. 여기 예시들이 있습니다 :

1                 // A simple literal is an expression
1 + 2             // A simple expression that adds two numbers
(i + j) / k       // An expression with multiple operations
(flag) ? c : d    // An expression using the "conditional" operator
(String) s        // A type-cast is an expression
obj.test()        // A method call is an expression
new Object()      // Creation of an object is an expression
new int[]         // Creation of an object is an expression

일반적으로 표현식은 다음과 같은 형식으로 구성됩니다.

  • 다음으로 구성되는 표현식 이름 :
    • 간단한 식별자. 예 : someIdentifier
    • 한정된 식별자; 예 : MyClass.someField
  • 다음으로 구성되는 원재료 :
    • 리터럴; 예 : 1 , 1.0 , 'X' , "hello" , falsenull
    • 클래스 리터럴 식; 예 : MyClass.class
    • this<TypeName> . this
    • 괄호 안의 표현; 예 : ( a + b )
    • 클래스 인스턴스 생성 식; 예 : new MyClass(1, 2, 3)
    • 배열 인스턴스 생성 식; 예 : new int[3]
    • 필드 접근 식; 예 : obj.someField 또는 this.someField
    • 배열 접근 식; 예 : vector[21]
    • 메소드 호출; 예 : obj.doIt(1, 2, 3)
    • 메소드 참조 (Java 8 이상). 예 : MyClass::doIt
  • 단항 연산자 식; 예 : !a 또는 i++
  • 이진 연산자 식; 예를 들어 a + b 또는 obj == null
  • 삼항 연산자 식; 예 (obj == null) ? 1 : obj.getCount()
  • 람다 식 (Java 8 이상); 예 : obj -> obj.getCount()

표현의 다양한 형태의 세부 사항은 다른 주제에서 찾을 수 있습니다.

  • 연산자 주제는 단항, 2 진 및 3 항 연산자 표현을 다룹니다.
  • 람다 식 주제는 람다 식과 메서드 참조 식을 다룹니다.
  • 클래스 및 객체 항목에서는 클래스 인스턴스 작성 표현을 다룹니다.
  • 배열 항목에서는 배열 액세스 표현식과 배열 인스턴스 작성 표현식에 대해 설명합니다.
  • Literals 주제는 다양한 종류의 리터럴 표현식을 다룹니다.

표현식의 유형

대부분의 경우, 표현식은 정적 유형을 가지고 있습니다. 정적 유형은 컴파일 타임에 그 서브 표현식을 조사하여 판별 할 수 있습니다. 이를 독립형 표현식이라고합니다.

그러나 (Java 8 이상에서) 다음 종류의 표현식은 폴리 표현식 일 수 있습니다.

  • 괄호 안의 표현
  • 클래스 인스턴스 생성 식
  • 메서드 호출 식
  • 메서드 참조 식
  • 조건식
  • 람다 식

표현식이 폴리 표현식 일 때, 표현식의 목표 유형에 의해 그 유형이 영향을받을 수 있습니다. 즉 그것이 무엇을 위해 사용되고 있는지.

표현식의 값

표현식의 값은 해당 유형과 할당이 호환됩니다. 예외는 heap 오염 이 발생한 경우입니다. 예를 들어 "안전하지 않은 변환"경고가 (부적절하게) 억제되거나 무시 되었기 때문입니다.

표현식 문

다른 많은 언어와 달리 Java는 일반적으로 식을 명령문으로 사용할 수 없습니다. 예 :

public void compute(int i, int j) {
    i + j;   // ERROR
}

표현식을 평가 한 결과는 유용 할 수 없으며 다른 방식으로 프로그램 실행에 영향을 줄 수 없기 때문에 Java 설계자는 이러한 사용이 실수이거나 잘못 인도되었다는 입장을 취했습니다.

그러나 모든 표현식에 적용되는 것은 아닙니다. 표현식의 서브 세트는 진술로서 합법적입니다. 세트는 다음과 같이 구성됩니다.

  • 할당 및 연산 할당을 포함한 할당 식.
  • 증가 및 감소 표현을 사전 및 사후에 표시합니다.
  • 메소드 호출 ( void 또는 비 void ).
  • 클래스 인스턴스 작성 표현식.


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow