삼항 연산자? : 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
'ProgramingTip' 카테고리의 다른 글
유용한 Eclipse 기능? (0) | 2020.11.09 |
---|---|
배열에서 가장 긴 찾기 찾기 (0) | 2020.11.09 |
주어진 파일을 포함하는 파일 시스템의 크기와 여유 공간 찾기 (0) | 2020.11.09 |
설치 후 awscli가 경로에 추가되지 않음 경고 (0) | 2020.11.09 |
SDK에서 ASCII가 아닌 문자 (0) | 2020.11.09 |