第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

未定義,未指定和實(shí)現(xiàn)定義的行為

未定義,未指定和實(shí)現(xiàn)定義的行為

RISEBY 2019-05-21 13:42:25
未定義,未指定和實(shí)現(xiàn)定義的行為C和C ++中未定義,未指定和實(shí)現(xiàn)定義的行為有什么區(qū)別?
查看完整描述

5 回答

?
蕭十郎

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超13個(gè)贊

未定義的行為是C和C ++語(yǔ)言的一個(gè)方面,對(duì)于來(lái)自其他語(yǔ)言的程序員來(lái)說(shuō)可能會(huì)令人驚訝(其他語(yǔ)言試圖更好地隱藏它)?;旧希锌赡芫帉?xiě)不能以可預(yù)測(cè)的方式運(yùn)行的C ++程序,即使許多C ++編譯器不會(huì)報(bào)告程序中的任何錯(cuò)誤!

讓我們看一個(gè)經(jīng)典的例子:

#include <iostream>int main(){
    char* p = "hello!\n";   // yes I know, deprecated conversion
    p[0] = 'y';
    p[5] = 'w';
    std::cout << p;}

變量p指向字符串文字"hello!\n",下面的兩個(gè)賦值嘗試修改該字符串文字。這個(gè)程序做什么用的?根據(jù)C ++標(biāo)準(zhǔn)的第2.14.5節(jié)第11段,它調(diào)用未定義的行為

嘗試修改字符串文字的效果是未定義的。

我可以聽(tīng)到人們尖叫“但是等等,我可以編譯這個(gè)沒(méi)問(wèn)題并得到輸出yellow”或“你的意思是什么未定義,字符串文字存儲(chǔ)在只讀內(nèi)存中,所以第一次分配嘗試會(huì)導(dǎo)致核心轉(zhuǎn)儲(chǔ)”。這正是未定義行為的問(wèn)題?;旧?,一旦你調(diào)用未定義的行為(甚至是鼻子惡魔),標(biāo)準(zhǔn)允許任何事情發(fā)生。如果根據(jù)您的語(yǔ)言心理模型存在“正確”行為,那么該模型就是錯(cuò)誤的; C ++標(biāo)準(zhǔn)有唯一的投票期。

未定義行為的其他例子包括訪問(wèn)超出其邊界的數(shù)組,解引用空指針訪問(wèn)對(duì)象后,他們的壽命結(jié)束或?qū)懭?a >據(jù)說(shuō)聰明的表情一樣i++ + ++i。

C ++標(biāo)準(zhǔn)的第1.9節(jié)還提到了未定義行為的兩個(gè)不那么危險(xiǎn)的兄弟,未指定的行為實(shí)現(xiàn)定義的行為

本國(guó)際標(biāo)準(zhǔn)中的語(yǔ)義描述定義了參數(shù)化的非確定性抽象機(jī)器。

抽象機(jī)的某些方面和操作在本國(guó)際標(biāo)準(zhǔn)中描述為實(shí)現(xiàn)定義的(例如,sizeof(int))。這些構(gòu)成了抽象機(jī)器的參數(shù)。每個(gè)實(shí)施應(yīng)包括描述其在這些方面的特征和行為的文件。

抽象機(jī)器的某些其他方面和操作在本國(guó)際標(biāo)準(zhǔn)中被描述為未指定的(例如,對(duì)函數(shù)的參數(shù)的評(píng)估順序)。在可能的情況下,本國(guó)際標(biāo)準(zhǔn)定義了一組允許的行為。這些定義了抽象機(jī)器的非確定性方面。

本國(guó)際標(biāo)準(zhǔn)中將某些其他操作描述為未定義(例如,取消引用空指針的效果)。[ 注意本國(guó)際標(biāo)準(zhǔn)對(duì)包含未定義行為的程序的行為沒(méi)有要求。結(jié)束說(shuō)明 ]

具體而言,第1.3.24節(jié)規(guī)定:

允許的未定義行為包括完全忽略不可預(yù)測(cè)的結(jié)果,在翻譯或程序執(zhí)行期間以環(huán)境特征(有或沒(méi)有發(fā)出診斷消息)的特定行為,終止翻譯或執(zhí)行(發(fā)布時(shí))一條診斷信息)。

你能做些什么來(lái)避免遇到未定義的行為?基本上,你必須閱讀那些了解他們所談?wù)搩?nèi)容的作者的優(yōu)秀C ++書(shū)籍。螺絲網(wǎng)絡(luò)教程。螺旋公牛隊(duì)。


查看完整回答
反對(duì) 回復(fù) 2019-05-21
?
森欄

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超5個(gè)贊

也許簡(jiǎn)單的措辭可以比標(biāo)準(zhǔn)的嚴(yán)格定義更容易理解。

實(shí)現(xiàn)定義的行為
語(yǔ)言表示我們有數(shù)據(jù)類型。編譯器供應(yīng)商指定他們使用的大小,并提供他們所做的文檔。

