表达式求值

表达式求值的顺序一部分是由操作符的优先级和结合性来决定,在对表达式进行求值是需要对数据进行类型转换。

隐式类型转换:

如果没有进行规定,C语言的整形算术运算总是以整型类型的精度来进行。
这个是由CPU的运算机制决定。
来个简单的例子:

char a = a;
char b = b;
char c = a + b;//事实上 a 和 b 在运算前都会先转换为整型再运算,最后转换为 char

问:如何将低精度数据转换为int?
答:整数提升
来上代码:

//char - 有符号的char的取值范围为 -128~127
//       无符号的char的取值范围为  0~255

char a = 3;
//00000000000000000000000000000011
//进行截断,截断为8个bit
//00000011

char b = 127;
//00000000000000000000000001111111
//进行截断,截断为8个bit
//01111111

char c = a + b;
//首先对 a 和 b 判断是正数还是负数
//如果是正数,高位补零;如果是负数,高位补1
//如果是无符号char,那高位直接补0
//00000000000000000000000000000011
//00000000000000000000000001111111
//c 的二进制数为  00000000000000000000000010000010
//截断为  10000010

printf("%d", c);// c = -126
//打印十进制的整数
//对c的补码进行整数提升
//11111111111111111111111110000010
//10000000000000000000000001111110   原码

整形提升也可以对下列代码进行解释:

char a = 0xb6;
short b = 0xb600;
int c = 0xb60000;

if(a == 0xb6);//flase, 在整形提升时a变为负数
if(b == 0xb600);//flase, 在整形提升时b变为负数
if(c == 0xb60000);//true, c不会进行整型提升

PS:需要特别注意的是,整型提升不只是发生在加减乘除上,其发生在所有的二目运算符(当二者数据类型不同时)。

在整型提升上尤其要注意有符号和无符号的比较。

int i = -1;
unsigned int y = 2;
//在对二者进行比较时,由于int 要转换成unsigned int,结果是比2大的。

算术转换:

如果操作符中存在操作数的数据类型不同,则必须将数据类型进行统一。
算术转换要“就高不就低”(精度),否则会出现精度丢失。

float a = 3.14;
int b = a;//会发生算术转换,但会丢失精度

操作符的属性:

操作符的优先级:

不必死背,如果不记得的话可以用括号。
优先级是相邻操作符才考虑。

操作符的结合性:

在优先级相同的情况下,才考虑结合性(从左到右,还是从右到左)。

但这样还是无法唯一确定运算路径:

int a = 2;
int b = a + --a;//可能在一个编译器下为2,可能在另一个编译器为3

所以要尽可能不写出这样的代码。

再比如说:

int fun()
{
	static int count = 1;
	return ++count;
}

int main()
{
	int a;
	a = fun() - fun() * fun();
	printf("%d\n",a);//不知道是-2 还是 -10
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值