編譯器根據(jù)對代碼進行優(yōu)化的需要自行規(guī)定對實參的求值順序。有的編譯器規(guī)定自左至右,有的編譯器規(guī)定自右至左,這種對求值順序的不同規(guī)定,對一般參數(shù)來講沒有影響。但是,如果實參表達式中帶有副作用的運算符時,就有可能產(chǎn)生由于求值順序不同而造成了二義性。你的編譯器是自右向左的順序。
創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)整合營銷推廣、網(wǎng)站重做改版、達日網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁面制作、商城網(wǎng)站開發(fā)、集團公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為達日等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
是的,如果這是某書上的做法,那么,我只能說它為你們提供了一個錯誤的榜樣。
這樣使用gets()已經(jīng)發(fā)生了溢出!這是gets()不檢查數(shù)據(jù)邊界的bug造成的。
另外,“字符串不是總是以'\0'作為串的結(jié)束符”,答案是肯定的,不然puts()函數(shù)就不能在合適的地方停下來了。這里st[15]被gets()函數(shù)賦值為'\0'。這里要說明的是st[15],st[16]是存在而不合法的,因為字符串實際上就等同于指針,類似st[16]是實在的地址但是是不應(yīng)該被引用的。
為什么這里溢出沒有產(chǎn)生錯誤?可能系統(tǒng)分配內(nèi)存是以一個最小的大小整段整段的分配(這個我只是猜測)。你可以試著輸入的字符串變長一點,就可以看到內(nèi)存讀寫出錯的提示了,這就是溢出的嚴重后果!我在dos系統(tǒng)下測試字符串長了直接當機。
驗證1:st[15]被賦值為'\0'
#include"stdio.h"
main()
{
charst[15];
printf("inputstring:");
gets(st);
puts(st);
printf("%d",st[15]);
getch();
}
驗證2:
#include"stdio.h"
main()
{
charst[15];
printf("inputstring:");
gets(st);
puts(st);
//printf("%d",st[16]);
st[1]='\0';
printf("%s\n",st);
printf("%s",st+2);
getch();
}
同樣的建議:拒絕gets(),這本來就是一個有bug的函數(shù)!
函數(shù)的副作用是最令人頭疼的問題
我們都知道形參使得函數(shù)可以改變調(diào)用者的變量值
所以很容易產(chǎn)生副作用
所以函數(shù)設(shè)計時應(yīng)當避免頻繁改變形參的值
這就是你所看到的現(xiàn)象:“不直接用型參參與運算”
這樣就不會改變調(diào)用者的變量值
當然最后還是要改變形參的值,否則形參就沒有意義了
還有另一個原因是編譯有關(guān)的
局部變量是在棧分配空間的
生成的機器代碼是近調(diào)用的短地址
而形參就很難說了
可能有的編譯器,先按值參處理,最后再用結(jié)果修改形參
這樣做就不用擔心“直接用型參參與運算”的會頻繁修改形參了
但是卻不符合形參的本義
因此編譯器會直接引用形參的地址,就會生成遠調(diào)用的長地址了
把形參編譯成長短不同的地址,這在調(diào)用系統(tǒng)功能時就有講究了
你的代碼里有“interrupt”字樣,我沒猜錯的話就是中斷調(diào)用
這時需要長地址還是短地址,那可是一點也不可弄錯了
用局部變量就會得到短地址
標題名稱:c語言函數(shù)的副作用 c語言的作用和影響
網(wǎng)站URL:http://www.chinadenli.net/article42/doogcec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計、全網(wǎng)營銷推廣、靜態(tài)網(wǎng)站、網(wǎng)站營銷、云服務(wù)器、網(wǎng)站維護
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)