记录一个C/C++数组赋值时索引问题
C/C++数组赋值时,索引不应该写自加运算
这个是我同学问我的问题,说是来自他们学校的考研真题。但是看到题目的瞬间我就陷入了沉思,这个编译真的不会有问题吗?来看一下代码
我看到a[i]=i+++1就察觉到了一丝不对劲;这里的a[i]到底是自加之后的i,还是之前的i?直觉告诉我自加运算(++)的运算优先级是高于赋值(=)的,所以a[0]相应该没有值,而a[1] = 1
然而她给我回了她运行的截图...

我看到整个人都不好了,a[0]还能有值呢,逗我玩呢?
于是我把这个代码在VScode里面运行了一下
人瞬间蒙了,我去,一看就是a[0]没有赋值,然后a[1]等于了1,也就是说,这个过程是先算了i+1,然后再算了i++,最后再运算了赋值运算。到这里我以为已经结束了。。。结果我脑抽去DevC++运行了一下(因为她用的DevC++,版本为6.3)
淦,这第一项是0!但是同是DevC++(但是版本号不同)结果居然不一样!!!
于是我就好奇的在VS里面试了一下:
这是搞哪样啊?++ 确实是在 i+1 之后计算的,但是赋值的a[i]真的能确定的这么早吗,这和理想的运算优先级不一样哇!这个答案是标准参考答案!
最后得出的结论就是,这什么破题,有争议还拿来作为考题,下面是部分聊天的截图

C/C++数组赋值时,其实可以越界
这个是之前使用ESP32的进行数据的收发时发现的问题,当时定义数组的长度十六,但是到了实际测试的时候一个字符串随便按一按键盘就到了二十多,然而程序还是跑的很好。。。如下图所示

我们都知道数组越界会报错,但是我们换个写法,不用长度来限制,而是使用结束标志来限制长度,这样子就能有效的避开编译不通过。 而在运行过程中,由于C/C++中的数组名其实就是一个指向数组头部的指针!!所以我们这个根据这个指针地址来越界的读写寄存器是可行的!!!
运行的时候不要使用Debug运行,选择release,不然运行后会返回错误代码。最终的结果当然也没有意外的正常! 五个长度的字符数组,但是读写8个也没啥问题嘛哈哈哈。重点是没有报错!没有报错!看这个返回代码返回的0!!!

但是这样子是极为不推荐的,因为你不知道这个数组后方是什么,如果说没有被分配,那么程序是没有问题的,如果是其他的数据,那么哦吼,完犊子了,你其他的数据被覆盖了!
程序还是不要捣鼓这些花里胡哨的好哈哈哈,浪费时间还没有学到东西