ProgramingTip

삼항 연산자? : vs if… else

bestdevel 2020. 11. 9. 20:05
반응형

삼항 연산자? : vs if… else


C ++에서? : 연산자가 if () ... else 문보다 빠릅니까? 어디에있는 코드에 차이점이 있습니까?


컴파일러에 따라 다르지만 최신 컴파일러는 일반적으로 차이가 없습니다. 그것은 당신이 걱정하지 말아야 할 것입니다. 코드의 유지 관리에 집중하십시오.


빠르지 언어. 일부 사용에 따라 상수 변수를 초기화 할 수있는 경우 한 가지 차이점이 있습니다.

const int x = (a<b) ? b : a;

.NET으로 동일한 작업을 수행 할 수 없습니다 if-else.


나는 GCC가 조건부 연산자를 cmov(조건부 이동) 명령으로 바꾸는 동안 if문을 분기로 바꾸는 것을 보았습니다 . 이것은 우리의 경우 조건부 연산자를 사용할 때 코드가 더 빠르다는 것을 의미합니다. 그러나 그것은 몇 년 전이 공인 된 것입니다.

동일한 코드로 모든 것이 보장되지 않습니다. 당신은 항상 다음 성능, 필요한 경우 조치를 . 그리고 측정하여 1. 코드가 너무 느리고 2. 범인이되는 것은 특정 코드 덩어리라는 것을 알았을 때 컴파일러가 생성 한 어셈블리 코드를 연구하고 무슨 일이 일어나고 있는지 직접 확인하십시오.

"조건부 연산자를 사용하면 컴파일러가 항상 더 효율적인 코드를 생성합니다"와 같은 황금 규칙을 신뢰하지 않습니다.


동일하지만 삼항 연산자는 / else를 사용하기 어려운 곳에서 사용할 수 있습니다.

printf("Total: %d item%s", cnt, cnt != 1 ? "s" : "");

if / else로 그 문을 실행하면 매우 다른 코드가 생성됩니다.


8 년 후 업데이트 ...

실제로 이것이 더 나을 생각합니다.

printf(cnt == 1 ? "Total: %d item" : "Total: %d items", cnt);

(실제로 첫 번째 노드의 "% d"를 "하나"로 확신합니다.)


약간 왼손잡이가 되려면 ...

x ? y : x = value

할 할당 Y 경우 , X는 0 (거짓) 아니다.


의미있는 코드에 관계없이 의미 상 다른 것입니다. <cond>?<true expr>:<false expr>표현이고 if..else..,이다.

조건식의 구문이 어색해 보이지만 좋은 것입니다. a를 제공해야 <false expr>하며 두 개의 임시은 유형 검사입니다.

에 해당하는 if..else..리스프와 같은 표현 기반, 기능적 언어는, 하스켈은 ? :대신, C ++에서 if..else..문.


모든 것을 입력해야하는 것은 아닙니다.

x = y==1 ?
    2
    :// else
    3;

두 가지 모두 x가 할당되는 것을 즉시 알 수 있기 때문에 if / else보다 훨씬 더 명확합니다.


이제 도움을 드릴 수 없습니다. 그 아래에있는 2 개의 차 질문에 도움을 드릴 수 있습니다. 사용 하시겠습니까? 의견을 제안합니다.

내가 말할 수있는 것은 삼항을 언제 사용할 지에 대해 매우 현명 해지십시오. : 운영자. 가독성에 대한 저주만큼이나 축복이 될 수 있습니다.

사용하기 전에이 정보가 더 읽기 쉬운 지 자문 해.

int x = x == 1 ? x = 1 : x = 1;

if (x == 1)
{
   x = 1
}
else
{
   x = 2
}

if (x == 1)
    x = 1
else
    x = 1

예 코드를 100 % 가짜로 만드는 것은 어리석은 것입니다. 그러나 그 작은 트릭은 내가 코드의 가독성을 분석하는 데 도움이되었습니다. 내용이 아니라이 샘플에서 보는 연산자의 가독성입니다.

깨끗해 보이지만 보통의 변기와 문 손잡이도 그렇습니다.

