C 基礎系列 解引用與遞增運算子 與 問題

2021-08-10 11:19:06 字數 1144 閱讀 8728

解引用和遞增運算子復合表示式是一種很常見的表達,特別是在很多迭代器的使用時,不僅需要返回引用值還需要訪問下乙個元素,這類復合表示式往往不太能直觀理解。

直接舉例說明:

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就是...