2014-12-03 29 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

的一些这些东西的顺序,只要可能被重新安排了一下作为结果 行为仿佛他们的顺序已经完成。运算符优先级与执行操作的顺序完全不同,而不是真正的 。