문제

나는 몇 년 동안 Java를 사용해 왔지만 최근까지 이 구문을 실행해 본 적이 없습니다.

int count = isHere ? getHereCount(index) : getAwayCount(index);

이것은 아마도 매우 간단한 질문일 것입니다. 그러나 누군가 그것을 설명할 수 있습니까?어떻게 읽나요?나는 그것이 어떻게 작동하는지 알고 있다고 확신합니다.

  • 만약에 isHere 사실이다, getHereCount() 라고,
  • 만약에 isHere 거짓이다 getAwayCount() 호출됩니다.

옳은?이 구조를 무엇이라고 부르나요?

도움이 되었습니까?

해결책

예, 그것은 속기 형태입니다

int count;
if (isHere)
    count = getHereCount(index);
else
    count = getAwayCount(index);

그것은 The라고합니다 조건부 운영자. 많은 사람들이 (잘못) 전화합니다 3 원 운영자, Java, C, C ++ 및 아마도 다른 많은 언어에서 유일한 3 원 (3 학습) 운영자이기 때문입니다. 그러나 이론적으로 거기 ~할 수 있었다 또 다른 삼여 사업자가되지만 하나만있을 수 있습니다. 조건부 운영자.

공식 이름은 다음에 나와 있습니다 자바 언어 사양:

§15.25 조건부 운영자? :

조건부 운영자 ? : 하나의 표현식의 부울 값을 사용하여 두 가지 다른 표현 중 어느 것을 평가 해야하는지 결정합니다.

두 가지 모두 반환 값이있는 메소드로이어야합니다.

두 번째 또는 세 번째 피연산자 표현식이 무효 방법의 호출이되는 것은 컴파일 타임 오류입니다.

실제로, 표현 진술의 문법에 의해 (§14.8), 공극 방법의 호출이 나타날 수있는 상황에서 조건부 표현식이 나타나는 것은 허용되지 않습니다.

그래서 만약 doSomething() 그리고 doSomethingElse() 무효 방법이므로 압축 할 수 없습니다.

if (someBool)
    doSomething();
else
    doSomethingElse();

이것으로 :

someBool ? doSomething() : doSomethingElse();

간단한 단어 :

booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse 

다른 팁

다른 사람들은 이것을 합리적으로 대답했지만 종종 "Ternary Operator"라는 이름으로 대답했습니다.

내가 그랬던 사람이기 때문에, 나는 운영자의 이름이 조건부 운영자 또는 "조건부 운영자? :"임을 분명히하고 싶습니다. 이것의 Ternary Operator (3 개의 피연산자가 있다는 점에서)는 현재 Java에서 유일한 3 원 운영자입니다.

그러나, 그 사양은 매우 명확합니다 그 이름은 조건부 운영자 또는 "조건부 연산자? :"입니다. 나는 오퍼레이터의 동작이 얼마나 많은 피연산자가 아닌지가 아닌 어느 정도 (조건을 평가)를 나타내므로 그 이름으로 호출하는 것이 더 명확하다고 생각합니다.

에 따르면 Sun Java 사양,이를 조건부 연산자라고합니다. 섹션 15.25를 참조하십시오. 당신은 그것이 무엇을하는지 옳습니다.

조건부 운영자? : 하나의 표현식의 부울 값을 사용하여 두 가지 다른 표현 중 어느 것이 평가되어야하는지 결정합니다.

조건부 운영자는 구문 적으로 오른쪽 연관성 (오른쪽에서 왼쪽으로 그룹)이므로 A? B : C? D : E? F : G는 A? B : (C? F : (E? F :g)).

ConditionalExpression:
        ConditionalOrExpression
        ConditionalOrExpression ? Expression : ConditionalExpression

조건부 운영자는 3 개의 피연산자 표현을 가지고 있습니다. ? 첫 번째 표현과 두 번째 표현 사이에 나타나고 : 두 번째 표현과 세 번째 표현 사이에 나타납니다.

첫 번째 표현식은 부울 또는 부울 유형이거나 컴파일 타임 오류가 발생해야합니다.

정확하지 않고 정확하지 않습니다.

  1. ISHERE가 사실이라면 결과 GethereCount ()의 IS 반환
  2. 기타 결과 GetawayCount ()의 IS 반환

