2014-12-03 64 views
0

我想了解一行C代碼,其中包括使用指向結構值(這是一個指針)以及指針。C運算符優先級與指針增量

例C-代碼:

// Given 
typedef struct { 
    uint8 *output 
    uint32 bottom 
} myType; 
myType *e; 

// Then at some point: 
*e->output++ = (uint8) (e->bottom >> 24); 

來源:http://tools.ietf.org/html/rfc6386#page-22

我的問題是:

  • 究竟是什麼的C-該行代碼呢?
+0

@JimB另一種意義也沒有多大意義 - 你能否詳細說明它的功能? (這樣我可以修復標題) – 2014-12-03 21:28:06

+0

@Deduplicator感謝您指出這一點,我很好奇它是否太寬泛。更新了問題。 – 2014-12-03 21:34:14

+0

@Deduplicator只是可以肯定的,這意味着寫* e.output =(uint8)(e - > bottom >> 24)+ 1'也是一樣嗎? – 2014-12-03 21:40:23

回答

1

正如上面評論中的Deduplicator指出的那樣,查看operator precedence table可能會有幫助。

  • *e->output++ = ...指「分配值...e->output所指向的位置,並讓e->output點到新位置的8位進一步之後(因爲outputuint8類型)。
  • (uint8) (e->bottom >> 24)然後評估,以獲得對於...
3

值 「究竟是什麼做的C-代碼行嗎?」

浪費大量的時間,不得不仔細閱讀,而只是一眼就明白。如果我正在對代碼進行審查,我會把它交給作者,並將其分解爲兩行。

它所做的兩件事是在e-> output處保存一些內容,然後將e-> output輸出到下一個字節。我認爲,如果你需要用兩部分來描述代碼,它應該在兩行上分別用兩條語句。

+0

除非對優化有急劇且迫切的需求,否則代碼行會執行某些操作這可以更清楚地表達出來。代碼是一次寫入,多次閱讀 - 可憐的讀者,並使其易於閱讀。 – 2014-12-04 02:01:00

1

*e->output++ = (uint8) (e->bottom >> 24); 

執行以下操作:

  1. 找到字段bottom的結構指向的指針e
  2. 從該字段獲取32位值。
  3. 將該值右移24位。
  4. 將該值重新解釋爲uint8_t,該值現在包含高位字節。
  5. 找到該結構的字段output。這是一個指向uint8_t
  6. 將我們之前計算的uint8_t存儲到output指向的地址中。
  7. 最後,加1到output,導致它指向下一個uint8_t

的一些這些東西的順序,只要可能被重新安排了一下作爲結果 行爲彷彿他們的順序已經完成。運算符優先級與執行操作的順序完全不同,而不是真正的 。