簡體   English   中英

我如何確定我是否過度使用括號?

[英]How can I determine if I'm overparenthesizing?

我目前正試圖避免在 C 中使用指針算術來編寫模擬器。

通常,如果在 C 中為指針加1 ,則改為添加指向對象的大小。 但是,我正在嘗試使用位和字節,所以這是不受歡迎的。

我想知道在這個例子中我是否使用了太多括號:

*(int16_t *)(((intptr_t)bc)+sp)

如果不是,那么它相當於這個嗎?

*(int16_t *)((intptr_t)bc+sp)

sp是一個頁對齊的堆棧地址為我的模擬器(通過。獲得mmap沒有MAP_FIXED集)。 它是一個intptr_t類型。

bcint16_t *類型的名稱。 它是一個指向兩個int8_t組合的指針。

(((intptr_t)bc)+sp)等價於((intptr_t)bc+sp)


但是整個“避免指針算術”的方法是不可移植的。

至少有3個問題:

  • 指針,轉換為整數,當然不會維護所需的數學屬性。

     // possible outcome uint16_t x[2]; printf("%llx\\n", (unsigned long long) (intptr_t) &x[0]); // --> abcd0000 printf("%llx\\n", (unsigned long long) (intptr_t) &x[1]); // --> abcd0010

作為整數的差異可能是 16 而不是希望的 2——即使 2 的差異更常見。

  • 此外,對於*(int16_t *)((intptr_t)bc+sp) ,如果sp是奇數, (int16_t *)可能會由於對齊限制而失敗。

  • 抗鋸齒問題也會出現。 @安德魯·亨勒

盡管整數這樣避免指針算術有各種陷阱 - 祝你好運。

您要問的是運算符優先級。 可以在此處找到完整列表

“+”操作發生在類型轉換操作之后。 因此,您不需要第二層括號,因為intptr_t首先應用於bc ,然后將結果添加到sp

暫無
暫無

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

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