1,表达式求值的优先级表格(从上到下优先级从高到低变化)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
路漫漫其修远兮,吾将上下而求索,在上次内容中小编介绍了有关于操作符的基本知识,但是操作符用来干什么的呢?毫无置疑操作符使用于表达式,在本次内容中小编将会带大家学习一下表达式的优先级和结合性,虽然该章内容设计知识是需要记的,但是还是一句话:熟能生巧,实践出真知,我们只有不断的写代码才能记住这些内容,而不是去死记硬背。好啦不多唠嗑了,开始我们的新内容吧,go go go!!!
提示:以下是本篇文章正文内容,下面案例可供参考
一、1,表达式求值的优先级
1,什么是优先级
优先级指的是,如果一个表达式包含多个运算符,优先级高的运算符先执行。各种操作符的优先级是不同的。
2,表达式的优先级表格
在这里重点看到我黑体的那些
操作符 | 名称 |
---|---|
() | 聚组,也被称为括号 |
() | 函数调用 |
[ ] | 下标引用 |
. | 访问结构成员 |
-> | 访问结构指针成员 |
++ | 后置++ |
-- | 后置-- |
! | 逻辑反 |
~ | 按位取反 |
+ | 单目操作符,表示正值 |
- | 单目操作符,表示负值 |
++ | 前置++ |
-- | 前置-- |
* | 间接访问 |
& | 取地址 |
sizeof | 求长度,单位字节 |
(类型) | 类型转换 |
* | 乘法 |
/ | 除法 |
% | 取余操作符(只能是整数) |
+ | 加法 |
- | 减法 |
<< | 左移 |
>> | 右移 |
> | 大于 |
< | 小于 |
== | 等于 |
!= | 不等于 |
& | 按位与 |
^ | 按位异或 |
按位或 | |
&& | 逻辑与 |
逻辑或 | |
三目操作符 | |
= | 赋值 |
, | 逗号 |
|----|
| 分析 |
具体参考 表达式优先级表格,在这里我们可以发现赋值优先级几乎是处于最低的,在上面表格中在我们平常编译中常用的就是上面黑体部分的。具体其他的可以参考小编给的链接加以理解,接下来小编带大家熟悉一点操作符的优先级
c
int main()
{
int x = 2 + 6 / 3;
return 0;
}
|----|
| 分析 |
在该表达式中,乘法的优先级高于加法优先级,所以先执行乘法,然后在执行加法,最后执行赋值运算
二、表达式的结合性
1,什么是表达式的结合性
如果两个表达式优先级相同,优先级没办法确定先执行哪个,这时候就看结合性了,则根据运算符是做结合还是右结合,决定执行顺序。大部分运算符是左结合(也即是从左向右计算),少数运算符是从右向左计算,比如赋值操作符,下面就介绍一些操作符的结合性吧
2,表达式的结合性表格
操作符 | 结合性 |
---|---|
() | 无结合性 |
后置++ | 从左向右 |
后置 - - | 从左向右 |
! | 从右向左 |
~ | 从右向左 |
前置++ | 从右向左 |
前置-- | 从右向左 |
乘法 | 从左向右 |
/ | 从左向右 |
% | 从左向右 |
+ | 从左向右 |
- | 从左向右 |
<< | 从左向右 |
>> | 从左向右 |
小于,等于,大于,不等于 | 从左向右 |
& | 从左向右 |
^ | 从左向右 |
按位或 | 从左向右 |
&& | 从左向右 |
逻辑或 | |
= | 从右向左 |
, | 从左向右 |
c
#include<stdio.h>
int main()
{
int y = 2 + 3 + 4; //优先级情况相同的话就要考虑结合性的问题
return 0;
}
|----|
| 分析 |
在这里都是加号,优先级相同的情况下考虑结合性,加法的结合性是从左向右的所以,先2+3然后最后加上4,然后赋值优先级是从右向左,所以把加法所得的总值赋值给了y。
3,隐式类型转换
1,整型提升
1,表达式求值的顺序一部分是由操作符的优先级和结合性决定
2,同样,有些表达式的操作数在求值的过程中可能需要转换成其他类型
3,c的整型运算总是至少以默认整型类型的精度进行的
4,为了获得这个精度,表达式中的字符和短整型操作数在使用之前会被转换为普通整型,这种转换被称为整形提升
c
int main()
{
//隐式类型转换
char a = 5;
char b = 126;
char c = a + b;
printf("%d\n",c);
return 0;
}
|----|
| 分析 |
在这里a是字符型,b也是字符型,char类型的数据在做运算之前(这里指加法)我们得先把a和b转换为普通整型,然后让它进行加法运算。这是为啥呢?因为表达式的整型运算在cpu的相应运算器内执行,cpu内整型运算器的操作数的字节长度一般是int的字节长度同时也是cpu的通用寄存器的长度。因此,即使两个char类型的相加,在cpu执行时实际也要先转换为cpu内整型操作数的标准长度。通用cpu是难以直接实现两个8比特也就是一个字节直接相加运算。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入cpu去执行运算。
2,如何整型提升?
整型提升是按照变量的数据类型来提升的
c
int main()
{
//负数整型提升
char c1 = -1;
char c2 = 1;
return 0;
}
|----|
| 分析 |
首先-1在内存中存储的是二进制位的补码形式32个比特位,而变量c1的二进制位(补码)只有8个比特位,所以发生了截断,取了后面的八个比特位11111111,假如要多c1进行整型提升,在这里c1是有符号字符型,所以我们默认他的最高位为符号位,要进行整型提升,所以要把它变为整型类型32个比特位,则剩下缺的用符号位来补上。第二个c2为正数,和负数一样截断取八位,最后整型提升用符号位补齐。也就是用0补齐。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了表达式求值的优先级和结合性,而具体使用和记忆得各位读者在日常代码中了,学习不是一蹴而就的活,小编只是简单介绍了优先级和结合性,如果各位读者忘记了能有资料回头看看就收藏一下吧。