操作符详解(下) (C语言)

操作符详解下

操作符的属性

C语言的操作符有2个重要的属性:优先级、结合性,这两个属性决定了表达式求值的计算顺序。

1.优先级

优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执行。各种运算符的优先级是不⼀样的。

比如 3 + 4 * 5,表达式 3 + 4 * 5 里面既有加法运算符( + ),又有乘法运算符( * )。由于乘法的优先级高于加法,所以会先计算 4 * 5 ,而不是先计算3+4。

2.结合级

如果两个运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符是左结合,还是右结合,决定执行顺序。大部分运算符是左结合 (从左到右执行),少数运算符是右结合(从右到左执行),比如赋值运算符( = )。

比如 5 * 6 / 2, * 和 / 的优先级相同,它们都是左结合运算符,所以从左到右执行,先计算 5 * 6 ,再计算 / 2 。

运算符的优先级顺序很多,下面是部分运算符的优先级顺序(按照优先级从高到低排列)详细的可以参考:https://zh.cppreference.com/w/c/language/operator_precedence

表达式求值

1.整型提升

C语言中整型算术运算总是至少以缺省(默认)整型类型的精度来进行的。

为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型 ,这种转换称为整型提升

下面展示一些 内联代码片

复制代码
javascript 复制代码
int main()
{
char a,b,c;
a=b+c;
}

就比如上面的代码,b和c的值被提升为普通整型,然后再执行加法运算。加法运算完成之后,结果将被截断,然后再存储于a中。

(表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。

通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行)

2.如何进行整形提升呢?

  1. 有符号整数提升是按照变量的数据类型的符号位来提升的
  2. 无符号整数提升,高位补0
    比如:

3.算术转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中⼀个操作数的转换为另⼀个操作数的类型 ,否则操作就无法进行。下面的层次体系称之为寻常算术转换 。如果某个操作数的类型在上面这个列表中排名靠后,那么首先要转换为另外⼀个操作数的类型后执行运算。

4.问题表达式解析

其实有时候我们会发现如果一个表达式太过复杂或者表达不清楚,虽然编译器会给出结果但是去不一定正确,并且有可能在不同的编译器上给出的结果是不一样的,所以这样的表达式是有问题的。

1.比如:c+ --c; 操作符的优先级只能决定减 -- 的运算在 + 的运算的前面,但是我们并没有办法得知, + 操作符的左操作数的获取在右操作数之前还是之后求值,所以结果是不可预测的,是有歧义的。

2.

很显然,像这样有歧义的表达式在不同的编译器中会有不同的结果,再者说这样的表达式在一些运算当中都是错误的是不可取的。所以即使有了操作符的优先级和结合性,我们写出的表达式依然有可能不能通过操作符的属性确定唯⼀的计算路径,那这个表达式就是存在潜在风险的,建议不要写出特别复杂的表达式。

相关推荐
兵慌码乱12 小时前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2
小bo波14 小时前
从"任意文件复制"深挖Java I/O:字符流与字节流的本质抉择
java·nio·io流·后端开发·文件复制
luckdewei15 小时前
FastAPI 资产管理系统实战:复杂 ORM 关联、Alembic 迁移与 N+1 查询优化
python
aqi0021 小时前
15天学会AI应用开发(八)使用向量数据库实现RAG功能
人工智能·python·大模型·ai编程·ai应用
Csvn1 天前
`functools.lru_cache` —— 一行代码搞定缓存加速
后端·python
nanxun8862 天前
记一次诡异的 Docker 容器"串包"故障排查
java
金銀銅鐵2 天前
[Python] 从《千字文》中随机挑选汉字
后端·python
用户1563068103512 天前
Day01 | Java 基础(Java SE)
java
行者全栈架构师2 天前
Maven dependency:tree 的 8 个高级用法
java·后端