使用模式匹配更快識別複雜C宣告

2021-05-22 18:15:37 字數 1670 閱讀 3447

網上有乙個左右法則,其實左右法則適合程式分析,不適合人。

我總結了對人來說乙個更簡單的法則:模式匹配. 演算法如下:

1.找到變數名。程式不容易做,人比較容易。

2.除開變數名後,是它的型別宣告,可能有四種複雜, 四種簡單模式(為了形式上完整)

其中空格是變數的位置, ???可能是比較複雜東西。

???(* )??? 變數是指標

???( )???或??? ??? 變數是值或陣列, 前一種形式括號是多餘的.

???(* (???))??? 變數是函式宣告,返回型別是指標,指向括號外面的部分

???(* [???])??? 變數是陣列,陣列型別是指標,指向括號外面的型別

type ; 簡單變數type = char/short/long/int/float/struct/union/emnu等

type * 指標,指向type 

type [xx]??? type的陣列,多維陣列也可以再分析一步,也可以直接得結果.

type (???) 函式

3.把已經識別的部分看成變數

4.如果有餘下的部分, 返回第2步.

例如:int (*ff(int)) (int *,int); => 結果

step 1. 找到ff. 變數ff是...

step 2. 滿足???(* (???))??? 函式宣告, 引數是(int), 返回值是指標, 指向...

step 3. 除去已經識別部分int (int *, int)

step 2. 滿足type (???) 函式, 引數是(int*, int)

int (*register (int (*pf)(const char *, const char *))) (const char *, const char *)

step 1.找到pf, 這個是找錯了,不過沒關係.

step 2.滿足???(*)???, pf是指標,指向...

step 3.剩下int (*register (int ^(const char*, const char*)))( const char*, const*)

我用^標出的變數的位置,

step 2.滿足??? (???), 是函式

step 3.剩下int (*register (^))(const char*, const*),

step 2.滿足???( )???, 說明是型別, 但注意pf是函式,函式不能再是乙個值或陣列.所以pf變數其實

不是真正的變數, 所以需要退回上一步,再找一下變數這次可以找出register

step 1.找出register

step 2.除出register得到int (* (pf))(const char*, const*), register是函式宣告, 返回值指向...

step 3.剩下int (const char*, const*) 是函式

-----

題外話,如果先找到register就比較簡單,直接說明它是函式, 返回值是...

float ( * ( * e[10])(int &) ) [5];

變數e, 第一次找到???(* [???])???, e是陣列, 成員是...

float ( * (int &) ) [5]; +++ ???(* (???))???, 函式指標, 返回型別是指標, 指向

float [5]; +++ float陣列

模式匹配 更快的Boyer Moore演算法

前一篇中介紹了字串kmp演算法,其利用失配時已匹配的字元資訊,以確定下一次匹配時模式串的起始位置。本文所要介紹的boyer moore演算法是一種比kmp更快的字串匹配演算法,它到底是怎麼快的呢?且聽下面分解。不同於kmp在匹配過程中從左至右與主串字元做比較,boyer moore演算法是從模式串的...

node使用 glob匹配模式

匹配符說明 匹配檔案路徑中的0個或多個字元,但不會匹配 除非 出現在末尾 匹配路徑中的0個或多個目錄及其子目錄 匹配檔案路徑中的乙個字元,不匹配 出現在規則的開頭,表示取反。即匹配不命中後面規則的檔案 匹配方括號 現的字元中的任意乙個 可以讓多個規則用 逗號分隔,起到或者的作用 匹配n1到n3之間的...

使用SV實現模式匹配

模式匹配是資料結構中字串的一種基本運算,給定乙個子串,要求在某個字串中找出與該子串相同的所有子串,這就是模式匹配。假設p是給定的子串,t是待查詢的字串,要求從t中找出與p相同的所有子串,這個問題成為模式匹配問題。p稱為模式,t稱為目標。如果t中存在乙個或多個模式為p的子串,就給出該子串在t中的位置,...