下标引用操作符([])
值得注意的是
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