条件运算符的用法
条件运算符优先级高于赋值、逗号运算符,低于其他运算符。
C语言
运算符表达式为:表达式1?表达式2:表达式3
先求解表达式1,
若其值为真(非0)则将表达式2的值作为整个表达式的取值,否则(表达式1的值为0)将表达式3的值作为整个表达式的取值。
例如:
1、max=(a>b)?a:b
就是将a和b二者中较大的一个赋给max。
2、min=(a
就是将a和b二者中较小的一个赋给min。
优先级
条件运算符优先级高于赋值、逗号运算符,低于其他运算符
例如:
⑴ m
⑵ a++>=10 && b-->20 ? a : b
等价于:(a++>=10 && b-->20) ? a : b
⑶ x=3+a>5 ? 100 : 200
等价于:x= (( 3+a>5 ) ? 100 : 200 )
结合性
条件运算符具有右结合性
当一个表达式中出现多个条件运算符时,应该将位于最右边的问号与离它最近的冒号配对,并按这一原则正确区分各条件运算符的运算对象。
例如:
w
与 w
与 (w
形式关系表达式 ? 表达式1 : 表达式2
求值规则
求解关系表达式,根据关系表达式的布尔值决定取值:关系表达式的值为true时取表达式1的值;关系表达式的值为false时取表达式2的值。
说明
1、条件运算符的优先级低于关系运算符和算术运算符,高于赋值运算符。
2、JAVA中条件运算表达式中的关系表达式值的类型必须为布尔类型,只能是true或false。3、结合性也是右结合性。
4、与C语言不同的是,JAVA中条件表达式的值必须参与运算。
publicstaticvoidmain(String[]args){
inta=10,b=20,y;
a>b?(y=a):(y=b);//1,这样写是错误的
y=a>b?a:b;//2,这样写是正确的
y=a
}
}
以上程序中,1处错误是由于条件表达式的值没有参与运算,不能构成语句。3处(b《c?a:c)先结合,再将这个值参与到另一个条件运算中去,是合法的,这也说明了条件运算符的右结合性。
运算符妙用
——用条件表达式判断输出单词的单复数。
程序示例:ChooseDemo05.java
程序中会自动根据apples的个数来输出单词的单数或复数。
publicclassChooseDemo05{
publicstaticvoidmain(String[]args){
intapples=1;//苹果的个数
System.out.println(“Ihave”+apples+“apple”+(apples==1?“。”:“s.”));
}
}
当然,还有其他的应用:
1、 在某些地方使用“他”还是“她”。
2、日期输出时决定使用后缀“st”、“nd”等。
在标准C语言的文档里,对操作符的结合性并没有作出非常清楚的解释。一个满分的回答是:它是仲裁者,在几个操作符具有相同的优先级时决定先执行哪一个。
每个操作符拥有某一级别的优先级,同时也拥有左结合性或右结合性。优先级决定一个不含括号的表达式中操作数之间的“紧密”程度。例如,在表达式a*b+c中,乘法运算的优先级高于加法运算符的优先级,所以先执行乘法a*b,而不是加法b+c。
但是,许多操作符的优先级都是相同的。这时,操作符的结合性就开始发挥作用了。在表达式中如果有几个优先级相同的操作符,结合性就起仲裁的作用,由它决定哪个操作符先执行。像下面这个表达式:
int a, b=1, c=2;
a=b=c;
我们发现,这个表达式只有赋值符,这样优先级就无法帮助我们决定哪个操作先执行,是先执行b=c呢,还是先执行a=b?如果按前者,a的结果为2,如果按后者,a的结果为1。 所有的赋值符(包括复合赋值)都具有右结合性,就是说在表达式中最右边的操作最先执行,然后从右到左依次执行。这样,c先赋值给b,然后b再赋值给a,最终a的值是2。类似地,具有左结合性的操作符(如位操作符“&”和“|”)则是从左至右依次执行。
所以,遇到一个表达式时,先根据运算符的优先级将表达式拆分成几个子表达式,然后在每个子表达式中根据运算符的结合性来进一步确定执行的顺序。
【特殊情况】 看下面这个C表达式:
a+++b;
结果是(a++)+b还是a+(++b)呢?答案是前者,因为在遇到这种情况时,C编译器会将表达式按照从左往右的顺序尽量匹配出一个子表达式,所以当C编译器遇到a且后面有3个+号时,会首先尝试匹配a+++,当然这是没有意义的,所以接着尝试a++发现这是有意义的匹配,因此确定a++为第一个子表达式,然后再接着匹配+号和b。因此结果是(a++)+b。
这种情况不能算是上面所讨论的运算符优先级和结合性的特例,因为它发生在优先级和结合性判断之前,但确实具有一些迷惑性,所以建议在遇到这种情况时给其加上括号,以增加可读性且避免可能发生的不必要的错误。
JAVA语言
C运算符的结合方向
评论
查看更多