在表達式p + a
其中p
是一個指針類型,而a
是一個整數,整數提升規則是否適用?例如,如果a
是char
,在64位機器上它肯定會擴展到64位,然後纔會被添加到指針值(在編譯的程序集中),但它是由標準指定的嗎?什麼將被提升到? int
,intptr_t
或ptrdiff_t
? unsigned char
或size_t
將被轉換爲什麼?指針運算和積分提升
回答
它不要求任何推廣的標準似乎發生,因爲char
是一個整數類型:
對於另外,無論是兩個操作數應有的算術或無作用域的枚舉類型, 或一個操作數應爲指向一個完全定義的對象類型,另一個應該有整數或無限枚舉類型
看來實現可能取決於底層架構允許的指針添加類型 - 所以如果架構支持address+BYTE
- 一切都很好與char
- 如果不是,它可能會提升到支持的最小地址偏移量大小。
指針的減法的結果被定義爲類型`的std :: ptrdiff_t的」的
當兩個指針相同的數組對象的元素相減,其結果是的下標之差兩個數組元素。結果的類型是實現定義的有符號整型;這種類型應該是在標題中定義爲std :: ptrdiff_t的相同類型
我想說正常整數升級應用於a
。 C-Standard不提供任何特定的規則來轉換指針上的算術運算的整數部分。
也就是說,當a
聲明char
,它被轉換爲int
被傳遞給操作者+
之前。
如果再加一個size_t
它要麼留什麼size_t
被定義爲,或者如果(無論何種原因)它具有較小的排名則int
它提升到int
。
是的,它在該
通常的算術轉換針對 算術或枚舉類型的操作數執行的C++標準(段落#1部5.7加法運算符)被指定。
對於rank小於int的類型(例如char或unsigned char),將執行整數提升。對於size_t(size_t的級別不小於int或unsigned int的級別),則不會執行任何操作,因爲沒有算術類型的第二個操作數。
C++ 11§5。7/1:
「加法運算符
+
和-
組左到右。通常的算術轉換是針對算術或枚舉類型的操作數執行的。 」
這顯然降低了問題要考慮通常的算術轉換,由下式定義…
C++ 11§5/ 9:
「意想不到算術或 枚舉類型原因的轉化率和產率結果類型的操作數以類似的方式 許多二進制運算符。目的是爲普通類型,這也是 類型的結果這種模式被稱爲通常的算術轉換, 其被定義爲如下:
如果操作數是作用域枚舉的類型(7.2),不執行轉換;如果otheroperand不具有相同的類型,則該表達式是不合格的。
如果任一操作數的類型爲
long double
,則另一個操作數應轉換爲long double
。否則,如果其中一個操作數是
double
,另一個應轉換爲double
。否則,如果任一操作數是
float
,則另一個應轉換爲float
。否則,積分促銷(4.5)應在兩個操作數上執行。然後以下規則應適用於提升的操作數:
如果兩個操作數具有相同類型,則不需要進一步轉換。否則,如果兩個操作數具有帶符號整數類型或兩者都具有無符號整數類型,則具有較小整數轉換等級類型的操作數應轉換爲具有較大等級的操作數的類型。否則,如果具有無符號整數類型的操作數的秩大於或等於另一個操作數的類型的秩,則帶符號整數類型的操作數應轉換爲具有無符號整數的操作數的類型類型。否則,如果具有有符號整數類型的操作數的類型可以表示具有無符號整數類型的操作數類型的所有值,則具有無符號整數類型的操作數應轉換爲操作數的類型,其中有符號整數類型。
否則,兩個操作數都應轉換爲與帶符號整數類型的操作數的類型相對應的無符號整數類型。」
其次機械,這組規則將在最後一個項目符號點結束(在標準短劃線)和指針操作數轉換成無符號整數型對應的東西的非現有。這是錯誤的。因此措辭「通常的算術轉換是對算術或枚舉類型的操作數執行」不能被字面解釋–它是恕我直言的缺陷–但必須解釋爲「通常的算術轉換是針對兩個操作數都是算術或枚舉類型「
因此,促銷因此,這是通過通常的算術轉換調用,不會發揮作用,當一個操作數是一個指針。
但是在§5.7中有一點發現......
C++ 11§5.7/ 5:
「當具有整體式的表達式被加到或減去一個指針,其結果具有指針操作數的類型。如果指針操作數指向數組對象的一個元素,並且該數組足夠大,則結果指向與原始元素偏移的元素,以使得結果數組元素和原始數組元素的下標之差等於整數表達式。 」
這個定義了完全根據數組索引的結果。對於char
陣列,下標的差異可能會超出ptrdiff_t
的範圍。實現來安排它的一個合理方法是將非指針參數轉換爲無符號整型size_t
(在位級有效地標記擴展),並將該值與模運算結合使用來計算結果指針值。
- 1. 指針運算和地址
- 2. C++,指針和運算符
- 3. 指針運算
- 4. 指針指針(* argv [])的指針運算?
- 5. 提升侵入指針
- 6. Ç - 指針運算
- 7. C++指針運算
- 8. 指向指針運算
- 9. void *指針上的指針運算
- 10. 指針運算後釋放指針
- 11. 指針數組上的指針運算
- 12. 「this」指針上的指針運算
- 13. 提升foreach和運算符超載
- 14. 自定義lucene評分 - 字段提升和查詢提升之間的點積
- 15. 間接運算符和指針數組
- 16. 使用memcmp()和指針運算
- 17. 指針運算C和澆鑄
- 18. 限制限定符和指針運算
- 19. 指針和引用+運算符重載
- 20. sizeof運算指針陣列
- 21. C/C++:指針運算
- 22. 指針運算在C
- 23. 下指針運算警告
- 24. 指針運算的類型
- 25. 指針運算與陣列
- 26. ++指針上的運算符
- 27. 的C指針運算
- 28. Objective-C:指針運算
- 29. 一些指針運算
- 30. 理解指針運算
該標準沒有指定。它只定義了操作的結果是什麼:[expr.add]段落5(從n3797開始)。
–從[expr]第10段(從n3797開始)
正如我們所知,類型(指針)算術轉換不適用於這種情況。 –這麼多衝突的答案...... –