未定義的行為
你做錯(cuò)了什么。例如,您有一個(gè)非常大的值int,不適合char。你怎么把這個(gè)價(jià)值放進(jìn)去char?實(shí)際上沒(méi)有辦法!任何事情都可能發(fā)生,但最明智的做法是將該int的第一個(gè)字節(jié)放入其中char。分配第一個(gè)字節(jié)是錯(cuò)誤的,但這就是幕后發(fā)生的事情。

未指定的行為
首先執(zhí)行這兩個(gè)函數(shù)?

void fun(int n, int m);int fun1(){
  cout << "fun1";
  return 1;}int fun2(){
  cout << "fun2";
  return 2;}...fun(fun1(), fun2()); // which one is executed first?

該語(yǔ)言未指定評(píng)估,從左到右或從右到左!因此,未指定的行為可能會(huì)或可能不會(huì)導(dǎo)致未定義的行為,但當(dāng)然您的程序不應(yīng)產(chǎn)生未指定的行為。


查看完整回答
反對(duì) 回復(fù) 2019-05-21
?
慕哥9229398

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊

for fun(fun1(), fun2());是不是“實(shí)現(xiàn)定義”的行為?畢竟編譯器必須選擇一個(gè)或另一個(gè)課程?

實(shí)現(xiàn)定義和未定義之間的區(qū)別在于編譯器應(yīng)該在第一種情況下選擇一種行為,但在第二種情況下不需要。例如,實(shí)現(xiàn)必須只有一個(gè)定義sizeof(int)。因此,它不能說(shuō)sizeof(int)程序的某些部分為4,其他部分為8。與未指定的行為不同,編譯器可以說(shuō)OK,我將從左到右評(píng)估這些參數(shù),并且從右到左評(píng)估下一個(gè)函數(shù)的參數(shù)。它可能發(fā)生在同一個(gè)程序中,這就是為什么它被稱為未指定的原因。實(shí)際上,如果指定了一些未指定的行為,C ++可能會(huì)變得更容易。看看Stroustrup博士對(duì)此的回答

據(jù)稱,為編制者提供這種自由并要求“普通的從左到右的評(píng)估”可以產(chǎn)生的差異可能很大。我不相信,但是有無(wú)數(shù)的編譯器“在那里”利用自由和一些人熱情地捍衛(wèi)自由,改變將是困難的,可能需要數(shù)十年才能滲透到C和C ++世界的遙遠(yuǎn)角落。我很失望并非所有編譯器都會(huì)對(duì)++ i + i ++等代碼發(fā)出警告。同樣,參數(shù)的評(píng)估順序是未指定的。

IMO太多“事物”未定義,未指定,實(shí)現(xiàn)定義等。但是,這很容易說(shuō),甚至可以提供示例,但很難修復(fù)。還應(yīng)該注意,避免大多數(shù)問(wèn)題并產(chǎn)生可移植代碼并不是那么困難。


查看完整回答
反對(duì) 回復(fù) 2019-05-21
?
慕蓋茨4494581

TA貢獻(xiàn)1850條經(jīng)驗(yàn) 獲得超11個(gè)贊

來(lái)自官方C理由文件

術(shù)語(yǔ)未指定的行為,未定義的行為和實(shí)現(xiàn)定義的行為用于對(duì)編寫(xiě)程序的結(jié)果進(jìn)行分類,這些程序的屬性標(biāo)準(zhǔn)不能或不能完全描述。采用這種分類的目的是允許實(shí)現(xiàn)中的某種變化,這允許實(shí)現(xiàn)的質(zhì)量成為市場(chǎng)中的主動(dòng)力量以及允許某些流行的擴(kuò)展,而不去除與標(biāo)準(zhǔn)的一致性的標(biāo)記。標(biāo)準(zhǔn)的附錄F對(duì)屬于這三個(gè)類別之一的行為進(jìn)行了編目。

未指定的行為使實(shí)現(xiàn)者在翻譯程序時(shí)具有一定的自由度。只要沒(méi)有翻譯程序,這個(gè)范圍就不會(huì)延伸。

未定義的行為使實(shí)現(xiàn)者許可證不會(huì)捕獲難以診斷的某些程序錯(cuò)誤。它還標(biāo)識(shí)了可能符合語(yǔ)言擴(kuò)展的區(qū)域:實(shí)現(xiàn)者可以通過(guò)提供正式未定義行為的定義來(lái)擴(kuò)充語(yǔ)言。

實(shí)現(xiàn)定義的行為使實(shí)現(xiàn)者可以自由選擇適當(dāng)?shù)姆椒?,但需要向用戶解釋此選擇。指定為實(shí)現(xiàn)定義的行為通常是用戶可以基于實(shí)現(xiàn)定義做出有意義的編碼決策的行為。在決定實(shí)施定義應(yīng)該有多廣泛時(shí),實(shí)施者應(yīng)該牢記這個(gè)標(biāo)準(zhǔn)。與未指定的行為一樣,只是無(wú)法轉(zhuǎn)換包含實(shí)現(xiàn)定義的行為的源不是一個(gè)充分的響應(yīng)。


查看完整回答
反對(duì) 回復(fù) 2019-05-21
  • 5 回答
  • 0 關(guān)注
  • 1312 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)