문제

나 개인적으로 옹호자의 원자:()?:;내가 깨닫는 그것의 장소,하지만 저는 많은 걸쳐 프로그래머는 이제까지 사용,그리고 일부는 그것을 사용이 너무 많습니다.

어떤 느낌이에요?무슨 흥미로운드 본 적이 있을 사용하여 그것은?

도움이 되었습니까?

해결책

사용하십시오 간단한 표현 만:

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

체인이나 둥지하지 마십시오 읽기가 어렵고 혼란스럽게하는 3 원 운영자 :

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

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

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

다른 팁

각 하위 표현식에 중단 점을 배치 할 수 없으므로 디버깅을 약간 어렵게 만듭니다. 나는 드물게 사용합니다.

나는 특히 유형-안전 언어로 그들을 사랑합니다.

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

int count = (condition) ? 1 : 0;

이것보다 어렵다 :

int count;

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

편집하다 -

나는 3 차 운영자가 대안보다 모든 것을 덜 복잡하고 깔끔하게 만든다고 주장합니다.

나는 묶여있다.

나는 단순히 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

(그러나,이 단순한 일에 대해서는 어쨌든 3 원 운영자를 사용할 수도 있습니다).

삼항 ?: 운영자는 단순히 기능적인 동의 절차 if 구조물이다.그래서 오랫동안 당신을 사용하지 않을 중첩 ?: 식 인수/에 대한 기능의 표현은 어떤 작업이 여기에 적용됩니다.그러나 중첩 원 operations 발생할 수 있는 코드를 명백히 혼란(운동에 대한 독자:작성하려고 분석을 처리하는 중첩 원 조건문하고 당신이 감사합니다 그들의 복잡성).

만 있는 상황이 많이 보수적인 이용 ?: 운전자 발생할 수 있는 코드에서 실제로 을 읽어보지 않습니다.예를 들어:

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) ) 제 3의 흐름 논리는 그 자체로 거짓말입니다. 마지막 요점을 무시하십시오.

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

많은 의견 질문과 마찬가지로 답은 필연적으로 다음과 같습니다. 때에 따라 다르지

:

return x ? "Yes" : "No";

나는 그것이 생각합니다 많이 보다 간결한 (그리고 구문 분석에 더 빨리) :

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

이제 조건부 표현이 복잡하다면, 3 배의 작동은 좋은 선택이 아닙니다. 같은 것 :

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

3 원 운영자에게 좋은 후보가 아닙니다.

옆으로, 당신이 C 프로그래머라면, GCC는 실제로 확장 이렇게하면 다음과 같이 3 원의 IF 진료 부분을 제외 할 수 있습니다.

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

설정됩니다 x 에게 y 가정합니다 y 아니다 NULL. 좋은 것들.

제 생각에는 표현이 필요한 경우 3 원 운영자를 사용하는 것이 합리적입니다.

다른 경우에는 3 원 운영자가 명확성을 감소시키는 것처럼 보입니다.

측정에 의해 순환 복잡성, 사용 if 진술 또는 3 배 연산자는 동일합니다. 따라서 그 측정에 따르면 대답은입니다 아니요, 복잡성은 이전과 정확히 동일합니다.

가독성, 유지 보수 및 건조 (자체적으로 반복하지 않음)와 같은 다른 측정 값에 의해, 어느 중 어느 쪽이든 다른 선택보다 더 나을 수 있습니다.

선택한 매개 변수가 null 일 때 기본값을 정의하기 위해 생성자 (예 : 새로운 .NET 3.5 LINQ에서 XML 구성)에서 작업하도록 제한된 장소에서 자주 사용합니다.

고안 예 :

var e = new XElement("Something",
    param == null ? new XElement("Value", "Default")
                  : new XElement("Value", param.ToString())
);

또는 (Asterite 감사합니다)

var e = new XElement("Something",
    new XElement("Value",
        param == null ? "Default"
                      : param.ToString()
    )
);

3 원 운영자를 사용하든 아니든 코드를 읽을 수 있는지 확인하는 것이 중요합니다. 모든 구조물은 읽을 수 없게 만들 수 있습니다.

코드를 읽기가 매우 어렵지 않으면 제 3 조의 연산자를 사용할 수있는 곳에서는 할 수있는 곳에서 사용하지만 일반적으로 코드가 약간의 리팩토링을 사용할 수 있다는 표시 일뿐입니다.

