讨论一门编程语言是强类型、弱类型、动态、静态,虽然有点孔乙己,但可增强对语言的理解。

强类型:所有变量需指定数据类型后再使用,例如C++/Java 需先声明 int num = 123;

强/弱类型是指类型检查的严格程度的,有三种类型:

1)无类型的不检查,甚至不区分指令和数据

2)弱类型的检查很弱,仅能严格的区分指令和数据

3)强类型的则严格的在编译期进行检查。

强类型语言,在没有强制类型转化前,不允许两种不同类型的变量相互操作。

强类型,偏向于不容忍隐式类型转换,例如Python的int就不能变成double

Java、C#、Python、Apex等都是强类型语言。

弱类型语言,也称为弱类型定义语言,与强类型定义相反。

弱类型,偏向于容忍隐式类型转换,例如C语言的int可以变成double

VB、PHP、JavaScript 等就属于弱类型语言

例如:在vbscript中,可以将字符串 12 和整数 3 进行连接得到字符串 123,然后可以把它看成整数 123,而不需要显式转换。

弱类型有时显得很方便,有时却又极易出错。

比如:

var result=5 5; //two numbers

alert(result);  //outputs '10'

var result=5 '5'; // a number and a string

alert(result);  //outputs '55'

因此,使用弱类型语言也要格外注意数据类型,防止出错

在C#代码中,定义了一个整型变量后,就不能赋一个字符型数据给这个变量(除非你用强制类型转换)

弱类型就像javascript  var 可以接受任何类型

 

强类型和弱类型之浅谈

任一门语言,不管是强类型还是弱类型,变量都有两个属性:类型和值

也就是说,弱类型的变量同样有类型。变量,都既有类型,又有值。

1)强类型的变量类型,必须在源代码中明确定义,称之为“变量声明”,

2)弱类型的变量类型则是无需声明的,由解释器解释。

但是,这并不意味着,弱类型的变量就没有类型这一概念了,

举例来说,PHP的gettype()就是返回该变量“当前”的类型。

 

强类型的变量类型是不能改变的,弱类型变量是随需改变的,能够强制类型转换(内存对应的数据类型可改变),这是强弱的真正含义

强类型的变量一经声明,就只能存储这种类型的值,其他的值则必须通过转换之后才能付给该变量,有编译器自动理解的转换,也有由程序员明确指定的强制转换。但是,弱类型的变量类型则是随着需要不断转换,比如:

$a = 25;
echo gettype($a);   // integer
$b = $a.'good';
echo gettype($a);   // string

就会分别输出整数和字符串(貌似是integer,string,请自己测试)

强制转换并没有改变变量类型,强类型语言有个“强制转换”,这改变的是变量的值的类型,以便进行赋值,而没有改变变量的类型。强类型的变量类型是不允许改变的。强类型语言以Java为例,弱类型语言以PHP为例。

关于PHP中相等(==)和全等(===)的实现原理

除了String以外,PHP中的基础类型,他们的相等原理是不管类型,直接比较变量存储的二进制的值;PHP全等的原理,则是先比较解释器当前对变量解释的类型,然后比较其值。

 

动态静态语言、强类型弱类型

动态语言和静态语言

1. 动态类型语言:是指在运行期间才去做数据类型检查的语言。在用动态语言编程时,不用给变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言;

>>> a = 1
>>> type(a)
<type 'int'>
>>> a = "s"
>>> type(a)
<type 'str'>

2. 静态类型语言:与动态类型语言刚好相反,它的数据类型检查发生在编译阶段,也就是说在写程序时要声明变量的数据类型。C/C++、C#、Java都是静态类型语言的典型代表。

Prelude> let a = "123" :: Int

<interactive>:2:9:
    Couldn't match expected type `Int' with actual type `[Char]'
    In the expression: "123" :: Int
    In an equation for `a': a = "123" :: Int

强类型语言和弱类型语言

1. 强类型语言:使之强制数据类型定义的语言。没有强制类型转化前,不允许两种不同类型的变量相互操作。强类型定义语言是类型安全的语言,如Java、C# 和 Python,比如Java中“int i = 0.0;”是无法通过编译的;

>>> "123"+456
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects

强类型语言在没有强制类型转化前,不允许两种不同类型的变量相互操作。

Java、C# 和 Python 等都是强类型语言。

2. 弱类型语言:数据类型可以被忽略的语言。与强类型语言相反, 一个变量可以赋不同数据类型的值,允许将一块内存看做多种类型,比如直接将整型变量与字符变量相加。C/C++、PHP都是弱类型语言,比如C 中“int i = 0.0;”是可以编译运行的;

> "123"+456
'123456'

弱类型语言允许将一块内存看做多种类型,比如直接将整型变量与字符变量相加。

C and C++ 是静态语言,也是弱类型语言;Perl and PHP 是动态语言,但也是弱类型语言。

强类型语言在速度上略逊色于弱类型语言使用哪种语言还是要按需而定。

1)编写简单小应用,使用弱类型语言可节省很多代码量,有更高的开发效率。

2)对于构建大型项目,使用强类型语言可能会比使用弱类型更加规范可靠。

 

无类型: 汇编
弱类型、静态类型 : C/C++
弱类型、动态类型检查: Perl/PHP、JavaScript、VB
强类型、静态类型检查 :Java/C#,Scala
强类型、动态类型检查 :Python, Ruby,Scheme
静态显式类型 :Java/C
静态隐式类型 :Ocaml, Haskell

 

Python是强类型还是弱类型语言

Python 是强类型的动态脚本语言

好多人对python到底是强语言类型还是弱语言类型存在误解,其实,是否是强类型语言只需要一句话就可以判别,

强类型:不允许不同类型相加,例如:整形 + 字符串会报类型错误。

动态语言:不用显示数据类型声明,且在第一次给它赋值的时候确定其变量的类型

脚本语言:一般是解释性语言,运行代码只需要一个解释器,不需要静态编译执行。

 

C/C++是强类型语言还是弱类型语言

C/C++在实际层面是弱类型的,也就是说内存上不限定类型。

但是,语法层面上,C/C++却是强类型的,因为一般字符串是不允许与整数型直接运算的

讨论的结果:C/C++应该是介于强类型和弱类型之间的语言

C/C++变量必须声明类型,字符串不允许与整型直接运算,这些是它强于那些弱类型语言的地方

但是,相对于Delphi、Java等这些强类型语言来说,它又比较“弱”,不支持泛型,如果要支持必须自己写。

比如 Delphi中的if语句,if a then.....,这里的a必须是布尔类型,

但是C/C++中,if后面可以是布尔型,也可以是整型,还可以是字符串

 

另外,“这门语言是不是动态语言”与“这门语言是否类型安全”之间是完全没有联系!

 

 

参考推荐:

弱类型、强类型、动态类型、静态类型语言的区别是什么 (知乎)

PHP 数据类型转换

JavaScript 类型浅解

JavaScript 类型介绍与判断

Linux awk 内置变量实例

Linux shell 局部变量与全局变量

Python中获取系统环境变量

Go语言的变量、函数、Socks5代理服务器

VC++常用数据类型及其操作详解(非常经典,共同分享)

标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast