c语言操作符优先级及ascii码--备忘

运算符优先级和结合性一览表

优先级运算符名称或含义使用形式结合方向说明

1

[] 数组下标 数组名[常量表达式]

左到右

 
() 圆括号 (表达式)
函数名(形参表)
 
. 成员选择(对象) 对象.成员名  
-> 成员选择(指针) 对象指针->成员名  

2

- 负号运算符 -表达式 右到左 单目运算符
(类型) 强制类型转换 (数据类型)表达式  
++ 自增运算符

++变量名

变量名++

单目运算符
-- 自减运算符

--变量名

变量名--

单目运算符
* 取值运算符 *指针变量 单目运算符
& 取地址运算符 &变量名 单目运算符
! 逻辑非运算符 !表达式 单目运算符
~ 按位取反运算符 ~表达式 单目运算符
sizeof 长度运算符 sizeof(表达式)  

3

/ 表达式 / 表达式 左到右 双目运算符
* 表达式*表达式 双目运算符
% 余数(取模) 整型表达式%整型表达式 双目运算符

4

+ 表达式+表达式 左到右 双目运算符
- 表达式-表达式 双目运算符

5

<< 左移 变量<<表达式 左到右 双目运算符
>> 右移 变量>>表达式 双目运算符

6

> 大于 表达式>表达式 左到右 双目运算符
>= 大于等于 表达式>=表达式 双目运算符
< 小于 表达式<表达式 双目运算符
<= 小于等于 表达式<=表达式 双目运算符

7

== 等于 表达式==表达式 左到右 双目运算符
!= 不等于 表达式!= 表达式 双目运算符
8 & 按位与 表达式&表达式 左到右 双目运算符
9 ^ 按位异或 表达式^表达式 左到右 双目运算符
10 | 按位或 表达式|表达式 左到右 双目运算符
11 && 逻辑与 表达式&&表达式 左到右 双目运算符
12 || 逻辑或 表达式||表达式 左到右 双目运算符
13 ?: 条件运算符 表达式1? 表达式2: 表达式3 右到左 三目运算符

14

= 赋值运算符 变量=表达式

右到左

 
/= 除后赋值 变量/=表达式  
*= 乘后赋值 变量*=表达式  
%= 取模后赋值 变量%=表达式  
+= 加后赋值 变量+=表达式  
-= 减后赋值 变量-=表达式  
<<= 左移后赋值 变量<<=表达式  
>>= 右移后赋值 变量>>=表达式  
&= 按位与后赋值 变量&=表达式  
^= 按位异或后赋值 变量^=表达式  
|= 按位或后赋值 变量|=表达式  
15 , 逗号运算符 表达式,表达式,… 左到右  

上表中可以总结出如下规律:
  1. 结合方向只有三个是从右往左,其余都是从左往右。
  2. 所有双目运算符中只有赋值运算符的结合方向是从右往左。
  3. 另外两个从右往左结合的运算符也很好记,因为它们很特殊:一个是单目运算符,一个是三目运算符。
  4. C语言中有且只有一个三目运算符。
  5. 逗号运算符的优先级最低,要记住。
  6. 此外要记住,对于优先级:算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符。逻辑运算符中“逻辑非 !”除外。

示例

&reln->md_seg_fds[forknum][nopensegs - 1];

结构体reln的成员md_seg_fds的第[forknum][nopensegs - 1]下标值的地址。

#define pg_yyget_extra(yyscanner) (*((base_yy_extra_type **) (yyscanner)))

一些容易出错的优先级问题

上表中,优先级同为1 的几种运算符如果同时出现,那怎么确定表达式的优先级呢?这是很多初学者迷糊的地方。下表就整理了这些容易出错的情况:

优先级问题表达式经常误认为的结果实际结果
. 的优先级高于 *(-> 操作符用于消除这个问题) *p.f p 所指对象的字段 f,等价于:
(*p).f
对 p 取 f 偏移,作为指针,然后进行解除引用操作,等价于:
*(p.f)
[] 高于 * int *ap[] ap 是个指向 int 数组的指针,等价于:
int (*ap)[]
ap 是个元素为 int 指针的数组,等价于:
int *(ap [])
函数 () 高于 * int *fp() fp 是个函数指针,所指函数返回 int,等价于:
int (*fp)()
fp 是个函数,返回 int*,等价于:
int* ( fp() )
== 和 != 高于位操作 (val & mask != 0) (val &mask) != 0 val & (mask != 0)
== 和 != 高于赋值符 c = getchar() != EOF (c = getchar()) != EOF c = (getchar() != EOF)
算术运算符高于位移 运算符 msb << 4 + lsb (msb << 4) + lsb msb << (4 + lsb)
逗号运算符在所有运 算符中优先级最低 i = 1, 2 i = (1,2) (i = 1), 2

这些容易出错的情况,希望读者好好在编译器上调试调试,这样印象会深一些。一定要多调试,光靠看代码,水平是很难提上来的。调试代码才是最长水平的。
 

 

 ================扩展表====================

虽然ascii码表中都以十进制和二进制表示,但是编程语言中对于字符通常以二进制、十六进制(前两者二进制编辑器采用的最多)、八进制表示为主、十进制仅做辅助。 

\ddd 1到3位八进制数所代表的任意字符 三位八进制,如\017、\101属于\ddd
\xhh 1到2位十六进制所代表的任意字符 二位十六进制,\xab属于\xhh

C里面IDE中对于可见字符通常以十进制和字符显示。对于不可见字符则以十进制和八进制显示。

 

 那\017为啥特殊呢,还要占用1个字节?

posted @ 2021-11-28 16:10  zhjh256  阅读(182)  评论(0编辑  收藏  举报