本帖最后由 TBG3 于 2017-4-6 11:46 编辑
好像本论坛大多数程序员不记优先度,用括号来表达。当然是一种解决办法。但是你读别人的程序时呢? 人家不加括号你怎么办?
记的方法,扎实的办法就是死记,效果最好,这里就不做详细介绍了。
就介绍一种简单的方法,就五条。
一是单目运算符,包括数组,结构,++ -- ~ !之类,最优先。 因为神是唯一的神,所以好好敬服他吧。
第二是运算次优先,+ - * / << >>,因为资本主义世界,你要算清楚,不然肯定亏。注意这里面移位最不优先,因为人都不乐意地位变化。
第三是关系优先于逻辑,所以 > < == != 优先于与或非,与或非里面,个数多的,优先单个的,也就是说 & | 优先于 && ||
第四就是 赋值最不优先,因为等你都做出来之后,才会赋予你报酬。注意,因为 ? :里面有关系,所以在赋值里面最优先。
第五条是 单目里面的优先度,和2,3,4里面的优先度是一样一样的,赋值里面的优先度也跟2,3是一样一样的。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
这个答案很好,很强大。
tcc是属于GCC,因为它小,我以我爱用。你用GCC编译,得出的结论估计是一样的。GCC不规范?或许吧……
针对这样的代码,我只说,这个代码是不符合MISRA规范的,但是是符合C语言规范的。MISRA不允许有歧义的语句,所以,我是不会写这样的代码的。
打开我的Chrome,按下F12,开启Javascript调试,这个优先级啥的全部都继承自C,看看它怎么说吧:
谷歌你傻了?怎么就选了不规范的当参照呢?
bb.JPG (23.02 KB, 下载次数: 0)
下载附件
2017-4-7 10:13 上传
但是在编程语言里面,这个东西叫做二义性。
就是一个语句里面有多种意思。这是编程语言竭力想阻止的。
一个语句就应该明白无误的是一个意思。
++ -- 会造成二义性。所以,用++ -- 尽量减少二义性。
各种规范已经很严谨了,但是再严谨的规范,也会产生二义性。
更何况,这世界上有很多不遵守规范的东西存在。
所以,熟悉规范,熟悉你的编译器,竭力避免二义性的产生。
因为程序是个很严谨的东西,一点点不同,最终会导致结果的大不同。
我是SB,又把你的代码在Keil MDK下跑了一遍,一个是优化等级0,一个是优化等级3:
大概优化等级3是符合规范的,优化等级0是不符合规范的吧。
我的意思其实很简单,不要被各种不确定因素所束缚(优先级、未定义行为)。其实C规范就是非常非常不严谨的,想要严谨,你可以参考下ADA系列语言(Pascal/Delphi、VHDL等等),写得非常严谨而繁琐,一旦有歧义(语言本身的歧义很少了,主要是函数重载类型包含)编译器就会抱怨报错。但是C系列不会,他会按自己的理解去完成,结果吃亏的是码农自己。
ddd.jpg (86.75 KB, 下载次数: 0)
下载附件
优化等级3
2017-4-7 10:35 上传
我用了两种编译器,一种是keil, 另外一种是 MPLAB X.
keil 结果和你的一样,都是a=4, b=6;
而mplab x 上,却是b=3; 不知道哪种符合C的规范。让我先查一查吧。
再加:我的这两个结果里面,优化程度都是0.
t.jpg (56.84 KB, 下载次数: 0)
下载附件
2017-4-7 11:17 上传
我同意你后半句:
C本身不严谨。(其实相对于国人的不严谨性,C已经非常非常严谨了)。
实际上,编程语言作为人类的语言,必然有不严谨性。
但是程序目前必须有确定的结果。将来或许程序可以有不确定的结果。
但是,就目前而言,程序必须有确定性。所以,必须清楚了解规范,了解编译器的具体行为,在编程时, 才能尽量减少这种二义性。才能有一个确定的结果。
一周热门 更多>