C语言中运算符的优先级问题(如何巧妙记忆运算符的优先级顺序)
文章目录
- C语言中的运算符
- C语言中运算符的优先级
- 帮助记忆优先级的方法
- 先粗分
- 再细分
- 最后吃透
- 因不明确优先级而造成的常见问题
C语言中的运算符
C语言中的运算符说多也多,说不多也不多,包括以下运算符:
运算符类别 | 运算符 |
---|---|
下标引用、函数调用和结构成员 | [ ]、( )、->、. |
单目运算符 | !、~、++、–、+、-、sizeof、(type)、*、& |
算术运算符 | +、-、*、/、% |
移位运算符 | <<、>> |
关系运算符 | >、>=、<、<=、==、!= |
位运算符 | &、^、| |
逻辑运算符 | &&、|| |
赋值运算符 | =、+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>= |
条件运算符(三目运算符) | exper1 ? exper2 : exper3 |
逗号运算符 | , |
C语言中运算符的优先级
C语言运算符优先级表(由上至下,优先级依次递减)
运算符 | 结合性 |
---|---|
( )、[ ]、->、. | L-R |
!、~、++、–、+、-、(type)、*、&、sizeof | R-L |
*、/、% | L-R |
+、- | L-R |
<<、>> | L-R |
<、<=、>、>= | L-R |
==、!= | L-R |
& | L-R |
^ | L-R |
| | L-R |
&& | L-R |
|| | L-R |
=、+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>= | R-L |
exper1 ? exper2 : exper3 | R-L |
, | L-R |
帮助记忆优先级的方法
先粗分
优先级最高的其实并不是真正意义上的运算符,包括数组下标、函数调用操作符和各结构体成员选择操作符。
单目运算符的优先级仅次于前述运算符,在所有真正意义是的运算符中,单目运算符的优先级最高。
优先级比单目运算符要低的,接下来就是双目运算符。
双目运算符之后就是三目运算符(条件运算符)。
优先级最低的就是逗号运算符了。
再细分
需要进一步细分的就是双目运算符了,我们需要记住:在双目运算符中,算术运算符的优先级最高,移位运算符次之,关系运算符再次之,接着就是位运算符,最后是逻辑运算符。
你们可能以为我忘了双目运算符中还有一个赋值运算符,其实赋值运算符算是一个特例:赋值运算符的优先级低于三目运算符(条件运算符)。
需要注意的最重要的两点是:
- 任何一个逻辑运算符或位运算符的优先级低于任何一个关系运算符。
- 移位运算符的优先级比算术运算符要低,但是比关系运算符要高。
最后吃透
在算术运算符中:*、/、%的优先级高于+、-运算符,这和我们平常的数学算式中要先算乘、除的规则可以对应起来。
在关系运算符中:==和!=的优先级要低于其他关系运算符。
在位运算符和逻辑运算符中:每个“与”运算符要比相应的“或”运算符的优先级高,而且按位异或(^)的优先级介于按位与(&)和按位或(|)之间。
因不明确优先级而造成的常见问题
假设hi和low是两个整数,它们的值介于0和15之间,如果r是一个8位(二进制位)整数,且r的低4位与low各位上的数一致,而r的高4位与hi各位上的数一致,那么r如何表示呢?
我们很容易想到这样一句代码:
r = hi<<4 + low;
这句代码的想法是正确的,但是不幸的是,“+”运算符的优先级高于“<<”运算符的优先级,所以这句代码等效于:
r = hi<<(4 + low);
所以正确写法应该是这样的:
r = (hi<<4) + low;
C语言中运算符的优先级问题(如何巧妙记忆运算符的优先级顺序)相关推荐
- C语言中几个容易踩的“坑”!
今天给大家分享几个C语言中的坑. 一.带参数的宏展开顺序 #include #define f(a,b) a##b #define g(a) #a #define h(a) g(a)int main( ...
- C 语言中负数移位运算讲解
C 语言中负数移位运算讲解 "<<".">>"为移位运算符. "<<"为左移位运算符,即数据字节中的每个 ...
- 一步带你了解C语言中++、--的使用方法!
一步让你了解C语言中++.--的使用方法! 一.前言 二.++.- -运算符 (1)前缀形式和后缀形式单独使用,并未出现在表达式中 (2)前缀形式后缀形式放入表达式中 三.代码实现 一.前言 C语言中 ...
- c语言整数除法转换成浮点型,C语言中的类型转换
在C语言中不同类型的数据也可以使用二元运算符进行运算,不过如果不明白其中的规律的话,编出来的程序就会有些危险了. 强制类型转换 自动转换类型 举个例子: /*测试数据的类型转换*/ #include ...
- 在c语言程序中 感叹号是什么,c语言中(感叹号!)是什么意思?
!表示逻辑非,是逻辑运算符,运算对象是真或假. 若表示a不等于0,就写成a!=0:假设a等于1,那a!=0:就是真的,true. C语言中的符号分为10类:算术运算符.关系运算符.逻辑运算符.位操作运 ...
- c语言中描述x和y都大于或等于z的表达式,C语言期末考试题含答案.doc
C语言期末考试题含答案 <C语言程序设计>期末试卷 一.单项选择题(10x2'=20') 1.以下叙述正确的是( ) A)C语言的源程序不必通过编译就可以直接运行. B)C语言中的每条可执 ...
- c语言表达式amp;amp;,C语言中的运算符及其优先级
C语言中的运算符及其优先级 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 () 圆括号 (表达式)/函数名(形参表) . 成员选择(对象) 对 ...
- c语言中赋值的时候顿号的作用,C语言运算符及其优先级汇总表口诀
在看一些字符串问题的时候,经常出现这样的语句, *tmp++ = *p;比如tmp和p是指向数组元素的指针,那么这个语句的执行顺序是怎样的呢?正确的理解是*tmp,将*p赋给*tmp后tmp++.但是 ...
- c语言中赋值的时候顿号的作用,简单总结C语言中的运算符优先级
简单总结C语言中的运算符优先级 C语言中有很多运算符,除了四则运算,还有位运算.比较运算.逻辑运算.赋值运算等等,令人眼花缭乱的同时,优先级也让人头疼.通常建议在写代码的时候不用省略括号,但是并不是所 ...
最新文章
- leetcode算法题--叶值的最小代价生成树
- 如何用python“优雅的”调用有道翻译
- C++fast power快速指数的实现(附完整源码)
- OpenGL-坐标系概念
- dataframe常用操作_Pandas | Dataframe的merge操作,像数据库一样尽情join
- php边框的颜色 怎么设置,网页中table表格如何修改边框颜色
- 用matlab设计滤波器实验报告,数字信号出来实验报告--matlab滤波器设计
- CSS快速学习:几种导航条案例
- 【Head First 设计模式】-装饰者模式读后总结
- 魔兽世界账号与服务器的关系,账号整合不用烦 《魔兽世界》角色转移问题一览...
- 网页布局:左边为导航,右边正文,左边和右边的高度总是相等,或者导航最低高度为屏幕高度...
- 从零开始制作游戏外挂
- python三重积分_(整理)三重积分及其计算和多重积分72254.
- 推动工业品B2B企业转型:整合制造工业电商平台解决方案
- outlook如何同步服务器sent文件夹,.ost 文件的同步问题 - Exchange | Microsoft Docs
- UI设计 AndroidIOS开发推荐用色
- JavaScript自定义tirm方法
- 安装Deepin后,无法进入windows解决
- 如何判断服务器是否被黑
- 计算机内用户文件夹中的文件,在位于计算机上所有用户的AppData文件夹中的文件中修改一行...