解引用和遞增運算子復合表示式是一種很常見的表達,特別是在很多迭代器的使用時,不僅需要返回引用值還需要訪問下乙個元素,這類復合表示式往往不太能直觀理解。
直接舉例說明:
class test3
; int *p1, *p2, *p3,*p4;
p1 = p2 = p3 = p4 = a;
cout
<< (*p1)++ << endl;
cout
<< *p1 << endl;
cout
<< *(p2++) << endl;
cout
<< *p2 << endl;
cout
<< *++p3 << endl;
cout
<< *p3 << endl;
cout
<< ++*p4 << endl;
cout
<< *p4 << endl;
return;
}};
首先有乙個原則:
遞增運算子優先順序高於解引用運算子。
然後分析上述例子:
(*p1)++ :因為有括號,所以先解引用p1的值,然後值遞增,又是後置運算子所以先輸出再遞增,結果應該為10。
*p1 :接上句,遞增後的值應該為11。
*(p2++) :因為有上述原則,所以*(p2++)等價於*p2++,先運算位址遞增再解引用值,值得注意的是,p2++是後置遞增,所以雖然是先計算遞增運算子,但是解引用運算子的運算元仍然是遞增前的p2,又上面已經通過p1修改了a[0],所以輸出為11。
*p2 :如上所說,是位址遞增,而不是解引用後的值,所以輸出應該為a[1],即20。
*++p3 :有了上面解釋接下來幾個就好理解了,先運算位址遞增再解引用值,最後輸出20。
*p3 :結果不變,20。
++*p4 :先解引用p4的值,然後a[0]=11值遞增,又是前置運算子所以先遞增再輸出,結果應該為12。
*p4 :結果不變,12。
來看輸出:
10結果和分析一致。11 11
20 20
20 12
12
C 引用 與 運算子過載
c 中,引用其實還是靠指標實現的 為什麼要引入引用呢?c 之父說,最初是為了實現運算子過載方便,下面舉個例子 例如 c a b是可以接受的寫法,而c a b 就不是很方便而且有歧義了 那麼下面說一下,哪些運算子過載必須用引用呢 運算子,它本身的意義是 自增,並返回自增後的值 所以就要返回自己,而不是...
C 中引用與位址運算子( )
在c 中,這個符號有兩個含義,一種含義是取某個變數或者物件的位址。這個位址是指記憶體位址,這個位址取 到之後,可以賦給乙個指標。例如下面這樣 int a 5 int p a 這就表示,有乙個變數為a,其值為5,然後有乙個指標變數p,它儲存了變數a的位址。但c 中,還有乙個用途是定義引用常量。引用其實...
C語言 運算子與 運算子
我們平時使用帶參巨集時,字串中的巨集引數是沒有被替換的。例如 輸出結果為 然而,我們期望輸出的結果是 5 20 2513 14 27 這該怎麼做呢?其實,c語言允許在字串中包含巨集引數。在類函式巨集 帶參巨集 中,號作為乙個預處理運算子,可以把記號轉換成字串。例如,如果a是乙個巨集形參,那麼 a就是...