劇多
首頁
資訊
體育
娛樂
汽車
投資
財經
軍事
科技
數碼
科學
遊戲
歷史
健康
政治
影視
旅遊
育兒
美食
時尚
房產
農業
社會
文化
教育
技術
美文
情感
故事
家居
職場
自然
闢謠
心理
攝影
漫畫
生活
其它
Club
Tips
熱門話題
搜尋
註冊
登入
首頁
>
Club
>
葉芳鑾
2021-02-03 07:52
有輸入語句:int a?
4
回覆列表
1 # 使用者9531277222877
對0. 如何理解不過如果要更加系統化地理解C的型別表示式,可以使用下面的方法一個宣告本身可以看作是一個不斷巢狀括號的“表示式”,例如int a[10][10]這個語句,其實它的構成是:
int (((a)[10])[10])編譯器在遍歷抽象語法樹的時候是這麼考慮的:1. 首先,令x1 =(((a)[10])[10]),這時相當於int x1;x1的型別是int,記作x1.type = int。2. 接著,領x2 = ((a)[10]),這時有x1 = x2[10];這說明x2是一個長度為10,元素型別為x1.type的陣列,其型別x2.type = array(10, x1.type) = array(10, int);3. 然後,令x3 = a,則有x2 = x3[10];則有x3.type = array(10, x2.type);代入2)中的結果得:x3.type = array(10, array(10, int))。其中,array(length, type)表示一個長度為length,元素型別為type的陣列型別。用遞迴方法表示就是:1)a.type = array(10, t1)2)t1 = array(10, t2);3)t2 = int1. 舉一反三那麼好了,用這個方法,我們可以解釋相當一部分很難理解的型別,例如這個詭異的宣告語句:int (*(x[10]))(char, char)這是個什麼鬼呢?首先,我們按照層次順序來看:1)x1 = (*(x[10]))(char, char);這時候宣告等價於int x1;說明x1.type = int;2)x2 = (*(x[10]));這時由x1 = x2(char, char),說明x2是一個返回型別為x1.type,輸入兩個char型別引數的函式,我們記作x2.type = func(x2.type, [char, char]);代入x1.type得到:x2.type = func(int, [char,char]);3)x3 = (x[10]);這時候有x2 = *x3,說明x3是指向x2型別的指標,因此x3其實就是個函式指標啦!有:x3.type = ptr(x2.type) = ptr(func(int, [char,char]))4)x4 = x;這時候有x3 = x4[10],說明x4是一個指向x3型別的長度為10的陣列,即:x4.type = array(10, x3.type) = array(10, ptr(func(int, [char,char])))那麼x的型別是什麼呢?用自然語言說起來有點繞口,那就是:1)x是一個長度為10的陣列,它的元素型別為t1;2)型別t1是一個指標型別,t1指標內容的型別為t2;3)型別t2是一個函式型別,該函式輸入兩個char型別引數,返回型別為t3;4)型別t3為int2. 如何使用?宣告一個複雜型別的變數容易,但是能合法地使用並不是很簡單。以章節1部分的那個宣告為例:int (*(x[10]))(char, char)這個變數的一個合法使用是:x[1]("a", "b")怎麼理解這個表示式?也是按照層次來分析:1)首先x[1],由於x.type = array(10, ptr(func(int,[char,char])))),因此x[1]的型別是ptr(func(int, [char, char])),即一個指向函式的指標,指向的函式接收兩個char型別值,返回int型別。2)接著(x[1])("a","b"),相當於在x[1]的型別上再呼叫一次函式,由於x[1]是一個函式指標,因此可以直接作為函式呼叫,它接受了兩個字元輸入,因此這個表示式其實就是一個函式呼叫!那麼簡單的如何解釋呢?x[1]首先獲取x陣列位置1的函式指標;接著用引數("a","b")呼叫x[1]所指向的函式;最後,呼叫完成後,返回這個函式在("a","b")下的返回值。3. 應用在弄明白了C語言這些宣告語句的層次關係後,現在請設計一個函式表型別,這個函式表輸入函式名稱,返回一個該函式名稱的過載函式列表的指標;這些函式都有相同的宣告形式,如下:int func(void *, void *)在C++中,這麼宣告(本人沒嘗試過,哪位閒著無聊可以試一下能不能透過編譯。。。):using namespace std;map<string, int (*[])(void *, void *)> func_map;例如,當我要使用名稱為“compare_100”函式名的函式列表時,透過:auto list = func_map["compare_100"];接著,我們選取這個list的第一個函式指標auto fptr = list[0];最後,呼叫該函式:auto retval = fptr(x, y);當然你也可以一步寫完:auto retval = func_map["compare_100"][0](x, y);4. 用C寫函數語言程式設計正規化程式最後各位可以試一下下面這個定義宣告,是不是能透過編譯?理解一下它神馬意思?int (*(select_function(char *))(char, char));給你們一點提示,下面是使用這個變數select_function的例子:auto fptr = select_function("min_char");auto a_b_min = fptr("a", "b");是不是有點像函數語言程式設計正規化?根據名稱返回一個函式?順帶一提,這可都是用純C/C++語法寫出來的喲,沒借助什麼函式程式設計正規化的特有語法哦╮(╯▽╰)╭PS:上面的宣告我沒有試著用VS測試過,如果有錯的話請輕噴=A=!PPS:當年碩士專案組的靜態分析器我們就是這麼識別變數型別的,如果這些宣告有錯,那,那我反正是不負責啦(怒摔)!
發表回復
相關內容
matlab如何用disp輸入混合語句?
C++中語句“int&a=b;”的意思?
∧
中秋節和大豐收的關聯?
∨
我家的電腦主機開機後硬碟燈不亮風扇正常轉顯示器不亮鍵盤燈不亮,怎麼辦?
熱門排行
比亞迪唐冠軍版電池容量?
蘋果樹落花後幼果期澆水能澆落嗎?
衛生間坐便黃色怎麼清洗?
出氫氣的口對準酒精燈現象是有尖銳爆鳴聲還是火焰變藍?
岩棉保溫板的施工工藝流程?
五十鈴4bg1發動機參數?
西晉之後的歷史?
生豬頭怎麼處理最乾淨?
2023年6月份英語ab級什麼時候查成績?
27層樓高度還有蚊子嗎?
對0. 如何理解不過如果要更加系統化地理解C的型別表示式,可以使用下面的方法一個宣告本身可以看作是一個不斷巢狀括號的“表示式”,例如int a[10][10]這個語句,其實它的構成是:
int (((a)[10])[10])編譯器在遍歷抽象語法樹的時候是這麼考慮的:1. 首先,令x1 =(((a)[10])[10]),這時相當於int x1;x1的型別是int,記作x1.type = int。2. 接著,領x2 = ((a)[10]),這時有x1 = x2[10];這說明x2是一個長度為10,元素型別為x1.type的陣列,其型別x2.type = array(10, x1.type) = array(10, int);3. 然後,令x3 = a,則有x2 = x3[10];則有x3.type = array(10, x2.type);代入2)中的結果得:x3.type = array(10, array(10, int))。其中,array(length, type)表示一個長度為length,元素型別為type的陣列型別。用遞迴方法表示就是:1)a.type = array(10, t1)2)t1 = array(10, t2);3)t2 = int1. 舉一反三那麼好了,用這個方法,我們可以解釋相當一部分很難理解的型別,例如這個詭異的宣告語句:int (*(x[10]))(char, char)這是個什麼鬼呢?首先,我們按照層次順序來看:1)x1 = (*(x[10]))(char, char);這時候宣告等價於int x1;說明x1.type = int;2)x2 = (*(x[10]));這時由x1 = x2(char, char),說明x2是一個返回型別為x1.type,輸入兩個char型別引數的函式,我們記作x2.type = func(x2.type, [char, char]);代入x1.type得到:x2.type = func(int, [char,char]);3)x3 = (x[10]);這時候有x2 = *x3,說明x3是指向x2型別的指標,因此x3其實就是個函式指標啦!有:x3.type = ptr(x2.type) = ptr(func(int, [char,char]))4)x4 = x;這時候有x3 = x4[10],說明x4是一個指向x3型別的長度為10的陣列,即:x4.type = array(10, x3.type) = array(10, ptr(func(int, [char,char])))那麼x的型別是什麼呢?用自然語言說起來有點繞口,那就是:1)x是一個長度為10的陣列,它的元素型別為t1;2)型別t1是一個指標型別,t1指標內容的型別為t2;3)型別t2是一個函式型別,該函式輸入兩個char型別引數,返回型別為t3;4)型別t3為int2. 如何使用?宣告一個複雜型別的變數容易,但是能合法地使用並不是很簡單。以章節1部分的那個宣告為例:int (*(x[10]))(char, char)這個變數的一個合法使用是:x[1]("a", "b")怎麼理解這個表示式?也是按照層次來分析:1)首先x[1],由於x.type = array(10, ptr(func(int,[char,char])))),因此x[1]的型別是ptr(func(int, [char, char])),即一個指向函式的指標,指向的函式接收兩個char型別值,返回int型別。2)接著(x[1])("a","b"),相當於在x[1]的型別上再呼叫一次函式,由於x[1]是一個函式指標,因此可以直接作為函式呼叫,它接受了兩個字元輸入,因此這個表示式其實就是一個函式呼叫!那麼簡單的如何解釋呢?x[1]首先獲取x陣列位置1的函式指標;接著用引數("a","b")呼叫x[1]所指向的函式;最後,呼叫完成後,返回這個函式在("a","b")下的返回值。3. 應用在弄明白了C語言這些宣告語句的層次關係後,現在請設計一個函式表型別,這個函式表輸入函式名稱,返回一個該函式名稱的過載函式列表的指標;這些函式都有相同的宣告形式,如下:int func(void *, void *)在C++中,這麼宣告(本人沒嘗試過,哪位閒著無聊可以試一下能不能透過編譯。。。):using namespace std;map<string, int (*[])(void *, void *)> func_map;例如,當我要使用名稱為“compare_100”函式名的函式列表時,透過:auto list = func_map["compare_100"];接著,我們選取這個list的第一個函式指標auto fptr = list[0];最後,呼叫該函式:auto retval = fptr(x, y);當然你也可以一步寫完:auto retval = func_map["compare_100"][0](x, y);4. 用C寫函數語言程式設計正規化程式最後各位可以試一下下面這個定義宣告,是不是能透過編譯?理解一下它神馬意思?int (*(select_function(char *))(char, char));給你們一點提示,下面是使用這個變數select_function的例子:auto fptr = select_function("min_char");auto a_b_min = fptr("a", "b");是不是有點像函數語言程式設計正規化?根據名稱返回一個函式?順帶一提,這可都是用純C/C++語法寫出來的喲,沒借助什麼函式程式設計正規化的特有語法哦╮(╯▽╰)╭PS:上面的宣告我沒有試著用VS測試過,如果有錯的話請輕噴=A=!PPS:當年碩士專案組的靜態分析器我們就是這麼識別變數型別的,如果這些宣告有錯,那,那我反正是不負責啦(怒摔)!