"반품"은 매우 중요합니다. 그것은 방법을 의미합니다 ~ 해야 하다 값과 그 값을 반환하십시오 ~ 해야 하다 어딘가에 할당됩니다.

또한, 그것은입니다 정확히 IF-ELSE 버전과 구문 적으로 동일합니다. 예를 들어:

String str1,str2,str3,str4;
boolean check;
//...
return str1 + (check ? str2 : str3) + str4;

if-else로 코딩하면 항상 더 많은 바이트 코드가 발생합니다.

int count = isHere ? getHereCount(index) : getAwayCount(index);

수단 :

if (isHere) {
    count = getHereCount(index);
} else {
    count = getAwayCount(index);
}
condition ? truth : false;

조건이있는 경우 true 그런 다음 첫 번째 매개 변수를 반환합니다. 조건이있는 경우 false, 두 번째 매개 변수를 반환합니다.

그것은라고합니다 조건부 운영자 그리고 그것은 유형입니다 3 배의 운영.

삼항, 조건부;토마토, 토마토.정말 중요한 것은 변수 초기화입니다.(나처럼) 변수가 정의된 곳에서 변수를 초기화하는 것을 좋아한다면 조건부 삼항 연산자(둘 다이기 때문에)를 사용하면 해당 값에 조건이 있는 경우 그렇게 할 수 있습니다.특히 최종 필드에서 주목할 만하지만 다른 곳에서도 유용합니다.

예:

public class Foo {
    final double    value;

    public Foo(boolean positive, double value) {
        this.value = positive ? value : -value;
    }
}

해당 연산자가 없으면 - 어떤 이름으로든 - 필드를 비최종으로 만들거나 단순히 초기화하는 함수를 작성해야 합니다. 실제로는 그렇지 않습니다. 적어도 Java에서는 if/else를 사용하여 초기화할 수 있습니다.하지만 저는 이게 더 깨끗한 것 같아요.

이 구조는 삼항 연산자 컴퓨터 과학 및 프로그래밍 기술 분야.
그리고 위키피디아 다음 설명을 제안합니다.

컴퓨터 과학에서 삼항 연산자(때때로 삼차 연산자라고 잘못 불리기도 함)는 세 개의 인수를 취하는 연산자입니다.인수와 결과의 유형은 다를 수 있습니다.C와 유사한 구문을 사용하는 많은 프로그래밍 언어에는 삼항 연산자인 ?가 있습니다., 조건식을 정의합니다.

이 구문은 Java뿐만 아니라 PHP, Objective-C에서도 사용할 수 있습니다.

다음에서 링크 그것은 다음과 같은 설명을 제공하는데, 이는 이해하기에 매우 좋습니다.

삼항 연산자는 3개의 입력에 대해 작동하는 연산입니다.if-else 문의 단축형이며 조건 연산자라고도 합니다.

Perl/PHP에서는 다음과 같이 작동합니다.
boolean_condition ? true_value : false_value

C/C++에서는 다음과 같이 작동합니다.
logical expression ? action for true : action for false

이는 너무 복잡하지 않은 일부 논리적 조건에 대해 읽을 수 있을 수 있으며 그렇지 않으면 사용하는 것이 더 좋습니다. If-Else 블록 조건부 논리를 의도적으로 조합한 것입니다.

우리는 다음을 단순화할 수 있습니다. If-Else 블록 하나의 코드 문 줄에 대해 이 삼항 연산자를 사용하세요.
예를 들어:

if ( car.isStarted() ) {
     car.goForward();
} else {
     car.startTheEngine();
}

다음과 같을 수 있습니다.

( car.isStarted() ) ? car.goForward() : car.startTheEngine();

따라서 귀하의 진술을 참조하면 다음과 같습니다.

int count = isHere ? getHereCount(index) : getAwayCount(index);

실제로는 다음과 100% 동일합니다. If-Else 블록:

int count;
if (isHere) {
    count = getHereCount(index);
} else {
    count = getAwayCount(index);
}

그게 다야!
이것이 누군가에게 도움이 되었기를 바랍니다!
건배!

옳은. 이것의 ~라고 불리는 그만큼 3 배 운영자. 일부는 또한 그것을라고 부릅니다 조건부 운영자.

3 차 운영자 (? :)

