2015-10-13 114 views
4

我遇到了一個內核補丁,它在已經有func(&a->b)時添加了一行func(&(a->b))&a->b&(a->b)之間有什麼區別?帶括號和不帶括號的運算符的地址

請解釋。

+1

在這種情況下,使用括號可以更清楚地表達你的意思。 – teppic

+0

@TlerlerSebastian不,這兩個表達式是等價的。 ' - >'的優先級高於'&'。 –

+0

@PCLuddite是啊我記得我發表我的評論後,隨後刪除它。 –

回答

0

No. ->foo(對於任何值foo)是後綴運算符,並且具有比&(前綴運算符)更高的優先級。

3

沒有區別,這只是爲了可讀性。 ->具有比&參考運算符更高的優先級。請參閱here

爲了進一步證明了這一點,看看這些線的dissasembly:

一些短代碼

struct A { 
    int b; 
}; 

int main() { 
    struct A *a; 
    int *c; 

    c = &a->b; // Disassemble these lines. 
    c = &(a->b); 

    return 1; 
} 

兩條線的dissasembly等同於以下內容:

movq -16(%rbp), %rax 
    movq %rax, -8(%rbp) 

試試here中的代碼自己看看。

+2

你真的不需要證明,它在絕對清晰的黑白中優先規則:) – teppic

+1

@teppic我知道,我只是喜歡使用該工具! –

0

沒有區別。 ->組件選擇運算符的優先級高於一元運算符&,因此表達式&a->b被解析爲&(a->b),結果是a指向的實例中的成員b的地址。