C运算符优先级指针增量

时间:2014-12-03 21:22:06

标签: c pointers memory

我试图理解一行C代码,其中包括使用指向struct value的指针(也是指向某个东西的指针)。

示例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代码究竟做了什么?

3 个答案:

答案 0 :(得分:3)

“那段C代码究竟做了什么?”

浪费大量时间不得不仔细阅读,而不是一目了然。如果我正在对此进行代码审查,我会将其反馈给作者,并将其分解为两行。

它做的两件事是在e->输出处保存一些东西,然后将e->输出提前到下一个字节。我想如果你需要用两个部分描述代码,它应该是两行,有两个单独的语句。

答案 1 :(得分:1)

正如Deduplicator在上面的评论中指出的那样,查看operator precedence table可能有所帮助。

  • *e->output++ = ...表示"将值...分配给e->output指向的位置,然后让e->output指向新的位置8位(因为output的类型为uint8)。
  • 然后评估
  • (uint8) (e->bottom >> 24)以获取...
  • 的值

答案 2 :(得分:1)

该行

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

执行以下操作:

  1. 找到指针bottom指向的结构的字段e
  2. 从该字段中获取32位值。
  3. 将该值右移24位。
  4. 将该值重新解释为uint8_t,现在包含高位字节。
  5. 找到结构的字段output。它是指向uint8_t
  6. 的指针
  7. 将之前计算的uint8_t存储到output指向的地址。
  8. 最后,向output添加1,使其指向下一个uint8_t
  9. 只要结果,某些事情的顺序可能会重新排列 行为好像他们已按此顺序完成。运算符优先级是完全的 将问题与执行操作的顺序区分开来,而不是真的 相关的。