C/C++編程筆記:C語(yǔ)言和C++中的未定義行為,及其優(yōu)缺分析


考慮以下C / C ++程序并嘗試猜測(cè)輸出什么?
舉例一:

舉例二:

舉例三:

舉例四:

舉例五:

舉例六:

舉例七:

以上所有程序的輸出都是不可預(yù)測(cè)的(或不確定的)。編譯器(實(shí)現(xiàn)C / C ++標(biāo)準(zhǔn))可以自由地做任何事情,因?yàn)镃和C ++標(biāo)準(zhǔn)未定義它們。
像Java這樣的語(yǔ)言會(huì)立即發(fā)現(xiàn)錯(cuò)誤,但是在少數(shù)情況下,像C和C ++這樣的語(yǔ)言會(huì)繼續(xù)以靜默但有錯(cuò)誤的方式執(zhí)行代碼,這可能會(huì)導(dǎo)致無(wú)法預(yù)測(cè)的結(jié)果。該程序可能會(huì)因任何類(lèi)型的錯(cuò)誤消息而崩潰,也可能在不知不覺(jué)中損壞數(shù)據(jù)的情況,這是一個(gè)嚴(yán)重的問(wèn)題。
了解未定義行為的重要性
如果用戶(hù)開(kāi)始在C / C ++環(huán)境中學(xué)習(xí)并且對(duì)未定義行為的概念不清楚,那么將來(lái)可能會(huì)帶來(lái)很多問(wèn)題,例如在調(diào)試其他人的代碼時(shí)可能實(shí)際上很難跟蹤根目錄。未定義的錯(cuò)誤。
未定義行為
的風(fēng)險(xiǎn)和缺點(diǎn)程序員有時(shí)依賴(lài)未定義行為的特定實(shí)現(xiàn)(或編譯器),這可能會(huì)在更改/升級(jí)編譯器時(shí)引起問(wèn)題。例如,最后一個(gè)程序在大多數(shù)編譯器中產(chǎn)生72作為輸出,但是基于此假設(shè)實(shí)現(xiàn)軟件不是一個(gè)好主意。
未定義的行為也可能導(dǎo)致安全漏洞,特別是由于未檢查數(shù)組越界的情況(導(dǎo)致緩沖區(qū)溢出攻擊)。
未定義行為的優(yōu)點(diǎn)
C和C ++具有未定義行為,因?yàn)樗试S編譯器避免進(jìn)行大量檢查。假設(shè)一組具有較高性能數(shù)組的代碼無(wú)需關(guān)注邊界,這避免了需要復(fù)雜的優(yōu)化過(guò)程來(lái)檢查循環(huán)外的此類(lèi)條件。當(dāng)緊密綁定循環(huán)獲得C編譯器通常提供的帶符號(hào)溢出的未定義性質(zhì)的優(yōu)點(diǎn)時(shí),會(huì)將程序從30%加快到50%的速度。
我們還有另一個(gè)優(yōu)點(diǎn),因?yàn)樗试S我們將變量的值存儲(chǔ)在處理器寄存器中,并在大于源代碼中變量的時(shí)間內(nèi)進(jìn)行操作。它還有助于進(jìn)行環(huán)繞檢查,然后進(jìn)行編譯時(shí)檢查,如果不更了解C / C ++編譯器中的未定義行為,就無(wú)法進(jìn)行檢查。
希望對(duì)你有幫助~
另外如果你想更好的提升你的編程能力,學(xué)好C語(yǔ)言C++編程!彎道超車(chē),快人一步!筆者這里或許可以幫到你~

UP在主頁(yè)上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會(huì)對(duì)你有幫助的~
分享(源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門(mén)教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長(zhǎng)比自己琢磨更快哦!
編程學(xué)習(xí)書(shū)籍分享:

編程學(xué)習(xí)視頻分享:
