記錄一個(gè)C/C++數(shù)組賦值時(shí)索引問(wèn)題
C/C++數(shù)組賦值時(shí),索引不應(yīng)該寫自加運(yùn)算??
?????這個(gè)是我同學(xué)問(wèn)我的問(wèn)題,說(shuō)是來(lái)自他們學(xué)校的考研真題。但是看到題目的瞬間我就陷入了沉思,這個(gè)編譯真的不會(huì)有問(wèn)題嗎?來(lái)看一下代碼
????我看到a[i]=i+++1就察覺(jué)到了一絲不對(duì)勁;這里的a[i]到底是自加之后的i,還是之前的i?直覺(jué)告訴我自加運(yùn)算(++)的運(yùn)算優(yōu)先級(jí)是高于賦值(=)的,所以a[0]相應(yīng)該沒(méi)有值,而a[1] = 1
????然而她給我回了她運(yùn)行的截圖...

我看到整個(gè)人都不好了,a[0]還能有值呢,逗我玩呢?
于是我把這個(gè)代碼在VScode里面運(yùn)行了一下
人瞬間蒙了,我去,一看就是a[0]沒(méi)有賦值,然后a[1]等于了1,也就是說(shuō),這個(gè)過(guò)程是先算了i+1,然后再算了i++,最后再運(yùn)算了賦值運(yùn)算。到這里我以為已經(jīng)結(jié)束了。。。結(jié)果我腦抽去DevC++運(yùn)行了一下(因?yàn)樗玫腄evC++,版本為6.3)
淦,這第一項(xiàng)是0!但是同是DevC++(但是版本號(hào)不同)結(jié)果居然不一樣?。?!
于是我就好奇的在VS里面試了一下:
這是搞哪樣啊?++ 確實(shí)是在 i+1 之后計(jì)算的,但是賦值的a[i]真的能確定的這么早嗎,這和理想的運(yùn)算優(yōu)先級(jí)不一樣哇!這個(gè)答案是標(biāo)準(zhǔn)參考答案!
最后得出的結(jié)論就是,這什么破題,有爭(zhēng)議還拿來(lái)作為考題,下面是部分聊天的截圖

C/C++數(shù)組賦值時(shí),其實(shí)可以越界
????? ? 這個(gè)是之前使用ESP32的進(jìn)行數(shù)據(jù)的收發(fā)時(shí)發(fā)現(xiàn)的問(wèn)題,當(dāng)時(shí)定義數(shù)組的長(zhǎng)度十六,但是到了實(shí)際測(cè)試的時(shí)候一個(gè)字符串隨便按一按鍵盤就到了二十多,然而程序還是跑的很好。。。如下圖所示

????我們都知道數(shù)組越界會(huì)報(bào)錯(cuò),但是我們換個(gè)寫法,不用長(zhǎng)度來(lái)限制,而是使用結(jié)束標(biāo)志來(lái)限制長(zhǎng)度,這樣子就能有效的避開(kāi)編譯不通過(guò)。 而在運(yùn)行過(guò)程中,由于C/C++中的數(shù)組名其實(shí)就是一個(gè)指向數(shù)組頭部的指針??!所以我們這個(gè)根據(jù)這個(gè)指針地址來(lái)越界的讀寫寄存器是可行的!?。?/strong>
????????運(yùn)行的時(shí)候不要使用Debug運(yùn)行,選擇release,不然運(yùn)行后會(huì)返回錯(cuò)誤代碼。最終的結(jié)果當(dāng)然也沒(méi)有意外的正常! 五個(gè)長(zhǎng)度的字符數(shù)組,但是讀寫8個(gè)也沒(méi)啥問(wèn)題嘛哈哈哈。重點(diǎn)是沒(méi)有報(bào)錯(cuò)!沒(méi)有報(bào)錯(cuò)!看這個(gè)返回代碼返回的0!?。?/p>
????????但是這樣子是極為不推薦的,因?yàn)槟悴恢肋@個(gè)數(shù)組后方是什么,如果說(shuō)沒(méi)有被分配,那么程序是沒(méi)有問(wèn)題的,如果是其他的數(shù)據(jù),那么哦吼,完?duì)僮恿?,你其他的?shù)據(jù)被覆蓋了!?
????????程序還是不要搗鼓這些花里胡哨的好哈哈哈,浪費(fèi)時(shí)間還沒(méi)有學(xué)到東西