目录
4.通过优先级和结合性,基本可以确定表达式的求值顺序,但不能完全确定的
为了获得这个精度,表达式中的字符和短整型操作数在使⽤之前被转换为普通整型,这种转换称为整 型提升。
接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧
引言
在求c表达式时,往往在运算中会出现各种想不到的结果出现,不同编译器实现的结果不相同,运算的结果与我们想象中的运算过程千差万别,造成各种困惑,接下来我们就将介绍这些在表达式求值过程中出现的各种意外情况
一:运算符的优先级和结合性
1,优先级
指的是在一个表达式中出现了多个不同的运算符,优先级就将决定在运算时先进行那个运算符计算
相邻操作符之间才拥有的
如:a+b*c 根据运算符的优先级,先执行乘,在执行加
2.各种运算符的优先级的表
3.运算符的结合性
结合性的是在表达式求值时,在表达式中出现的运算符的优先级相同时,应按照运算符的结合行来决定求值顺序,是从左往右还是从右往左执行
如:a/b*c%d,由上面的优先级表查询得知,这几个运算符的优先级相同,那么应该按照结合性来运算,按照从左往右的顺序执行
4.通过优先级和结合性,基本可以确定表达式的求值顺序,但不能完全确定的
二:整型提升和算术转换
1.整型提升
1.基本大意
C语⾔中整型算术运算总是⾄少以缺省整型类型的精度来进⾏的
为了获得这个精度,表达式中的字符和短整型操作数在使⽤之前被转换为普通整型,这种转换称为整 型提升。
2.整型提升的意义
表达式的整型运算要在CPU的相应运算器件内执⾏,CPU内整型运算器(ALU)的操作数的字节⻓度⼀ 般就是int的字节⻓度,同时也是CPU的通⽤寄存器的⻓度。
因此,即使两个char类型的相加,在CPU执⾏时实际上也要先转换为CPU内整型操作数的标准⻓
度。
通⽤CPU(general-purpose CPU)是难以直接实现两个8⽐特字节直接相加运算(虽然机器指令中 可能有这种字节相加指令)。所以,表达式中各种⻓度可能⼩于int⻓度的整型值,都必须先转换为 int或unsigned int,然后才能送⼊CPU去执⾏运算
3.举例说明
对于这个求值,可以看出求出的结果不是我们所想的那样简单的,而是经过整型提升的结果
4.对于char 和short类型数据整型提升时的规则
1. 有符号整数提升是按照变量的数据类型的符号位来提升的
2. ⽆符号整数提升,⾼位补0
3.对于有符号的整数,最高位是符号位
5.解释说明上述例子
三:算术转换
当我们遇到的表达式在求值过程中各数据的类型各不相同,这就将用到算术转换来计算,将不同类型的数据转换为同一类型,下面就是转换规则
算术转换表
四:结语
在进行表达式求值时要关注这些这些转换规则,计算规则,再来计算表达式的结果