恕我直言,从业十年读过的代码也不少,没见过谁这样写。把一个三元操作符构成的表达式作为另一个三元操作符的子表达式,竟然还不用小括号分开,如果谁在项目里这样写,估计会遭千夫指。
代码的可读性怎么强调都不为过。例如:
Programs must be written for people to read, and only incidentally for machines to execute - «Structure and Interpretation of Computer Programs»
“程序是写给人看的,只是顺便用于机器执行”。
这种题目,简直迂腐。就像孔乙己的茴香豆。明白意思就行了,千万别照着做。读书学习尽量选经典教科书(的译本)。
比如一个表达式:
a + b * c - d / 2 * 5
乘法和加法的优先级哪个高,相信再初级的程序员也了如指掌;但并不妨碍我们把它写得更加清晰可读:
a + (b * c) - (d / 2 * 5)
两种写法别人都能读懂;但显然下面的写法,大脑处理时间更短。当项目规模越来越大时,一行代码节省一秒,整体上就能让大家早点下班享受人生。所以我们要鼓励养成一个好的习惯。
有些教材里还有一种题目,更是误人子弟,类似:
int a = 5; int b = ++a + a++;
看起来很高端,但其实这根本是 undefined behavior:在同一个语句里面,包含对同一个变量的多次读、写操作。
如果你的课本里有这种题目,赶快撕掉,不要遗祸人间。
注:本回答用一种夸张的语气来强调代码的可读性,纯属个人观点,请根据个人口味适量添加;真正的答案请参考其它回答。
这个,其实是比较正常的嵌套判断写法,只有实际应用中会有人写的。算法竞赛中很可能会有人这么写。不过在试题跟考试中应该很少出现,除非写这个试题的人恰好是算法竞赛出身。
简单说就相当于: if (a>b) { if (a<c) a else b } else c
也就说这是两层 if 嵌套,不是 else if 。
当然,类似的写法可以拓展成 三层四层甚至更多层,如果特定的算法需要这么写的话。
三元操作符的低优先级是明确定义的,所以并不需要额外的括号,抱怨这个括号问题的人,恐怕就连三元操作符也不希望你使用。
这种用法一般只会用来写特定的算法,算是攻坚项目,普通的工程项目中很难会用到。写专用算法的人也不会是普通码农,所以不必介意他人的嘲讽。
说到这里,对于运算符问题,我个人的建议是:运算符的前两个类别跟最后两个类别建议记忆,中间的十个类别可以不必记忆。
也就是说,作为一个程序员,你必须知道什么运算符是优先级最高的几类,什么运算符是优先级最低的几类。其它的中间类别不需要记忆。
如果有的程序员教你「所有运算符优先级都不需要记忆」,我建议你转身就走,无视他们,因为如果你真的这么做,是根本写不出正常的代码的。
那么优先级最高的运算符类别是什么呢?
那么优先级最低的运算法类别分别是什么呢?
当然,还有一些论外操作符,比如逗号,分号之类的,我们通常默认在考虑运算符优先级的时候是不会考虑逗号跟分号的。
为什么我会强调,对程序员来说,一部分运算符的优先级必须记忆?
对于 [] . -> 这些符号,如果你不知道它跟括号()运算符同级,你要么写出有歧义的代码要么搞错了优先级而不自知。
对于一些单目操作符,显而易见的具备高优先级,额外加括号不但不能提升代码可读性,反而降低了。
而对于赋值语句,如果你连「赋值语句运算符优先级很低」这个事实都不记忆,难道打算每次赋值都打括号?我没有见过如此深井病的程序员。可见很多程序员嘴上说不要,实际上还是会记得「赋值负号具有低优先级」这个客观事实。
而三元操作符,它就是贴近赋值语句的低优先级操作符,除了赋值语句,就是它最低。三元操作符的正常使用就不应当加括号,因为三元操作符把优先级设计得那么低就是为了让你不加括号的。
重申一下我的观点:不同语言运算符的类别可能有10到20种。虽然大多数运算符的优先级不需要专门记忆,但最高的几个级别以及最低的几个级别运算符,建议记忆,一般而言上三下三,或者上二下二就够了。