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”。这些表达式有一些限制:
- 不要将用户定义类型与简单类型或枚举混合使用。空值可以用于指针。
- 如果值类型是简单的,运算符将采用最大类型(参见类型转换)。
- 如果其中一个值是枚举,另一个是数值类型,则枚举将被int替换,然后应用第二条规则。
- 如果两个值都是枚举,它们的类型必须相同,运算符将属于枚举类型。
对于用户定义类型的限制(类或结构):
注意
在使用条件运算符作为重载函数的参数时需要注意,因为条件运算符的结果类型是在程序编译时定义的。这种类型是根据“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
另请参阅
最后更新于