2013-05-14 27 views
5

§6.5.8\6(關於>,<,< =,> =)奇怪措詞在標準,關於指針比較

如果表達式P指向數組對象的元件和 表達Q點到相同數組對象的最後一個元素,指針表達式Q + 1的 比較大於P.在所有其他情況下, 的行爲未定義。

上面幾節中,第6.5.8節解釋說,基本上,指針的算術在數組上是按預期工作的。那是int a[3]; int *p = a; int *q = &a[2]; //q-p == 3是有效的。但是,正如我讀到q > p是UB。

我在想什麼?段落

+6

您在上一句之前錯過了句子:「帶有較大下標值的數組元素的指針比指向具有較小下標的相同數組的元素的指針要長。你所引用的是允許半開範圍的例外,如['a','a + 3')。 – dyp 2013-05-14 13:47:25

+0

@DyP,哦,好吧。爲了理解它,我必須再讀5遍。另一個愚蠢的問題形成我的一面:( – Vorac 2013-05-14 13:59:53

+1

這是標準,有些人聲稱這是標準的困難和不直觀的公式;) – dyp 2013-05-14 14:01:23

回答

1

首先,你所引述的部分,第一部分解釋了什麼,這是引用,包括我在這裏的一段話:

當兩個指針進行比較,結果依賴於相對位置指向的對象的地址空間爲 。如果兩個指向對象類型的指針都指向同一個對象,或者兩個指向同一個數組對象的最後一個元素,則它們的 比較相等。如果指向的對象是同一個聚集對象的成員,則指向稍後聲明的結構成員的指針將比指向結構中較早聲明的成員 的指針要多,指向具有較大下標 的數組元素的指針值會比指向元素的指針大具有較低下標值的相同數組。所有指向同一聯合對象成員的指針都相等。如果 表達式P指向數組對象的元素,而表達式Q指向相同數組對象的最後一個元素,則指針表達式Q + 1的比較大於P.在所有其他情況下,行爲是未定義的。

基本上,你被引用位是指這樣的事實:通常的指針必須始終點要麼獨立對象,對象的陣列或一個過去的陣列的端部的元件對象。正如你所看到的,通常增加一個已經指向數組最後一個元素的指針會產生一個無效指針,並且標準中的這個指針實際上不能被解除引用,但是它可以用於一個特殊情況,就是它可以設置或與另一個指針進行比較。

這在程序中非常有用,您可以在該程序中增加一個指針,然後檢查它是否超過數組的末尾並終止它。例如。

int foo = 0; 
int ArrSize = 6; 
int bar[ArrSize]; 
while(foo < ArrSize) 
{ 
    foo++; 
    printf("%d", bar + 3 < bar + foo); 
} 

將是合法的,即使在富指向一個超過數組結束的最後一種情況。

注意這個例子很有意思,但是證明了這一點。

如果不是這個規則,這個程序將是未定義的行爲。

+0

最後一次迭代會在您的示例代碼中導致未定義的行爲。 'bar + 7'使UB在關於'+'表示指針加整數的部分下面。 – 2014-08-19 11:12:15

+0

@MattMcNabb Argh,你說得對,我使用了錯誤的操作符,本來打算使用<。我從字面上將這兩個數字混合了數百次,在我將近15年後我會想到,我會避免這個愚蠢的錯誤。不過,感謝評論,我認爲它現在已經修復。 – Vality 2014-08-19 11:54:04

+1

@MattMcNabb我確實認識到Q + 2並沒有例外,我犯的錯誤是,總是讓數組長度爲數組的長度!=最後一個元素的索引。我總是從1而不是零( – Vality 2014-08-19 11:59:14