条件运算符的用法详解:优先级、语法及实例分析
条件运算符的用法

条件运算符优先级高于赋值、逗号运算符,低于其他运算符。
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
等价于:如果 3+a 大于 5,那么 x 等于 100;如果 3+a 不大于 5,那么 x 等于 200。
结合性
条件运算符具有右结合性
当一个表达式里有多个条件运算符时,要把位于最右边的问号和离它最近的冒号配成一对,并且按照这一原则来准确区分各个条件运算符的运算对象。
例如:
与 w
与 (wJAVA语言
形式关系表达式 ? 表达式1 : 表达式2
求值规则
求解关系表达式,依据关系表达式的布尔值来确定取值。当关系表达式的值为 true 时,就取表达式 1 的值;而当关系表达式的值为 false 时,就取表达式 2 的值。
说明
条件运算符的优先级比关系运算符和算术运算符低,同时比赋值运算符高。
JAVA 中条件运算表达式里的关系表达式值的类型得是布尔类型,仅能是 true 或者 false。同时,其结合性为右结合性。
JAVA 与 C 语言不同。在 JAVA 中,条件表达式的值必须参与运算。
publicclassdemo{
公共静态 void 主函数(字符串数组 args){
inta=10,b=20,y;
a>b?(y=a):(y=b);//1,这样写是错误的
y=a>b?a:b;//2,这样写是正确的
y=a
以上程序中,一处错误在于条件表达式的值未参与运算,无法构成语句。三处(b《c?a:c)先进行结合操作,然后将此值参与到另一个条件运算中,这种情况是合法的,这体现了条件运算符的右结合性。
运算符妙用
——用条件表达式判断输出单词的单复数。
程序示例:ChooseDemo05.java
程序中会自动根据apples的个数来输出单词的单数或复数。
publicclassChooseDemo05{
publicstaticvoidmain(String[]args){
intapples=1;//苹果的个数
当然,还有其他的应用:
1、 在某些地方使用“他”还是“她”。
2、日期输出时决定使用后缀“st”、“nd”等。
C运算符的结合方向
标准 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。
这种情况不能算作上述所讨论的运算符优先级和结合性的特殊情形。因为它在优先级和结合性判断之前就已发生,不过确实具有一定的迷惑性。所以建议在碰到这种情况时,给它加上括号,这样既能增加可读性,又能避免可能出现的不必要错误。