C语言的结构(struct):包含多个成员,可能有多种数据类型,并且需要分配几种类型占用空间之和的空间。

  联合(union):支持多种类型,供使用者使用其中一种数据类型,当然是需要分配其中占用空间最大的数据类型的大小。

  结构和联合通常是出现在一块的。

  PHP是用C语言来实现的,那么思考下为什么PHP可以实现弱类型呢?

  答案就在C语言的结构和联合上。

  从弱类型变量的写入和读取二者分析:

  有了联合,我们可以定义几种类型,让php的变量在其中选取,这个可以解决变量写入。那怎么解决读取这个变量呢?变量设置后,不知道这个变量使用的联合中哪个类型,也就没法读取。

  可以在结构中,设置一个成员专门记录联合中用的哪个类型。这样就ok了。

  用一个简单的C例子演示一下:这里只使用了三种类型,整数 浮点数和字符串,php的数组是用hashtable这里就不说了。

  

#include <stdio.h>

typedef union uval{
long a;
double b;
char * c;
} uval; typedef struct pval{
uval val;
int phptype;
} pval; //enum void var_dump(pval); int main(){ pval pval1 = {{.a = }, }; var_dump(pval1);// int 111 pval1.phptype = ;
pval1.val.b = 1.21; var_dump(pval1);// float 1.210000 pval1.phptype = ;
pval1.val.c = "abc"; var_dump(pval1);// string abc } /**
* @param val
* 根据pval变量类型,决定读取联合体的那个类型
*/
void var_dump(pval val){
if(val.phptype == ){
printf("%s ", "int");
printf("%ld\n", val.val.a);
} else if(val.phptype == ){
printf("%s ", "float");
printf("%f\n", val.val.b);
} else if(val.phptype == ){
printf("%s ", "string");
printf("%s\n", val.val.c);
}
}

可以认为pval这种类型就是php的一个变量的类型。每一个php变量记录了这个值val和类型phptype(实际还有引用计数等)。

每次写入val时,要把其类型也记录下来。这样就实现了弱类型。

C语言的结构和联合,以及PHP是怎么实现弱类型的的更多相关文章

  1. C语言中结构、联合、枚举的说明

    复杂的数据类型 一般的步骤: 1.声明模板 2.定义变量,分配内存空间 3.初始化 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...

  2. C语言中结构体对齐问题

    C语言中结构体对齐问题 收藏 关于C语言中的结构体对齐问题 1,比如: struct{short a1;short a2;short a3;}A;struct{long a1;short a2;}B; ...

  3. C语言中结构体赋值问题的讨论

    今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...

  4. C和指针 第十章 结构和联合 (一)

    结构体: 聚合数据类型是指,能够同时存储超过一个的单独数据,C语言中有两个聚合数据类型,数组和结构体.数组中储存的类型必须相同,元素通过下标和指针引用来访问的. 结构体也是一些值的集合,但是结构体中每 ...

  5. C语言的结构体和C++结构体的区别

    关于C++中声明结构体中需要使用构造器创建实例对象的语法: <C++的结构体构造方法的基本概念:结构体的构造方法需要和结构体的名字相同,并且无返回值,也不要void关键字,这样的方法就是构造器的 ...

  6. 01.C语言关于结构体的学习笔记

    我对于学习的C语言的结构体做一个小的学习总结,总结如下: 结构体:structure 结构体是一种用户自己建立的数据类型,由不同类型数据组成的组合型的数据结构.在其他高级语言中称为记录(record) ...

  7. C语言之结构体

    结构体类型 C语言中还有一种类型叫做结构体类型,它是可以保存不同类型数据并且可以把这些不同类型的数据当做一个整体来管理的类型 1).结构体的定义 语法: struct 结构体名{ 成员列表; };   ...

  8. 逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式

    逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式 一丶了解什么是结构体,以及计算结构体成员的对其值以及总大小(类也是这样算) 结构体的特性 1.结构体(struct)是由一系列具有相同类型或不 ...

  9. C语言中结构体赋值问题的讨论(转载)

    今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...

随机推荐

  1. Dynamics AX 2012 性能优化之 SQL Server 复制

    Dynamics AX 2012 性能优化之 SQL Server 复制 分析数据滞后 在博文 Dynamics AX 2012 在BI分析中建立数据仓库的必要性 里,Reinhard 阐述了在 AX ...

  2. 我写的Angular相关的文章

    此文正在更新中... Angular6的变化 Angular7的变化 No value accessor for form control with path的解决方案

  3. echarts雷达图点击事件 包含(2.x,3.85,4.02)测试

    最近看见别人问的问题,点击雷达图的拐点,获取点击数据的问题,直接上代码. echarts 2x 的点击事件 echarts配置问题:https://www.douban.com/note/509404 ...

  4. python 数据驱动ddt使用,需要调用下面的代码,请挨个方法调试,把不用的注释掉

    #!/usr/bin/env/python # -*- coding: utf-8 -*- # @Time : 2018/12/15 15:27 # @Author : ChenAdong # @Em ...

  5. 最简单的java浏览器

    /** * Created by Admin on 2017/3/27. */ import java.awt.BorderLayout; import java.awt.Container; imp ...

  6. vs添加到附加进程调试(IIS页面调试)

    有时候单元测试不是很方便,通过页面调试接口会更直观,也跟容易发现问题(尤其是在页面传参的时候),这时vs添加到附加进程的调试方式就显得尤为重要了! 步骤如下: 1.首先是通过IIS建立网站,(前提是要 ...

  7. MSSQL coalesce系统函数简介

    转自:http://www.maomao365.com/?p=4390 一.coalesce函数简介 coalesce 系统函数,比ISNULL更强大,更方便的系统函数,coalesce可以接收多个参 ...

  8. c# 设置MdiClient窗体的背景图片

    在窗体的InitializeComponent();方法后面添加下面的代码. MdiClient MC = new MdiClient(); MC.Name = "MdiClientForm ...

  9. 用好lua+unity,让性能飞起来——lua与c#交互篇

    前言 在看了uwa之前发布的<Unity项目常见Lua解决方案性能比较>,决定动手写一篇关于lua+unity方案的性能优化文. 整合lua是目前最强大的unity热更新方案,毕竟这是唯一 ...

  10. win10安装nodejs遇到提示错误代码2503怎么办

    我们在安装某个软件的时候,最闹心的就是遇到提示安装失败或错误,比如win10系统在安装nodejs遇到提示错误代码2503,遇见这个问题也不要慌张,今天小编就来告诉大家怎么解决这个问题. 1.打开智能 ...