【C语言】操作符的优先级#怎么记忆

标题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

自右向左

*(乘法)        /        %

自左向右

+        -

自左向右

<<        >>

自左向右

<        <=        >        >=

自左向右

==        !=

自左向右

&

自左向右

^

自左向右

|

自左向右

&&

自左向右

||

自左向右

?:

自右向左

=(赋值)

自右向左

自左向右                                

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水墨不写bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值