4 回答

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊
這是我之前的答案的后續(xù)內(nèi)容,包含C ++ 11相關(guān)資料。。
先修課程:關(guān)系(數(shù)學(xué))的基礎(chǔ)知識(shí)。
在C ++ 11中沒(méi)有序列點(diǎn)是真的嗎?
是! 這是非常正確的。
序列點(diǎn)已被C ++ 11中的Sequenced Before和Sequenced After(以及Unsequenced和Indeterminately Sequenced)關(guān)系所取代。
究竟是什么'之前排序'的事情?
排序之前(§1.9/ 13)是一種關(guān)系,它是:
在由單個(gè)線(xiàn)程執(zhí)行的評(píng)估之間并引發(fā)嚴(yán)格的部分順序1
正式它意味著給定任意兩個(gè)評(píng)價(jià)(見(jiàn)下文) A
和B
,如果A
是之前測(cè)序 B
,則執(zhí)行A
應(yīng)當(dāng)先執(zhí)行B
。如果A
之前沒(méi)有進(jìn)行測(cè)序B
和B
之前沒(méi)有進(jìn)行測(cè)序A
,然后A
和B
在未測(cè)序 2。
評(píng)價(jià)A
和B
被不定測(cè)序或者當(dāng)A
前進(jìn)行測(cè)序B
或B
之前測(cè)序A
,但它是未指定的,其3。
[注釋]
1:嚴(yán)格偏序是一個(gè)二元關(guān)系 "<"
在一組P
其是asymmetric
,和transitive
的,即,對(duì)于所有的a
,b
以及c
在P
中,我們有:
........(I)。如果a <b則?(b <a)(asymmetry
);
........(II)。如果a <b且b <c則a <c(transitivity
)。
2:未經(jīng)測(cè)試的評(píng)估的執(zhí)行可能重疊。
3:不確定順序的評(píng)估不能重疊,但可以先執(zhí)行。
在C ++ 11的上下文中,“評(píng)估”一詞的含義是什么?
在C ++ 11中,表達(dá)式(或子表達(dá)式)的評(píng)估通常包括:
值計(jì)算(包括確定glvalue評(píng)估對(duì)象的標(biāo)識(shí)并獲取先前分配給對(duì)象以進(jìn)行prvalue評(píng)估的值)和
引發(fā)副作用。
現(xiàn)在(§1.9/ 14)說(shuō):
一個(gè)完整的表達(dá)相關(guān)聯(lián)的每個(gè)值的計(jì)算和副作用測(cè)序之前與相關(guān)聯(lián)的每一個(gè)值的計(jì)算和副作用進(jìn)行評(píng)估下一個(gè)完整表達(dá)。
瑣碎的例子:
int x;
x = 10;
++x;
在計(jì)算值和副作用之后,對(duì)與之相關(guān)
++x
的值計(jì)算和副作用進(jìn)行排序x = 10;
因此,未定義行為與上述事物之間必然存在某種關(guān)系,對(duì)吧?
是! 對(duì)。
在(§1.9/ 15)中已經(jīng)提到過(guò)
除非另有說(shuō)明,否則對(duì)個(gè)體操作員的操作數(shù)和個(gè)別表達(dá)式的子表達(dá)式的評(píng)估是不確定的4。
例如 :
int main(){ int num = 19 ; num = (num << 3) + (num >> 3);}
對(duì)操作
+
員的操作數(shù)的評(píng)估相對(duì)于彼此是不確定的。對(duì)操作數(shù)
<<
和>>
操作符的評(píng)估相對(duì)于彼此是不確定的。
4:在一個(gè)程序的執(zhí)行過(guò)程中被評(píng)估一次以上的表達(dá),未測(cè)序和不定測(cè)序其子表達(dá)式的評(píng)估不需要在不同的評(píng)價(jià)一致的方式進(jìn)行。
(§1.9/ 15)運(yùn)算符操作數(shù)的值計(jì)算在運(yùn)算符結(jié)果的值計(jì)算之前排序。
這意味著在x + y
值計(jì)算之前,x
并且y
在計(jì)算值之前對(duì)其進(jìn)行排序(x + y)
。
更重要的是
(§1.9/ 15)如果對(duì)標(biāo)量物體的副作用相對(duì)于其中任何一個(gè)都沒(méi)有排序
(a)對(duì)同一標(biāo)量物體的另一個(gè)副作用
要么
(b)使用相同標(biāo)量對(duì)象的值進(jìn)行值計(jì)算。
行為未定義。
例子:
int i = 5, v[10] = { };void f(int, int);
i = i++ * ++i; // Undefined Behaviour
i = ++i + i++; // Undefined Behaviour
i = ++i + ++i; // Undefined Behaviour
i = v[i++]; // Undefined Behaviour
i = v[++i]: // Well-defined Behavior
i = i++ + 1; // Undefined Behaviour
i = ++i + 1; // Well-defined Behaviour
++++i; // Well-defined Behaviour
f(i = -1, i = -1); // Undefined Behaviour (see below)
當(dāng)調(diào)用函數(shù)(函數(shù)是否為內(nèi)聯(lián)函數(shù))時(shí),與任何參數(shù)表達(dá)式相關(guān)聯(lián)的每個(gè)值計(jì)算和副作用,或者使用指定被調(diào)用函數(shù)的后綴表達(dá)式,都會(huì)在執(zhí)行每個(gè)表達(dá)式或語(yǔ)句之前對(duì)其進(jìn)行排序。叫功能。[ 注意: 與不同參數(shù)表達(dá)式相關(guān)的值計(jì)算和副作用未被排序。- 結(jié)束說(shuō)明 ]
表達(dá)式(5)
,(7)
而(8)
不要調(diào)用未定義的行為。有關(guān)更詳細(xì)的說(shuō)明,請(qǐng)查看以下答案。
最后的說(shuō)明:
如果您發(fā)現(xiàn)帖子中有任何缺陷,請(qǐng)發(fā)表評(píng)論。高級(jí)用戶(hù)(代表> 20000)請(qǐng)不要猶豫,編輯帖子以糾正拼寫(xiě)錯(cuò)誤和其他錯(cuò)誤。

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個(gè)贊
我猜這個(gè)改變有一個(gè)根本原因,讓舊的解釋更清晰,不僅僅是裝飾性的:原因是并發(fā)性。未指定的細(xì)化順序僅僅是選擇幾個(gè)可能的連續(xù)排序中的一個(gè),這與排序之前和之后完全不同,因?yàn)槿绻麤](méi)有指定的排序,則可以進(jìn)行并發(fā)評(píng)估:舊規(guī)則不是這樣。例如:
f (a,b)
先前要么是b,要么是b,然后是a?,F(xiàn)在,可以使用交錯(cuò)的指令或甚至在不同的核上評(píng)估a和b。

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個(gè)贊
在C99(ISO/IEC 9899:TC3)
這似乎從這個(gè)討論迄今以下steteents是關(guān)于及其評(píng)價(jià)問(wèn)題作了缺席。
[...]子表達(dá)式的評(píng)估順序和副作用發(fā)生的順序都是未指定的。(第6.5節(jié)第67頁(yè))
操作數(shù)的評(píng)估順序未指定。如果嘗試修改賦值運(yùn)算符的結(jié)果或在下一個(gè)序列點(diǎn)之后訪(fǎng)問(wèn)它,則行為[sic]未定義。(第6.5.16節(jié)第91頁(yè))
- 4 回答
- 0 關(guān)注
- 832 瀏覽
添加回答
舉報(bào)