The ternary operator is an operator that takes three arguments. The first 
argument is a comparison argument, the second is the result upon a true 
comparison, and the third is the result upon a false comparison.

당신은 a에 관심이있을 수 있습니다 제안 조건부 운영자와 유사한 일부 새로운 연산자의 경우. NULL-SAFE 연산자는 다음과 같은 코드를 활성화합니다.

String s = mayBeNull?.toString() ?: "null";

자동 노트 박스가 발생하는 경우 특히 편리합니다.

Integer ival = ...;  // may be null
int i = ival ?: -1;  // no NPE from unboxing

그랬어 추가 고려를 위해 선택되었습니다 JDK 7의 "Project Coin"에 따라

실제로 3 개 이상의 인수가 필요할 수 있습니다. 예를 들어 숫자가 양수, 음수 또는 0인지 확인하려면 다음을 수행 할 수 있습니다.

String m= num > 0 ? "is a POSITIVE NUMBER.": num < 0 ?"is a NEGATIVE NUMBER." :"IT's ZERO.";

if, else, 다른 경우 사용하는 것보다 낫습니다.

그것은 조건부 운영자이며, 그것은 단순한 문자를 작성하는 간결한 방법 이상입니다.

값을 반환하는 표현이므로 다른 표현식의 일부로 사용할 수 있습니다.

그래 너가 옳아. ? : 일반적으로 "Ternary Conditional Operator"라고하며 종종 단순히 "Ternary Operator"라고합니다. 표준 if/else 조건부의 속기 버전입니다.

3 배 조건부 운영자

나는이 연산자를 정말로 좋아하지만 독자는 고려해야합니다.

당신은 항상 코드 콤팩트를 읽는 데 소요되는 시간과 균형을 맞춰야하며, 그것은 매우 심각한 결함이 있다는 것입니다.

우선, 원래 Asker의 사례가 있습니다. 그는 방금 한 시간 동안 그것에 대해 게시하고 응답을 읽었습니다. 저자가 모든 글을 쓰는 데 얼마나 더 길었 을까? : 평생 동안 IF/그 후. 확실히 한 시간이 아닙니다.

둘째, C와 같은 언어에서, 당신은 단순히 조건부가 줄에서 가장 먼저라는 것을 아는 습관을 얻습니다. 루비를 사용할 때 이것을 알아 차리고 다음과 같은 줄을 가로 질러 왔습니다.

callMethodWhatever(Long + Expression + with + syntax) if conditional

내가 오랫동안 Ruby 사용자라면 아마도이 줄에 문제가 없었을 것입니다. 그러나 C에서 오는 것은 "콜 메토드 whate"를 라인에서 가장 먼저 볼 때 실행 될 것으로 예상됩니다. ? : 덜 비밀 스럽지만 독자를 버릴만큼 충분히 드문 일입니다.

그러나 장점은 선 중 1 개 공간에 3 라인 IF 문을 쓸 수있을 때 배에서 정말 멋진 느낌입니다. 그것을 부정 할 수는 없습니다 :) 그러나 솔직히 말해서, 단순히 그 사람들의 90%가 '희귀 성 때문에 반드시 읽을 수있는 것은 아닙니다.

부울과 가치를 기반으로 한 과제 일 때 나는 그것에 문제가 없지만 쉽게 남용 될 수 있습니다.

조건부 표현은 완전히 다른 스타일로, 진술서에 명시 적이없는 경우.

구문은 : 부울 표현? 발현 1 : 발현 2;

이 조건부 표현의 결과는 다음과 같습니다

발현 1 부울 발현이 사실이라면;

그렇지 않으면 결과는 expression2입니다.

더 많은 수의 변수 NUM1 및 NUM2를 최대에 할당한다고 가정 해 봅시다. 조건부 표현식을 사용하여 진술을 작성할 수 있습니다 : max = (num1> num2)? num1 : num2;

참고 : 기호? 그리고 : 조건부 표현식으로 함께 나타납니다. 조건부 운영자를 형성하고 3 개의 피연산자를 사용하기 때문에 3 배 연산자라고도합니다. Java에서 유일한 3 원 운영자입니다.

인용 : 소개에서 Java Programming 10th Edition의 Y. Daniel Liang Page 126-127

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top