簡體   English   中英

我無法理解C99中的一些句子

[英]I can not understand some sentences in C99

在C99 6.5中說:

在前一個和下一個序列點之間,對象的存儲值最多只能通過表達式的計算修改一次。 此外,先前的值應該只讀以確定要存儲的值

什么“此外,先前的值只能讀取以確定要存儲的值”是什么意思? 在C99中,為什么a[i++] = 1是未定義的行為?

a[i++] = 1被定義(除非其他原因未定義,而不是副作用的排序:超出限制的訪問,或未初始化的i )。

你的意思a[i++] = i ,這是未定義的行為,因為它在與i++相同的序列點之間讀取i ,這改變了它。

“此外,先前的值應只讀以確定要存儲的值”部分表示i = i + 1; 是允許的,雖然它從i讀取並修改i

另一方面, a[i] = (i=1); 是不允許的,因為盡管寫i只有一次,從讀i不是計算值被存儲。

“先前的值應該只讀以確定要存儲的值”,措辭無疑是違反直覺的; 為什么值的讀取目的是什么?

該句的要點是強制要求哪些結果取決於哪些操作。

我會從帕斯卡的答案中偷走一些例子。

這個:

i = i + 1;

很好。 i在相同的表達式中讀取和寫入,沒有中間序列點,但是沒關系,因為寫入在讀取完成之后才能發生。 在表達式i + 1及其子表達式i已被完全評估之前,不能計算要存儲的值。 (並且i + 1沒有可能在寫入之后延遲的副作用。)該依賴性強加了嚴格的排序:必須在寫入開始之前完成讀取。

另一方面,這個:

a[i] = (i=1);

有未定義的行為。 子表達式a[i] 讀出的值i ,和子表達式i=1 寫入的值i 但是通過寫入存儲在i的值不依賴於在左側讀取i的評估,因此未定義讀取和寫入的順序。 “要存儲的值”是1 ; a[i]中讀取i並不能確定該值。

我懷疑這種混淆是為什么2011年修訂的ISO C標准(草案形式為N1570 )重新措辭了該部分。 該標准仍然具有序列點的概念,但6.5p2現在說:

如果相對於對同一標量對象的不同副作用或使用相同標量對象的值進行值計算,對標量對象的副作用未被排序,則行為未定義。 如果表達式的子表達式有多個允許的排序,則如果在任何排序中發生這種未測序的副作用,則行為是不確定的。

第1段明確說明了C99中隱含的假設:

在運算符的結果的值計算之前,對運算符的操作數的值計算進行排序。

第5.1.2.3節第2節解釋了之前順序和關系之后順序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM