众嘲炮:如何记C语言的运算符优先度

2019-12-27 18:54发布

本帖最后由 TBG3 于 2017-4-6 11:46 编辑

好像本论坛大多数程序员不记优先度,用括号来表达。当然是一种解决办法。但是你读别人的程序时呢? 人家不加括号你怎么办?

记的方法,扎实的办法就是死记,效果最好,这里就不做详细介绍了。

就介绍一种简单的方法,就五条。

一是单目运算符,包括数组,结构,++ -- ~ !之类,最优先。 因为神是唯一的神,所以好好敬服他吧。

第二是运算次优先,+ - * / <<  >>,因为资本主义世界,你要算清楚,不然肯定亏。注意这里面移位最不优先,因为人都不乐意地位变化。

第三是关系优先于逻辑,所以 > < == != 优先于与或非,与或非里面,个数多的,优先单个的,也就是说 & | 优先于 && ||

第四就是 赋值最不优先,因为等你都做出来之后,才会赋予你报酬。注意,因为 ? :里面有关系,所以在赋值里面最优先。

第五条是 单目里面的优先度,和2,3,4里面的优先度是一样一样的,赋值里面的优先度也跟2,3是一样一样的。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
99条回答
TBG3
1楼-- · 2020-01-05 23:29
takashiki 发表于 2017-4-7 09:31
嗯,好吧。
我又编辑了下,加入了“再比如:a = 1, a = a++ + a++ + a++; 请求出a”。至少我在不同的编译 ...



后置是非常安全的。

后置要在表达式计算完之后,再自增。这在C里面定义的非常清楚。

你的这个表达式,可能混淆在于 a.

a= a++ + a++ +a++;

在这个算式里面,编译器是处理

a= 3;

a++;

a++ ;

a++;

还是处理

a++;

a++;

a++;

a=3;

这个好像的确有歧义。

但是,如果算式是这样的;

a=1; b = a++ + a++ + a++;

那b铁定是3.

TBG3
2楼-- · 2020-01-06 02:03
takashiki 发表于 2017-4-7 09:38
你倒是算出个结果出来啊。
你算出来a是等于0还是等于1啊,不同的编译器会给出不同的结果哦,我看看您属于 ...

这个已经解释过了。

a =  a++; 不同的编译器会产生歧义。
takashiki
3楼-- · 2020-01-06 04:35
 精彩回答 2  元偷偷看……
takashiki
4楼-- · 2020-01-06 08:23
补充图片:

aa.jpg (47.4 KB, 下载次数: 0)

下载附件

2017-4-7 09:47 上传

TBG3
5楼-- · 2020-01-06 10:13
而真正在应用中,出问题的反而是这个(一般不会遇到a=a++;不会这么写):
x=1;
y = x +(++x);
是先算++x呢,还是后算呢? C也没有定义清楚。

但是 y=x+++x; 铁定是 y = (x++)+x; 因为编译器采用贪婪原则,能多处理,就多处理。所以 a+++++b, 是先两个++ ,最后才是 + 。

TBG3
6楼-- · 2020-01-06 14:36
takashiki 发表于 2017-4-7 09:47
补充图片:

我只能说它不符合规范。

一周热门 更多>