3진 연산자 ?:

3차 연산자의 일반적인 형태는 다음과 같습니다:

표현식? 표현식: 표현식3

첫 번째 피연산자 - "표현식1" - bool 유형 값이 되는 표현식을 사용할 수 있습니다. 결과가 true이면, 두 번째 피연산자에 의해 설정된 연산자, 즉 "표현식2"가 실행됩니다.

첫 번째 피연산자가 false이면, 세 번째 피연산자 - "표현식3"가 수행됩니다. 두 번째와 세 번째 피연산자, 즉 "식2"와 "식3"는 한 유형의 값을 반환해야 하며 void 유형이어서는 안됩니다. 조건부 연산자 실행의 결과는 표현식1의 결과에 따라 표현식2의 결과 또는 표현식3의 결과입니다.

//--- 일일 시가와 종가의 차이를 정상화
double true_range = (High==Low)?0:(Close-Open)/(High-Low);

이 항목은 다음과 같습니다:

   double true_range;
   if(High==Low)true_range=0;               // 고가와 저가가 동일한 경우
   else true_range=(Close-Open)/(High-Low); // if the range is not null

 

연산자 사용 제한 #

연산자는 "표현식1" 값을 기반으로 "표현식2" 또는 "표현식3" 중 하나를 반환해야 합니다. 이러한 표현식에는 몇 가지 제한이 있습니다:

  1. 사용자 정의 유형단순 유형 또는 열거형을 함께 사용하지 마십시오. NULLpointer에 사용할 수 있습니다.
  2. 값 유형이 단순할 경우 연산자는 최대 유형이 됩니다(Type casting 참조).
  3. 값 중 하나가 열거형이고 두 번째 값이 숫자형이면 열거형이 int로 대체되고 두 번째 규칙이 적용됩니다.
  4. 두 값이 모두 열거형이면 유형이 동일해야 하며 연산자는 열거형입니다.

사용자 정의 유형 제한(클래스 또는 구조):

  1. 유형은 동일해야 하며 그렇지 않으면 다른 유형에서 파생되어야 합니다.
  2. 유형이 동일하지 않으면(상속) 자식 항목이 부모 유형으로 암시적으로 캐스팅됩니다. 즉, 연산자가 부모 유형이 됩니다.
  3. 개체와 포인터를 혼합하지 마십시오. 두 식 모두 개체 또는 포인터여야 합니다. NULL은 포인터용으로 쓰일 수 있습니다.

참고

조건부 연산자를 오버로드된 함수의 인수로 사용할 때는 프로그램 컴파일 시 조건부 연산자의 결과 유형이 정의되므로 주의하십시오. 그리고 이 유형은 "표현식2"와 "표현식3" 중 큰 유형으로 결정됩니다.

예제:

void func(double d) { Print("double argument: ",d); }
void func(string s) { Print("string argument: ",s); }
 
bool   Expression1=true;
double Expression2=M_PI;
string Expression3="3.1415926";
 
void OnStart()
  {
   func(Expression2);
   func(Expression3);
 
   func(Expression1?Expression2:Expression3);   // 문자열에 암시적 캐스팅에 대한 경고
   func(!Expression1?Expression2:Expression3);  // 문자열에 암시적 캐스팅에 대한 경고
  }
 
//   Result:
//   double argument: 3.141592653589793
//   string argument: 3.1415926
//   string argument: 3.141592653589793
//   string argument: 3.1415926

더 보기

변수 초기화, 가시성 범위 및 변수 수명, 오브젝트 생성 및 삭제