일부 사람들이 3 원 운영자가 "숨겨진"기능이거나 다소 신비 롭다고 생각하는 방식은 항상 당황합니다. 그것은 C에서 프로그래밍을 시작할 때 배운 첫 번째 것 중 하나이며, 그것이 가독성을 전혀 줄이지 않는다고 생각하지 않습니다. 언어의 자연스러운 부분입니다.

나는 jmulder에 동의합니다 : 그것은 대신 사용해서는 안됩니다. if, 그러나 반환 표현 또는 표현 내부에 위치가 있습니다.

echo "Result: " + n + " meter" + (n != 1 ? "s" : "");
return a == null ? "null" : a;

전자는 그 예일 뿐이며, 복수의 더 나은 I18N 지원을 사용해야합니다!

(오늘의 해킹)

#define IF(x) x ?
#define ELSE :

그런 다음 if-then-else를 표현으로 할 수 있습니다.

int b = IF(condition1)    res1
        ELSE IF(condition2)  res2
        ELSE IF(conditions3) res3
        ELSE res4;

당신이 사용하는 경우 원산자에 대한 간단한 조건부 할당을 나는 그것 괜찮습니다.나는 그것을 본 적이(ab)의 사용을 제어 프로그램 교류 없이도는 할당,그리고 나는 생각한 피해야 한다.를 사용하는 경우 문서 이러한 경우.

필요할 때 3 배의 운영자를 사용해야한다고 생각합니다. 그것은 분명히 매우 주관적인 선택이지만, 간단한 표현 (특히 반환 표현식)이 전체 테스트보다 훨씬 명확하다는 것을 알았습니다. C/C ++의 예 :

return (a>0)?a:0;

비교 :

if(a>0) return a;
else return 0;

또한 솔루션이 3 원 운영자와 기능을 만드는 경우도 있습니다. 예를 들어 파이썬에서 :

l = [ i if i > 0 else 0 for i in lst ]

대안은 다음과 같습니다.

def cap(value):
    if value > 0:
        return value
    return 0
l = [ cap(i) for i in lst ]

파이썬에서 (예를 들어), 그러한 관용구는 정기적으로 볼 수있을 정도로 필요합니다.

l = [ ((i>0 and [i]) or [0])[0] for i in lst ]

이 라인은 Python에서 논리 연산자의 속성을 사용합니다. 게으르고 최종 상태와 같으면 계산 된 마지막 값을 반환합니다.

나는 'em을 좋아한다. 왜 그런지 모르겠지만, 제 3의 표현을 사용할 때 매우 시원합니다.

나는 그런 짐승을 보았습니다 (실제로는 isvaliddate이고 월과 날도 확인했기 때문에 실제로 훨씬 더 나빴지 만 모든 것을 기억하려고 노력할 수 없었습니다).

isLeapYear =
    ((yyyy % 400) == 0)
    ? 1
    : ((yyyy % 100) == 0)
        ? 0
        : ((yyyy % 4) == 0)
            ? 1
            : 0;

분명히 일련의 if 진술이 더 좋았을 것입니다 (이것은 내가 한 번 본 거시 버전보다 여전히 낫지 만).

나는 같은 작은 것들에 대해 신경 쓰지 않는다 :

reportedAge = (isFemale && (Age >= 21)) ? 21 + (Age - 21) / 3 : Age;

또는 약간 까다로운 것들 :

printf ("Deleted %d file%s\n", n, (n == 1) ? "" : "s");

디버그 코드에서 연산자를 사용하여 오류 값을 인쇄하는 것을 좋아하므로 항상 검색 할 필요가 없습니다. 일반적으로 나는 개발이 끝나면 남아 있지 않은 디버그 인쇄를 위해이 작업을 수행합니다.

int result = do_something();
if( result != 0 )
{
  debug_printf("Error while doing something, code %x (%s)\n", result,
                result == 7 ? "ERROR_YES" :
                result == 8 ? "ERROR_NO" :
                result == 9 ? "ERROR_FILE_NOT_FOUND" :
                "Unknown");
}

나는 원 3 운영자를 거의 사용하지 않기 때문에, 내가 그것을 사용할 때마다, 그것은 항상 그것을 유지하려고 할 때 나중에 내가해야 할 것보다 훨씬 더 많이 생각하게 만들기 때문입니다.

나는 진실성을 피하는 것을 좋아하지만 코드를 훨씬 쉽게 선택할 때는 구두로 갈 것입니다.

고려하다:

String name = firstName;

if (middleName != null) {
    name += " " + middleName;
}

