假设操作符?:

三进制操作符一般形式如下:

expression1? expression2:expression3

对于第一个操作-"expression1"-任何表达式在布尔型中值都可以用。如果结果是true,那么第二个操作的操作符,例如 "expression2",就被执行。

如果第一操作是false,第三操作-"expression3"-就被执行。第二和第三操作,例如 "expression2"和"expression3"应该返回第一类型值,不应该是类型。执行假设操作符的结果就是expression2的结果或者expression3的结果,都取决于 expression1。

//--- 一天中开盘价和收盘价的标准化不同点
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); // 如果范围无效

 

操作符使用限制 #

基于"expression1"值,操作符必须返回两个值中的一个 - 或者"expression2"或者"expression3"。对这些表达式有几个限制:

  1. 不要混淆 简单类型枚举类型用户定义类型NULL 可能被用于指针.
  2. 如果值是简单类型,操作符将会是最大类型(请见类型转换 )。
  3. 如果一个值是枚举类型而第二个值是数字类型,那么枚举类型被整型所取代并实施第二个规则。
  4. 如果两个值都是枚举类型,它们的类型必须完全相同,并且操作符将是枚举类型。

限制用户定义类型(类或结构):

  1. 类型必须完全相同或者一个应该源自另一个。
  2. 如果类型不相同(继承类型),那么子类型会隐式转换至父类型,例如操作符将成为父类型。.
  3. 不要混淆对象和指针 - 两个表达式都是或是对象或是 指针NULL 不能用于指针。

注意

谨慎使用条件操作符当做重载函数的论据, 因为条件操作符的结果类型在程序编译时定义。并且该类型定义为较大的"expression2"和"expression3"。

示例:

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);  // 隐式转换到字符串的警告
  }
 
//   结果:
//   double argument: 3.141592653589793
//   string argument: 3.1415926
//   string argument: 3.141592653589793
//   string argument: 3.1415926

另见

变量初始化可见范围和变量使用期创建和删除对象