百科问答小站 logo
百科问答小站 font logo



C语言里a>b?a<c?a:b:c;这个怎么该判断? 第1页

  

user avatar   amanjiang 网友的相关建议: 
      

恕我直言,从业十年读过的代码也不少,没见过谁这样写。把一个三元操作符构成的表达式作为另一个三元操作符的子表达式,竟然还不用小括号分开,如果谁在项目里这样写,估计会遭千夫指。

代码的可读性怎么强调都不为过。例如:

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:在同一个语句里面,包含对同一个变量的多次读、写操作。

如果你的课本里有这种题目,赶快撕掉,不要遗祸人间。


注:本回答用一种夸张的语气来强调代码的可读性,纯属个人观点,请根据个人口味适量添加;真正的答案请参考其它回答。


user avatar   pansz 网友的相关建议: 
      

这个,其实是比较正常的嵌套判断写法,只有实际应用中会有人写的。算法竞赛中很可能会有人这么写。不过在试题跟考试中应该很少出现,除非写这个试题的人恰好是算法竞赛出身。

简单说就相当于: if (a>b) { if (a<c) a else b } else c

也就说这是两层 if 嵌套,不是 else if

当然,类似的写法可以拓展成 三层四层甚至更多层,如果特定的算法需要这么写的话。

三元操作符的低优先级是明确定义的,所以并不需要额外的括号,抱怨这个括号问题的人,恐怕就连三元操作符也不希望你使用。

这种用法一般只会用来写特定的算法,算是攻坚项目,普通的工程项目中很难会用到。写专用算法的人也不会是普通码农,所以不必介意他人的嘲讽。


说到这里,对于运算符问题,我个人的建议是:运算符的前两个类别跟最后两个类别建议记忆,中间的十个类别可以不必记忆。

也就是说,作为一个程序员,你必须知道什么运算符是优先级最高的几类,什么运算符是优先级最低的几类。其它的中间类别不需要记忆。

如果有的程序员教你「所有运算符优先级都不需要记忆」,我建议你转身就走,无视他们,因为如果你真的这么做,是根本写不出正常的代码的。

那么优先级最高的运算符类别是什么呢?

  • 括号与下标。例如 [] () . ->
  • 单目操作符,例如单目负号,单目感叹号,单目++,sizeof操作符等

那么优先级最低的运算法类别分别是什么呢?

  • 三元操作符,例如 ? :
  • 赋值操作符,例如 =, +=, -= 等等

当然,还有一些论外操作符,比如逗号,分号之类的,我们通常默认在考虑运算符优先级的时候是不会考虑逗号跟分号的。


为什么我会强调,对程序员来说,一部分运算符的优先级必须记忆?

对于 [] . -> 这些符号,如果你不知道它跟括号()运算符同级,你要么写出有歧义的代码要么搞错了优先级而不自知。

对于一些单目操作符,显而易见的具备高优先级,额外加括号不但不能提升代码可读性,反而降低了。

而对于赋值语句,如果你连「赋值语句运算符优先级很低」这个事实都不记忆,难道打算每次赋值都打括号?我没有见过如此深井病的程序员。可见很多程序员嘴上说不要,实际上还是会记得「赋值负号具有低优先级」这个客观事实。

而三元操作符,它就是贴近赋值语句的低优先级操作符,除了赋值语句,就是它最低。三元操作符的正常使用就不应当加括号,因为三元操作符把优先级设计得那么低就是为了让你不加括号的。


重申一下我的观点:不同语言运算符的类别可能有10到20种。虽然大多数运算符的优先级不需要专门记忆,但最高的几个级别以及最低的几个级别运算符,建议记忆,一般而言上三下三,或者上二下二就够了。




  

相关话题

  求教,atan2函数有什么简易的替代品? 
  C语言里a>b?a<c?a:b:c;这个怎么该判断? 
  码农们最常说的「谎言」有哪些? 
  为什么大多数程序主函数成功时都return 0; 不return 1; ? 
  C 语言执行 a=a++; 后,a 的值应该加一还是不变? 
  C++过于复杂为什么不被淘汰? 
  Rust有可能在嵌入式领域取代C的位置吗? 
  码农们最常说的「谎言」有哪些? 
  为什么 Windows 是用 C 语言编写的,却默认对文件大小写不敏感? 
  为什么C语言100*1.05=104? 

前一个讨论
有什么游戏推动了计算机图形学的发展?
下一个讨论
你们相信都美竹还是吴亦凡?





© 2024-06-26 - tinynew.org. All Rights Reserved.
© 2024-06-26 - tinynew.org. 保留所有权利