C語言的結構和聯合,以及PHP是怎麼實現弱型別的

2022-08-14 05:39:09 字數 1177 閱讀 2117

c語言的結構(struct):包含多個成員,可能有多種資料型別,並且需要分配幾種型別占用空間之和的空間。

聯合(union):支援多種型別,供使用者使用其中一種資料型別,當然是需要分配其中占用空間最大的資料型別的大小。

結構和聯合通常是出現在一塊的。

php是用c語言來實現的,那麼思考下為什麼php可以實現弱型別呢?

答案就在c語言的結構和聯合上。

從弱型別變數的寫入和讀取二者分析:

有了聯合,我們可以定義幾種型別,讓php的變數在其中選取,這個可以解決變數寫入。那怎麼解決讀取這個變數呢?變數設定後,不知道這個變數使用的聯合中哪個型別,也就沒法讀取。

可以在結構中,設定乙個成員專門記錄聯合中用的哪個型別。這樣就ok了。

用乙個簡單的c例子演示一下:這裡只使用了三種型別,整數 浮點數和字串,php的陣列是用hashtable這裡就不說了。

#include typedef union uval uval;

typedef

struct

pval pval;

//enum

void

var_dump(pval);

intmain(), 1

}; var_dump(pval1);

//int 111

pval1.phptype = 2

; pval1.val.b = 1.21

; var_dump(pval1);

//float 1.210000

pval1.phptype = 3

; pval1.val.c = "

abc"

; var_dump(pval1);

//string abc}/*

* * @param val

* 根據pval變數型別,決定讀取聯合體的那個型別 */

void

var_dump(pval val)

else

if(val.phptype == 2

) else

if(val.phptype == 3

)}

可以認為pval這種型別就是php的乙個變數的型別。每乙個php變數記錄了這個值val和型別phptype(實際還有引用計數等)。

每次寫入val時,要把其型別也記錄下來。這樣就實現了弱型別。

C語言之結構和聯合

一 結構體 宣告乙個結構體型別的一般形式為 struct 結構體名 成員表列 如 struct student 定義結構體型別變數 1 先宣告結構體型別再定義變數名 例如 struct student student1,student2 2 在宣告型別的同時定義變數 這種般形式為 struct 結構...

C 結構和聯合

結構與聯合體是c語言中就已經存在的資料型別。c 語言對它們進行了擴充套件,最大的變化是允許在結構和聯體中定義成員函式。1 include2 using namespace std 3struct room 7struct student 14 15int main 17 student s 18,8...

D語言中的結構和聯合

聚集宣告 標記標記 標誌符標記 標誌符 標記 structunionaggregatedeclaration tagtag identifiertag identifier tag structunion結構和聯合是簡單的資料聚集,是同硬體或者外部型別通訊的資料結構。外部型別可以由作業系統 api ...