跳至内容

Ternary Operator ?:

三元运算符?:

三元运算符的一般形式如下:

expression1 ? expression2 : expression3

对于第一个操作数——“expression1”,可以使用任何返回布尔值的表达式。如果结果为真,则执行第二个操作数,即“expression2”。

如果第一个操数为假,则执行第三个操作数——“expression3”。第二个和第三个操作数,即“expression2”和“expression3”,必须返回相同类型的值,且不得是空值类型。条件运算符的执行结果取决于expression1的结果,要么是expression2的结果,要么是expression3的结果。

//--- normalize difference between open and close prices for a day range
double true_range = (High==Low)?0:(Close-Open)/(High-Low);

这相当于以下代码:

double true_range;
   if(High==Low)true_range=0;               // if High and Low are equal
   else true_range=(Close-Open)/(High-Low); // if the range is not null

运算符使用限制

根据“expression1”的值,运算符必须返回两个值之一——“expression2”或“expression3”。这些表达式有一些限制:

  1. 不要将用户定义类型简单类型枚举混合使用。空值可以用于指针
  2. 如果值类型是简单的,运算符将采用最大类型(参见类型转换)。
  3. 如果其中一个值是枚举,另一个是数值类型,则枚举将被int替换,然后应用第二条规则。
  4. 如果两个值都是枚举,它们的类型必须相同,运算符将属于枚举类型。

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

  1. 类型必须相同,或者一个应从另一个派生。
  2. 如果类型不相同(继承),则子类型将隐式转换为父类型,即运算符将具有父类型。
  3. 不要混合对象和指针——两个表达式必须是对象或指针空值可以用于指针。

注意

在使用条件运算符作为重载函数的参数时需要注意,因为条件运算符的结果类型是在程序编译时定义的。这种类型是根据“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);   // warning on implicit casting to string
   func(!Expression1?Expression2:Expression3);  // warning on implicit casting to string
  }

//   Result:
//   double argument: 3.141592653589793
//   string argument: 3.1415926
//   string argument: 3.141592653589793
//   string argument: 3.1415926

另请参阅

变量初始化变量的可见性范围与生命周期对象的创建与删除

最后更新于