6.4 条件运算符
Objective-C语言中最普通的运算符很可能是一种名为关系运算符的运算符。与Objective-C中的其他运算符不同(它们不是一元运算符就是二元运算符),关系运算符是三元运算符;就是说,它要接受3个运算数。用于表示这种运算符的两个符号是问号(?)和冒号(:)。第一个运算数放在?之前,第二个运算数放在?与:之间,而第三个运算符放在:之后。
条件运算符的一般格式为:
condition?expression1:expression2
在这个语法中,condition表示一个表达式,通常是关系表达式,只要遇到关系运算符,Objective-C系统就会先对它求值。如果condition求值的结果是TRUE(就是说,它是非零的),将执行expression1而且其结果将成为该运算的结果。如果condition的求值结果为FALSE(就是说,它是零),将执行expression2,而且它的结果会成为该运算的结果。
条件表达式最常用在根据条件将两个值中的一个指派给变量时。例如,假设有一个整型变量x和另一个整型变量s。如果希望在x小于0时将-1指派给s,否则将x2的值指派给s,可以写成以下语句:
s=(x<0)?-1:x*x;
执行上述语句时,首先要测试条件x<0。通常在条件表达式两边放置圆括号来增强语句的可读性。虽然,这一般不是必需的,因为条件运算符的优先级非常低,实际上,它低于其他所有运算符的优先级,但赋值运算符和逗号运算符除外。
如果x的值小于0,就会求?之后表达式的值。这个表达式仅仅是常量整数值-1,它将在x小于0时指派给变量s。
如果x的值不小于0,将求:之后的表达式的值,并将该值赋值给s。因此,如果x大于或等于0,将把x*x(或x2)的值指派给s。
作为使用条件运算符的另一个例子,使用以下语句将a和b的最大值指派给变量max_value:
max_value=(a>b)?a:b;
如果在:(即“else”部分)之后使用表达式包含另一个条件运算符,就可以达到else if子句的效果。例如,代码清单6-6中实现的sign函数可以使用两个条件运算符写到一个程序行上,如下所示:
sign=(number<0)?-1:((number==0)?0:1);
如果number小于0,将给sign指派值-1;否则,如果number等于0,将给sign指派值0;否则,将给它指派值1。上面的表达式中,“else”部分两旁的圆括号实际上是不必要的。这是因为条件运算符是从右到左结合的,这意味着在单个表达式中可以使用多个运算符,如在
e1?e2:e3?e4:e5
中,条件运算符从右到左结合,因此用以下形式求值:
e1?e2:(e3?e4:e5)
条件表达式并非必须用在赋值运算符的右边,它们可以用在可以使用的表达式的任何位置。这意味着可以在没有将变量number的符号指派给变量的情况下使用NSLog语句来显示它,如下所示:
NSLog(@“Sign=%i”,(number<0)?-1
:(number==0)?0:1);
使用Objective-C编写预处理程序宏指令时,条件预算符非常便利。可以在第12章“预处理程序”看到它们的详细内容。