name += " " + lastName;

이제 그것은 약간의 장점이지만, 나는 그것을보다 훨씬 읽기 쉬운다는 것을 알았습니다.

String name = firstName + (middleName == null ? "" : " " + middleName)
    + " " + lastName;

또는:

String name = firstName;
name += (middleName == null ? "" : " " + middleName);
name += " " + lastName;

무슨 일이 일어나고 있는지 명확하게하지 않고 너무 많은 정보를 너무 작은 공간으로 압축하는 것 같습니다. 제 3의 운영자가 사용되는 것을 볼 때마다, 나는 항상 읽기가 훨씬 쉬운 것처럼 보이는 대안을 발견했습니다. 다시, 그것은 매우 주관적인 의견이므로, 당신과 당신의 동료들이 Ternary가 매우 읽기 쉬운 것을 발견하면 그것을 위해 가십시오.

글쎄, 그것의 구문은 끔찍합니다. 기능적 IF가 매우 유용하며 종종 코드를 더 읽기 쉽게 만듭니다.

나는 매크로를 더 읽기 쉽게 만드는 것을 제안하지만, 누군가가 항상 CPP와 같이 끔찍한 가장자리 케이스를 만들 수 있다고 확신합니다.

일 때만:

$ var = (Simple> Test? simple_result_1 : simple_result_2);

키스.

나는 일반적으로 다음과 같은 것들에 사용합니다.

before:

if(isheader)
    drawtext(x,y,WHITE,string);
else
    drawtext(x,y,BLUE,string);

after:

    drawtext(x,y,isheader==true?WHITE:BLUE,string);

다른 사람들이 지적했듯이 짧은 간단한 조건에 좋다. 나는 특히 불이행을 좋아한다 ( || 그리고 또는 JavaScript 및 Python의 사용), 예를 들어

int repCount = pRepCountIn ? *pRepCountIn : defaultRepCount;

또 다른 일반적인 용도는 C ++에서 참조를 초기화하는 것입니다. 동일한 문서에서 참조를 선언하고 초기화해야하므로 if 문을 사용할 수 없습니다.

SomeType& ref = pInput ? *pInput : somethingElse;

나는 3 원 운영자를 Goto와 비슷하게 대합니다. 그들은 그들의 자리를 가지고 있지만, 코드를 쉽게 이해하기 위해 피해야 할 것입니다.

나는 최근에 표준 "()를 만드는 3 원 운영자 (음, 일종의)에 대한 변형을 보았습니다.

var Result = [CaseIfFalse, CaseIfTrue][(boolean expression)]

또는보다 실질적인 예를 제시하려면 :

var Name = ['Jane', 'John'][Gender == 'm'];

당신을 염두에 두십시오. 이것은 JavaScript이므로 다른 언어로는 불가능할 수 있습니다 (고맙게도).

For simple if cases, I like to use it. Actually it's much easier to read/code for instance as parameters for functions or things like that. Also to avoid the new line I like to keep with all my if/else.

Neseting it would be a big NO-NO in my book.

So, resuming, for a single if/else I'll use the ternary operator. For other cases a regular if/else if/else (or switch)

I like Groovy's special case of the ternary operator, called the Elvis operator: ?:

expr ?: default

This code evaluates to expr if it's not null, and default if it is. Technically it's not really a ternary operator, but it's definitely related to it and saves a lot of time/typing.

For simple tasks like assigning a different value depending on a condition they're great. I wouldn't use them when there are longer expressions depending on the condition tho.

A so many answers have said, it depends. I find that if the ternary comparison is not visible in a quick scan down the code, then it should not be used.

As a side issue, I might also note that its very existence is actually a bit of an anomoly due to the fact that in C, comparison testing is a statement. In Icon, the if construct (like most of Icon) is actually an expression. So you can do things like:

x[if y > 5 then 5 else y] := "Y" 

... which I find much more readable than a ternery comparison operator. :-)

There was a discussion recently about the possibility of adding the ?: operator to Icon, but several people correctly pointed out that there was absolutely no need because of the way if works.

Which means that if you could do that in C (or any of the other languages that have the ternery operator), then you wouldn't, in fact, need the ternery operator at all.

If you and your workmates understand what they do and they aren't created in massive groups I think they make the code less complex and easier to read because there is simply less code.

The only time i think ternary operators make code harder to understand is when you have more than 3 or 4 in one line. Most people don't remember that they are right based precedence and when you have a stack of them it makes reading the code a nightmare.

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