详解操作符第二章(隐式类型转换)(详细讲解为何诸如(++i)+(++i)+(++i)是烂代码)

下标引用操作符([])

值得注意的是

int arr[10];

[]的操作数是10和arr,其他不在赘述

函数调用操作符()

test(a,b)

()的操作数函数名test 和传给函数的参数a,b

隐式类型转换

为了提高精度,表达式中的字符和短整型操作数会转化为普通整形,叫整形提升
举例

在这里插入图片描述

int main()
{
	char a = 3;
	char b = 10;
	char c = a + b;
	printf("%d", c);
	return 0;
}

有符号字符和短整型整形提升时补符号位,无符号的补0
整形提升是对补码进行的

把3看作整形,放入字符型变量a中会截断,只留下从后向前1个字节的长度
运行c = a + b时a,b进行整形提升,将a,b补为4个字节,然后相加,放入c时再进行截断为1个字节放入c中
打印时由于以%d形式打印,再进行整形提升得出结果

算术转换

在这里插入图片描述
不同类型计算时从下向上,排名低的向排名高的转换使它们变为同一类型
算术转换要合理否则会精度丢失

在这里插入图片描述

c±-c

c±-c
即使运算顺序确定结果也有可能不同
定义int c = 1,先算c在–,再算+,左边的c在内存是否提前准备好,那么+左操作数c如果在执行–c之前准备好,那么1+0 = 1
但如果在–c之前没准备好,那么0 + 0 = 0

为何诸如(++i)+(++i)+(++i)是烂代码

int i = 1;

在这里插入图片描述
有两种运行方式,由于最后一个++i和第一个+互不影响,那么到底是两者谁先运行不确定
第一种结果为 12,第二种为 10
在vs2019编译器中结果为第一种
实际操作如下
在这里插入图片描述
在这里插入图片描述
给i在栈区开辟一块空间,地址为ebp-8,将1放入这块空间
将ebp-8所指向的空间的值放入eax中,eax+1,
将eax放入ebp-8所指向的空间中,此时这块空间为2,此时完成++i
后面又完成两次++i

在这里插入图片描述

ebp-8所指向的空间的值变为4,将4放入eax中,之后再add两次,也就是+两次4,结果变为12,所以ret为12

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值