?(条件操作符)
条件操作符接受三个操作数,它也会控制子表达式的求值顺序。下面是它的用法:
expression1?expression2 :expression3
条件操作符的优先级非常低,所以它的各个操作数即使不加括号,一般也不会有问题。但是,为了清楚起见,还是倾向于在它的各个表达式两端加上括号。
首先计算的是expression1的值,如果它的值为真(非零值),那么整个表达式的值就是expression2的值,expression3不会进行求值,但是,如果expression1的值是假(零值),那么整个表达式的值就是expression3的值,expression2不会进行求值。
什么时候该用到条件操作符呢,这里有两个程序片段:
if(a>5)
b=3;
else
b= -20;
---->
b=a>5?3 :-20;
这两段代码实现的功能完全相同,但左边的代码要两次书写b=,当然,这并没有什么大不了的,在这种场合使用条件操作符并无优势可言,但是,请看下面这条语句:
if(a>5)
b[2*c+d(e/5)] = 3;
else
b[2*c+d(e/5)] = -20;
---->
b[2*c+d(e/5)] = a>5?3:-20;
这个例子里使用条件操作符的好处就显而易见。
=====分割线=========
,(逗号操作符)
,操作符在有些场合相当有用,它的用法如下:
expression1,expression2,expression3,...,expressionN
逗号操作符将两个或者多个表达式分隔开来,这些表达式自左向右逐个进行求值,整个逗号表达式的值就是最后那个表达式的值。例如:
if(b+1,c/2,d>0)
如果d的值大于0,那么整个表达式的值就为真。当然,没有人会编写这样的代码,前两个表达式的求值毫无意义,它们的值只是简单地丢弃。但是,请看下面的代码:
a = get_value();
count_value(a);
while(a>0)
{
....
a = get_value();
count_value(a);
}
可以用逗号表达式,将代码改写成如下:
while(a=get_value(), count_value(a), a>0)
{
......
}
或者
while(count_value(a=get_value()), a>0)
{
.......
}
现在,循环中用于获得下一个值的语句只需要出现一次,逗号操作符使源程序更易于维护。
这里有一个技巧:
while(x<10)
b+=x,
x++;
在这个例子中,逗号操作符把两条赋值语句整合成一条语句,从而避免了在它们的两端加上花括号。不过,这并不是个好做法,因为逗号和分号的区别过于细微。