标题:C语言库操作符的优先级#怎么记忆
水墨不写bug
(图片来源于网络)
(一)什么是操作符
我们知道,C程序是由符号(token)组成的,正如一本书是由一个一个单词所组成的一样。“符号”,指的是程序的一个基本组成单元,其作用相当于一个句子中的单词,同时:一个单词 无论出现在哪个句子中,它代表的意思 都是一样的。不同的单词 相互组合 组成一个句子,这个句子就有了自己的句意,这个 “ 句子 ” 也就是C程序中的 “ 语句 ” 。
今天分享的 “ 操作符 ” 就属于 “ 符号 ” 。
(二)怎么记忆操作符的优先级
C语言的操作符很多,并且很杂。
真的如此吗,当你认真阅读本文后,你或许会质疑曾以为的很杂很乱的想法!
(2)两个角度
i,恰当分组 && 构建框架
在现实中,我们建造房子,为什么不是建造一间屋子,装修一间屋子;或者说,建造一层,装修一层?
我们往往发现:建房子往往是先建造好框架,再在内部装修,再刻画细节。可是为什么?
你可能会问:“这毋庸置疑啊,因为都是这样做的。”
但你有没有想过:因为我们从来就不是建房子的人,所以从来没有想过房子为什么这样建,所以,我想分享的是:如何理解记忆住在 “ 操作符大厦 ” 的每一个操作符间的关系。
我们可以把操作符优先级表的结构想象成一个框架,如果我们对这个结构大框架十分熟悉,那么接下来,我们只需在这个框架里描绘细节。
我们先看一眼操作符表:
就看一眼,然后我们可以把它抽离为一个大框架:
“ 假操作符 ”
你会发现:
1.优先级最高者其实并不是真正意义上的运算符。
2.它们包括:数组下标,函数调用操作符,各结构成员选择操作符。
3.它们虽然被归结为操作符,但是与我们的对操作符如(++,--,*,>>等操作符)的理解差距较大。
于是,我把它称作:“ 假操作符 ”。
于是,第一层很好记,就是 “ 假操作符 ”的优先级相对于其他操作符最高。
单目操作符
单目操作符的操作数只有一个,与其他操作符有质的差距。
于是,第二层记作:“ 单目操作符 ”。(优先级位于 “ 假操作符之下 ”)
双目操作符
与单目操作符一样,操作数有两个,与其他操作数差距很大。
于是,第三层记作: “ 双目操作符 ”。
三目操作符
也就是条件操作符,是C语言仅有的一个操作符,但优先级比较低,在双目操作符之后。
于是,第四层记作: “ 三目操作符 ”。
赋值操作符(特殊处理的双目操作符)
赋值操作很常见,在运算中,我们总是希望在得到运算结果后赋值,于是优先级比较低。
你常见的 “ = ” ,优先级低于三目操作符。
于是,第五层记作: “ 赋值操作符 ”。
逗号操作符
逗号 “ , ” ,优先级最低。
于是第六层记作: “ 逗号操作符 ”。
细节描绘:(双目操作符)
在双目操作符内部:
(优先级)
算术操作符 > 移位操作符 > 关系操作符 > 逻辑操作符 。
同时:
1.在算数操作符中,遵循先乘除后加减的运算原则。
2.移位操作符只有一行。(很好记忆)
3.关系操作符中,“ 先判大小,再判等 ”。
4.逻辑操作符中优先级各不相同,这里水墨就不给出记忆例子了,你可以寻找自己的记忆方法。
ii,特殊关系 && 相对位置
假操作符与单目操作符我们很好记忆:
双目操作符我们只需记忆:
1.任何一个逻辑运算符的优先级低于任何一个关系运算符;
2.移位运算符的优先级比算术运算符要低,但是比关系运算符要高。
其余的操作符的关系我们可以根据:
“ 假操作符 ” > 单目操作符 > 双目操作符 > 三目操作符 > 赋值操作符 > 逗号操作符
来记忆。
什么是操作符运用错误
其实也就是,我们想要程序进行的操作 , 与程序实际的运行操作 不一致。
操作符运用错误的实例
在记住操作符的相对关系后,我们在写代码的时候无意识间仍会出现不易察觉的错误,于是我们可以收集一些操作符运用错误的实例:
e.g.1
while (c = getc(in) != EOF) { putc(c, out); }
(示例来源于《C陷阱与缺陷》)
在while语句中,c似乎是首先被赋予函数getc(in)的返回值,然后与EOF比较是否达到文件结尾以便决定是否终止循环。
然而,赋值运算符的优先级要低于任何一个比较运算符,因此c的值实际上是函数getc(in)的返回值与EOF比较的结果。
此处的函数getc(in)的返回值只是一个临时变量,在与EOF比较后就被“丢弃”了。
因此,最后得到的文件文件“副本”中只包含了一组二进制值为1的字节流。
我们在写代码的时候会出现各种错误,这些错误提醒我们要注意它们,它们促进我们写代码能力的迭代升级——因此,我们不应该抵制错误,而是接受自己写出的bug,解决它。
解决的方法有很多:
1.调试。
2.收集错误样例,提醒自己
在读完本文后,你是不是对c语言的操作符有了更深刻的认识呢?
完~
未经作者同意禁止转载
附页:操作符表
如图是C语言的 操作符 优先级表:(由上到下,优先级依次递减)
(符号间以 Tab 分开)
操作符 | 结合性 |
( ) [ ] -> . | 自左向右 |
! ~ ++ -- -(取相反数) (type)(强制类型转换) *(解引用) &(取地址) sizeof | 自右向左 |
*(乘法) / % | 自左向右 |
+ - | 自左向右 |
<< >> | 自左向右 |
< <= > >= | 自左向右 |
== != | 自左向右 |
& | 自左向右 |
^ | 自左向右 |
| | 自左向右 |
&& | 自左向右 |
|| | 自左向右 |
?: | 自右向左 |
=(赋值) | 自右向左 |
, | 自左向右 |