要将变量 a[1] 转换为指针,然后在 C 中取消引用它,似乎两种格式都有效。例如
*(
- (无符号整数 *( a[1](
(*- (无符号整数 *( a[1](
他们都对吗?它们之间有什么区别吗?
如果您将它们视为完全独立的表达式,或者如果右侧的周围上下文的优先级足够低(不会侵入表达式,因为它的优先级低于取消引用运算符的优先级*
(,则它们是相同的。
否则,第二个版本在强制转换表达式周围有一对()
,将其与周围的上下文"隔离"。例如,具有最高优先级的后缀运算符会对这两个表达式的语义产生不同的影响
*((unsigned int *) a[1])[M]
// Dereference is applied to the result of `[M]`
(*(unsigned int *) a[1])[M]
// `[M]` is applied to the result of dereference
生成的表达式不一定有效,但它们仍然说明了运算符-操作数分组的差异。 例如,在积分M
的情况下,第一个表达式是有效的,第二个表达式不是。在指针M
的情况下,情况正好相反。