자바 의 단락 연산 자 와 논리 연산 자 예제 상세 설명

1.논리 연산 자(부분)
기호.
명칭.
&&
단락 과 연산 자
||
단락 또는 연산 자
&
연산 자
|
연산 자
이 공 계 학습자 에 게 논리 연산 은 비교적 기초적인 개념 으로 대학 1 학년 이산 수학 과정 에서 흔히 알 수 있다.자바 및 더 많은 C-Like 언어 에서&와|은 논리 연산 중의 것 과,또는 그들의 연산 결 과 는 우리 가 수학 책 에서 배 운 논리 연산 규칙 과 차이 가 없다 는 것 을 나타 낸다.그러나 실제 프로 그래 밍 과정 에서 우 리 는 오히려&&|을 더 많이 사용 할 것 이다.심지어 많은 친구 들 이&,|두 개의 연산 자 를 모른다.그렇다면 이 는 도대체 왜 일 까?
2.단락 연산 자
논리 연산 을 처음 배 울 때 문 제 를 해결 하 는 진가 표 로 돌아 가'또는 연산'을 예 로 들 자.
a
b
결실
true
true
true
true
false
true
false
true
true
false
false
false
a 와 b 중 적어도 하나 가 true 이면 최종 출력 결 과 는 true 입 니 다.그러면 알고리즘 최적화 의 측면 에서 문 제 를 생각하면 우 리 는 최소한 의 절 차 를 거 쳐 신뢰 할 수 있 는 결 과 를 출력 하기 위해'또는 연산'을'true'가 있 으 면 true 를 출력 한다'고 정의 할 수 있다.
따라서'또는 연산'은 왼쪽 에서 오른쪽으로 최적화 할 수 있 습 니 다.불 표현 식 이 true 인 것 을 만나면 true 로 돌아 가 고 그 후의 연산 을 하지 않 습 니 다.
이와 비슷 한 것 은'연산 과'로 최적화 할 수 있 습 니 다.왼쪽 에서 오른쪽으로 불 표현 식 이 false 인 것 을 만나면 false 로 돌아 가 다음 연산 을 하지 않 습 니 다.
그래서 단락 연산 자가 설계 되 었 다.그러나'명령 을 집행 하고 되 돌아 오기','순수한 수학 계산'등 다양한 응용 장면 을 고려 하기 위해 전통 적 인 비 단락 논리 연산 자 도 단락 논리 연산 자 에 의 해 대체 되 지 않 았 다.
그 밖 에 연 결 된 단락 연산 자,예 를 들 어 func 1()|func 2()||func 3()||func 4(),컴 파일 러 도 이 를 위해 최적화 될 것 입 니 다.이 부분의 바이트 코드 를 읽 어서 이 결론 을 검증 하 는 것 도 좋 습 니 다.

public static void main(String[] args) {
  boolean b1 = func1() || func2() || func3() || func4();
  System.out.println("------------------");
  boolean b2 = func1() | func2() | func3() | func4();
}

// func1() - func4() here
단락"또는"의 바이트 번 호 는 다음 과 같 습 니 다.

0: invokestatic #7     // Method func1:()Z
3: ifne   24
6: invokestatic #13     // Method func2:()Z
9: ifne   24
12: invokestatic #16     // Method func3:()Z
15: ifne   24
18: invokestatic #19     // Method func4:()Z
21: ifeq   28
24: iconst_1
25: goto   29
28: iconst_0
29: istore_1

3 줄,9 줄,15 줄 의 ifne 은 스 택 상단 요 소 를 0(false)에 비해 false 가 아니라면 24 줄 로 넘 어가 상수 1(true)을 스 택 에 들 어가 할당 을 완성 하고 나머지 실행 을 건 너 뜁 니 다.마지막 21 줄 이 되 어서 야 마지막 방법 결과 의 값 을 0 과 비교 하고 0 이면 상수 0 을 스 택 에 넣 어 할당 을 완성 합 니 다.
일반"또는"등 바이트 번 호 는 다음 과 같 습 니 다.

38: invokestatic #7     // Method func1:()Z
41: invokestatic #13     // Method func2:()Z
44: ior
45: invokestatic #16     // Method func3:()Z
48: ior
49: invokestatic #19     // Method func4:()Z
52: ior
53: istore_2
일반 또는 연산,점프 없 이 마지막 할당 을 순서대로 수행 합 니 다.
3.응용 과 함정
처음에 필 자 는 단락 연산 자가 이런 코드 에 있다 는 것 을 다시 깨 달 았 다.

public LoginCheckDTO XxxLoginCheck(String password) {
	//some codes
	if ( password == null || password.length() == 0 ) {
		return LoginCheckDTO.EMPTY_PASSWORD;
	}
	//some codes
}
당시 필 자 는 password 가 null 이면 password.length()를 호출 하려 고 시도 할 때 빈 포인터 가 이상 하 게 던 져 져 서 쓰기 가 좋 지 않다 고 생각 했다.그러나 나중에 테스트 를 진행 할 때 이렇게 쓰 는 것 이 문제 가 없다 는 것 을 알 게 되 었 고 관련 자 료 를 찾 아 보면 단락 연산 자의 개념 을 알 게 되 었 다.
이 예 에서 password==null 이 true 로 돌아 갈 때 다음 표현 식 은 실행 되 지 않 고 이상 을 던 지 는 경우 가 없습니다.이것 이 바로 단락 연산 자가 비교적 자주 사용 하 는 응용 장면 이다.
이 밖 에 도 단락 연산 자 에 의 한 명령 집행 이 불완전 하 다 는 점 을 경계해 야 한다.
예 를 들 어 다음 과 같은 응용 장면 에서 우 리 는 조건 문 구 를 이용 하여 모든 불 이 지난 상태 에서 켜 져 있 는 지 판단 하고 어쨌든 우 리 는 마지막 에 모든 불 을 켜 고 싶다.그러나 우 리 는 단락 연산 자 를 잘못 사용 했다.

public boolean checkAndTurnOnAll() {
	return checkAndTurnOn1() && checkAndTurnOn2();
}

private boolean checkAndTurnOn1() {
	boolean check = check1();
	turnOn1();
	return check;
}

private boolean checkAndTurnOn2() {
	boolean check = check2();
	turnOn2();
	return check;
}
이 장면 에서 첫 번 째 등 이 이전 상태 에서 꺼 진 상태 라면 check Andr Turn 1()에서 turn 1()을 실행 하고 false 로 돌아 가지 만 단락 특성 인 check Andr Turn 2()가 실행 되 지 않 기 때문에 마지막 으로 기대 하 는 모든 불 이 켜 지 는 것 이 반드시 실현 되 는 것 은 아니다.이런 상황 은 마 땅 히 사용 해 야 한다.
총결산
자바 의 단락 연산 자 와 논리 연산 자 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 단락 연산 자 와 논리 연산 자 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기