[ternary-operator] 삼항 또는 삼항? [닫은]

나는 개인적으로 삼항 연산자의 옹호자입니다 : ()? :; 나는 그것이 그 자리를 차지하고 있다는 것을 알고 있지만, 그것을 사용하는 것에 완전히 반대하는 많은 프로그래머와 너무 자주 사용하는 일부 프로그래머를 만났습니다.

그것에 대한 당신의 감정은 무엇입니까? 어떤 흥미로운 코드를 사용해 보셨습니까?



답변

간단한 표현식에만 사용하십시오 .

int a = (b > 10) ? c : d;

삼항 연산자를 읽고 혼동하기 어렵 기 때문에 연결하거나 중첩하지 마십시오 .

int a = b > 10 ? c < 20 ? 50 : 80 : e == 2 ? 4 : 8;

또한 삼항 연산자를 사용할 때는 가독성을 향상시키는 방식으로 코드를 형식화하십시오.

int a = (b > 10) ? some_value
                 : another_value;


답변

각 하위 표현식에 중단 점을 배치 할 수 없으므로 디버깅이 약간 더 어렵습니다. 나는 거의 사용하지 않습니다.


답변

나는 특히 타입 안전 언어로 그들을 좋아합니다.

나는 이것이 어떻게 보이지 않는다 :

int count = (condition) ? 1 : 0;

이보다 더 어렵다 :

int count;

if (condition)
{
  count = 1;
}
else
{
  count = 0;
}

편집하다 –

삼항 연산자는 대안보다 모든 것을 덜 복잡하고 깔끔하게 만든다고 주장합니다.


답변

묶여 나는 괜찮습니다.

나는 C에서 더 많이 사용하는 경향이 있습니다. b / c는 가치가있는 if 문이므로 불필요한 반복이나 변수를 줄입니다.

x = (y < 100) ? "dog" :
    (y < 150) ? "cat" :
    (y < 300) ? "bar" : "baz";

오히려

     if (y < 100) { x = "dog"; }
else if (y < 150) { x = "cat"; }
else if (y < 300) { x = "bar"; }
else              { x = "baz"; }

이와 같은 과제에서 리팩터링하는 것이 적고 명확합니다.

반면에 루비로 작업 할 때는 if...else...end표현이기 때문에 사용할 가능성이 더 큽니다 .

x =   if (y < 100) then "dog"
    elif (y < 150) then "cat"
    elif (y < 300) then "bar"
    else                "baz"
    end

(물론,이 간단한 것에 대해서는 어쨌든 삼항 연산자를 사용할 수 있습니다).


답변

삼항 ?:연산자는 단지 절차 적 if구성 과 기능적으로 동등합니다 . 중첩 ?:표현식을 사용하지 않는 한 조작의 기능적 표현에 대한 인수가 여기에 적용됩니다. 그러나 삼항 연산을 중첩하면 코드가 완전히 혼란 스러울 수 있습니다 (독자 운동 : 중첩 삼항 조건을 처리하는 파서를 작성하면 복잡성을 이해할 수 있습니다).

그러나 ?:연산자를 보수적으로 사용하면 실제로 는 다른 것보다 읽기 쉬운 코드가 생길 수 있는 상황이 많이 있습니다 . 예를 들면 다음과 같습니다.

int compareTo(Object object) {
    if((isLessThan(object) && reverseOrder) || (isGreaterThan(object) && !reverseOrder)) {
       return 1;
    if((isLessThan(object) && !reverseOrder) || (isGreaterThan(object) && reverseOrder)) {
       return -1;
    else
      return 0;
}

이제 이것을 이것과 비교하십시오 :

int compareTo(Object object) {
    if(isLessThan(object))
        return reverseOrder ? 1 : -1;
    else(isGreaterThan(object))
        return reverseOrder ? -1 : 1;
    else
       return 0;
}

코드가 더 콤팩트하기 때문에 구문 노이즈가 적고 삼항 연산자를 신중하게 사용하면 ( reverseOrder 속성 에만 관련됨 ) 최종 결과는 특히 간결하지 않습니다.


답변

스타일의 문제입니다. 내가 따르는 경향이있는 잠재 의식 규칙은 다음과 같습니다.

  • 만 1 표현식을 평가 – 그래서 foo = (bar > baz) ? true : false,하지만foo = (bar > baz && lotto && someArray.Contains(someValue)) ? true : false
  • 디스플레이 로직에 사용하는 경우 (예 : <%= (foo) ? "Yes" : "No" %>
  • 실제로 할당에만 사용하십시오. 절대 흐름 논리 (그래서 절대 (foo) ? FooIsTrue(foo) : FooIsALie(foo)) 삼항의 흐름 논리는 거짓말 자체입니다. 마지막 지점을 무시하십시오.

나는 간단한 할당 작업을 위해 간결하고 우아하기 때문에 좋아합니다.


답변

많은 의견을 질문처럼 대답은 필연적이다 : 그것은 의존한다

같은 :

return x ? "Yes" : "No";

나는 그것이 다음 보다 훨씬 간결 하다고 생각합니다 (그리고 구문 분석하기가 더 빠릅니다).

if (x) {
    return "Yes";
} else {
    return "No";
}

이제 조건식이 복잡한 경우 삼항 연산은 적합하지 않습니다. 다음과 같은 것 :

x && y && z >= 10 && s.Length == 0 || !foo

삼항 연산자에 적합하지 않습니다.

또한 C 프로그래머라면 GCC에는 실제로 다음과 같이 삼항의 실제 부분을 제외 할 수 있는 확장자 가 있습니다.

/* 'y' is a char * */
const char *x = y ? : "Not set";

설정합니다 어떤 xy가정은 y하지 않습니다 NULL. 좋은 물건.