如何辨認乙個複雜宣告表示式子中變數的型別?

2021-07-27 19:39:31 字數 2248 閱讀 4066

何謂複雜宣告表示式子中變數的型別?先來看看這段**:

typedef

double* (*a)[10];

typedef

int* (*b[10])[10];

typedef

int(*(*c)(int,int))(int);

typedef

int(*(**d[5])(int))(void(*)(void));

以上a,b,c,d 的型別是什麼呢?

當然,實際工程中不太會出現這麼複雜的型別,所以這個知識點在實際過程中沒有太大的重要性,再加上c++11有了auto關鍵字,使得我們在定義型別的時候可以不用完全知曉變數的型別。

例如我要定義乙個指標指向上述中的d型別變數:

d var1;

auto var2 =&m;

所以說,這個知識點大多數可能會在筆試中遇到,給你乙個複雜型別表示式,然後問你它的型別,又或者是進行某些運算後,問其結果。

那麼這裡我提供幾個技巧,可以快速方便的找出變數的型別:

首先先說符號結合優先順序:

最高是()括號,注意這裡的括號不是函式表示式中引數列表的括號。

然後是函式引數列表的括號、陣列(這兩個是同級)。

最後是 * 指標(引用&和指標也同級,但這裡不談論引用)。

優先順序講完了,在來講如何去認型別:

比如: typedef double* (*a)[10];

我們先找到變數的位置,然後根據符號結合優先順序依次結合:

因為有括號,所以最先結合的是 * ,說明 a 是乙個指標,指向的是(這個時候用新變數替換*a ) double* aa[10]。

然後繼續結合,這次是跟[10]結合,所以a是乙個指標指向乙個陣列,陣列大小為10,元素型別為(繼續替換) double* aaa;

很顯然了aaa型別為double*,所以綜上:a是乙個指標指向乙個大小為10,元素型別為double*的陣列。

繼續舉例子:typedef int* (*b[10])[10];

首先結合是[10],說明b是乙個陣列,大小為10,元素型別為(用新變數替換)int* (*bb)[10]。

繼續結合*,說明陣列元素型別為指標,指向(替換)int* bbb[10]。

很顯然了bbb的型別為陣列,陣列元素為int*。

所以綜上:b是乙個陣列,大小為10,元素型別為指向大小為10,元素型別為int* 的陣列的指標。

繼續舉例子:typedef int(*(*c)(int,int))(int);

首先結合是*,說明c是乙個指標,指向的是(替換)int(*cc(int,int))(int)。

繼續結合函式引數列表(int,int)。說明cc是乙個函式,函式引數列表為(int,int)返回值為(替換)int(*ccc)(int)。

很顯然了ccc的型別為函式指標,指向引數列表為(int),返回值為int的函式。

所以綜上:c是乙個指標,指向乙個引數列表為(int,int)返回值為函式指標,這個函式指標指向引數列表為(int),返回值為int的函式。

最後乙個例子:typedef int(*(**d[5])(int))(void(*)(void));

首先結合的是*,說明d是乙個指標,指向(替換)int(*(*dd[5])(int))(void(*)(void))。

然後結合的是[5],說明dd是乙個陣列,陣列元素是(替換)int(*(*ddd)(int))(void(*)(void))。

然後結合的是*,說明ddd是乙個指標,指向的是(替換) int(*dddd(int))(void(*)(void))。

然後結合的是(int),說明dddd是乙個函式,函式列表為(int),返回值為(替換) int(*ddddd)(void(*)(void))。

然後結合的是*,說明ddddd是乙個指標,指向(替換)int dddddd(void(*)(void))。

很顯然了dddddd是乙個函式,函式引數列表為(void(*)(void)),返回值是int。這裡的引數是乙個函式指標。函式引數、返回值都是void。

綜上所述:d是乙個指標,指向乙個陣列,陣列元素是指標,元素指向乙個函式,函式的引數為int,返回值為乙個函式指標,指向乙個返回值為int,引數為乙個函式指標,指向返回值和引數都為空的函式。

最後乙個有點繞,不過由於本人語文水平有限,找不到一種合適的陳述方式來表達。不過一般筆試也不會出這麼複雜的式子。僅當用於理解以上辨認規則的例子。

乙個蠻複雜的LINQ表示式

最近寫了這麼乙個方法 返回結果大致為 aagp30pmdrvs56nk public string getusbdisksnviadriveletter string strusbdiskdriveletter return null resharper外掛程式提示我這個可以轉變為乙個linq表示式...

給出乙個表示式,求取表示式的值

include include include include include using namespace std 思路 1.字串預處理,針對可能出現的 等特殊情況進行替換,判斷 是負號還是減號,負號前面 0,轉變成減法運算 2.將中綴字串轉變為字尾字串陣列 3.對字尾字串陣列進行求解 int ...

如何畫出乙個表示式的樹形結構

大家都知道,表示式樹前序遍歷得到字首表示式,中序遍歷得到中綴表示式,後序遍歷得到字尾表示式,那麼,如何根據最常見的中綴表示式畫出表示式的樹形結構圖呢?步驟1 求出中綴表示式對應的字尾表示式 步驟2 根據字尾表示式畫圖 我們一次乙個符號地讀入字尾表示式。如果符號是運算元,那麼就建立乙個單結點樹並將它的...