C语言学习记录-12.25

学习内容:

1.操作符的属性

一个表达式,比如加减乘除,先算哪个运算符?有以下三点判断:
1)优先级:人为规定一个优先级表(查表看就知道了)
2)结合性:当操作符优先级一样时,表达式是从左向右算呢?还是从右向左算呢?(像”1+2+3“从左向右算,是1+2然后再+3;a=3,从右向左算,3赋值给a。)
3)控制求值顺序:有一些表达式我可以让它不执行。("0&&X"当逻辑与左边为0,结果一定为0,右边的操作数就被直接忽略了。)

2.重要原则:表达式要有唯一计算路径。

当把C语言转换成汇编语言,你会发现,对于一些多路径解(即上述三个属性都满足的情况下,仍然有歧义)的表达式,在不同编译器平台上其结果不同,其底层寄存器的逻辑顺序不同。典型问题表达式如下:

1)操作符属性是相邻判断,还是按整个表达式判断?(两条路径)

例子:a*b+c*d+e*f;

相邻判断:ab和cd相邻,先算ab和cd的两个乘法,再算ab和cd的加法,而让ef的乘法落后于ab和cd的加法了。(和我们平常想的不一样)
整体判断:先算ab,cd和ef的乘法,再各自相加。

2)操作数本身的赋值和操作符谁先?(操作数和操作符的优先级)

例子:int i=3; i+ --i;

操作数先:i的赋值先于”–“前置减。结果为3+2=5。
操作符先:”–“前置减先于i的赋值。结果为2+2=4。

3.野指针

大体定义:指针指向位置不可知,是随机的,错误的或是没有明确限制的。
可能原因:
1)未初始化指针:例子:”int *p“,指向随机位置。(也没什么意义啊)
2)指针越界访问:现有指针指向某个数组的首元素地址,越界的意思是这个指针指向了这个数组之外的地址。
3)指针指向错误的地址(已经被用完释放了地址):被调用函数内的局域变量出函数便被销毁了,内存空间也被释放了,你再在主函数里应用这个局域变量地址就是错误的。(这和未初始化好像差不多吧,都可以看作随机地址)

疑问:我就越界访问了,能怎么样?难道我就不能修改数组地址之外的内存里面的值?比如一个数组占了2-8地址,我访问个地址9,我把地址9的值改变了,怎么就有问题了?
解答:你不能包证你这个地址9是分配给谁的地址,你只能确定2-8是分给你数组的。如果地址9的分给你遍历数组arry[i]的i的,你就改变了i的值,程序就可能无限循环崩溃。(简单来说,牵一发而动全身,明确你能操作权限的范围是多大很重要)


学习产出:

  • CSDN 无技术博客 1 篇
  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值