거의 내 경험상, 3 항 연산자에서 필요한 정보를 신속하게 인도 할 수있는 사람은 거의 없습니다. 100 % 더 낫다고 확신하지 않는 한 피했습니다. 도청이 쓰레기 때 고치는 것도 고통 스럽습니다.


대부분의 컴파일러와 대상 플랫폼에서 "if"가 더 빠른 경우? :가 더 빠른 경우가있을 경우 예상합니다. 한 양식이 다른 양식보다 다소 간결한 경우도 있습니다. 어떤 경우에 한 형식을 선호하는지 또는 다른 형식은 컴파일러와 플랫폼에 따라 진행됩니다. 기능 마이크로에서 성능이 중요한 코드를 작성하는 경우 컴파일러가 각 경우에 생성하는 내용을 살펴보고 어느 것이 더 나은지 확인합니다. "주류"는 PC에서 캐싱 문제로 인해 어떤 것이 더 나은지 확인하는 유일한 방법은 실제 응용 프로그램과 방식 방식으로 두 형식을 벤치마킹하는 것입니다.


CA에서 삼항 연산자 "? :"는 다음 형식의 조건식을 구성하는 데 사용할 수 있습니다.

exp1 ? exp2:exp3

여기서 exp1, exp2 및 exp3은 여기서입니다.

예를 들어

        a=20;
        b=25;
        x=(a>b)?a:b;

        in the above example x value will be assigned to b;

다음과 같이 if..else 문을 사용하여 사용할 수 있습니다.

            if (a>b)
             x=a;
             else
             x=b;

** 따라서 둘 사이에는 차이가 없습니다. 이 프로그래머가 쉽게 사용할 수 있습니다. *


몇 년 전 기억이 안 나는 일부 코드를 뒤집는 동안 기계 코드 사이에 한 줄 차이가 있음을 보았습니다. 그리고 if-else.Don't remember much but it is clear that implementation of both is different.

그러나 효율성 중 하나를 선택하지 말고 코드의 가독성이나 편의에 따라 선택하는 것이 좋습니다. 해피 코딩


삼항 연산자는 항상 값을 반환합니다. 따라서 결과에서 일부 출력 값을 원하고 삼항 연산자를 사용하는 것이 항상 두 가지 조건 만있는 상황에서. 위에 언급 된 조건 중 하나라도 참이 아닌 경우를 사용하십시오.


나는 그것이 작동하는 범위 때문에 인라인 if가 "더 빠른"코드를 산출 할 수있는 상황이 있다고 생각한다. 개체 생성 및 파괴는 비용이 많이들 수 있으므로 다음 시나리오를 고려하십시오.

class A{
    public:
    A() : value(0) {
        cout << "Default ctor" << endl;
    }
    A(int myInt) : value(myInt)
    {
        cout << "Overloaded ctor" << endl;
    }

    A& operator=(const A& other){
        cout << "= operator" << endl;
        value = other.value; 
    }

    ~A(){
        cout << "destroyed" << std::endl;
    }

    int value;

};


int main()
{
   {
       A a;
       if(true){
           a = A(5);
       }else{
           a = A(10);
       }
   }

   cout << "Next test" << endl;
   {
        A b = true? A(5) : A(10);
   }
   return 0;
}

이 코드를 사용하면 출력은 다음과 같습니다.

Default ctor                                                                                                                                                                                                                      
Overloaded ctor                                                                                                                                                                                                                   
= operator                                                                                                                                                                                                                        
destroyed                                                                                                                                                                                                                         
destroyed                                                                                                                                                                                                                         
Next test                                                                                                                                                                                                                         
Overloaded ctor                                                                                                                                                                                                                   
destroyed  

따라서 if를 인라인하면 .NET a과 동일한 범위에서 유지하는 데 필요한 많은 작업을 절약 할 수 b있습니다. 두 시나리오에서 조건 평가 속도가 거의 같을 가능성이 높지만 범위를 변경하면 피할 수있는 경우 인라인을 고려하여 다른 요소를 고려해야합니다.


아니요, 정확히 동일한 실행 코드로 변환됩니다.

참고 URL : https://stackoverflow.com/questions/3565368/ternary-operator-vs-if-else

반응형