强类型 弱类型 显式类型 隐式类型

目录

文章作者令狐虫

所谓的显式类型和隐式类型,区别在于对于变量,是否需要显式说明它的类型。对于显式类型语言来说,一个变量的类型,是在变量声明之初就决定了的,声明之后不能更改。

//C++
int x;  //这里x被声明为一个整型。
x = 10; //OK,类型匹配。
x = "abc"; //Error! 类型不匹配
x = 10.24; //虽然在语法上OK,但是这种写法会引发隐式类型转换,
//x中实际存储的值是10,而不是10.24。

当然,即使在显式类型的语言中,也有所谓的“隐式类型转换”机制让用户在书写语法上自由一些。比如上面的例子中,将浮点数10.24赋值给一个整型 量并不会导致语法错误,而是会引发隐式类型转换。但即使是隐式类型转换,也是将“不符合类型的值”向变量所具有的类型靠拢,而不会改变变量的类型。

而隐式类型语言就不同了。隐式类型语言对变量没有显式的声明。一个变量没有固定的类型,它的类型是随着当前存储的内容而变化的。

#Python
x = 10   #这时x是一个int类型
x = "This is a string"  #x同样可以接受一个字符串,
#这时,x的类型由int转变为了string
x = 10.24 #x又由string变成了float类型,
#注意这里并没有什么隐式类型转换,
#x里的值就是确切的float类型数值10.24,
#改变的是x的类型,而不是存储其中的数值。

但是我们要意识到一件事:我在上面举的例子,显式类型也好,隐式类型也好,它们都是有类型这个概念的!

C++自不必说了,对变量声明时指定的类型就说明了它是有类型区分的。那么像Python这样的隐式类型语言,我们看不到变量的类型,如何证明它是有类型的呢?首先,python有type函数,可以看到变量当前的类型。

>>> x=10
>>> type(x)

>>> x="This is a string"

>>> type(x)

>>> x=10.24
>>> type(x)

这里我们可以清楚的看到当赋予x不同值的时候,x的类型是会变化的。

另外,在Python中,不同类型的对象不能相互替代和操作。

>>> 10 + '20'
Traceback (most recent call last):
  File "", line 1, in
TypeError: unsupported operand type(s) for +: 'int' and 'str'

这一切都充分的证明,在Python里,是有明确的类型的概念。

而某一些语言,它们是没有很明确的“类型”的概念的,这些语言就被成为弱类型语言。强类型和弱类型的主要区别是,在语言中是否存在明确的类型概念

Perl和PHP就是很著名的弱类型语言。

#Perl
$x = 10+'20';    #这里的10是整型而'20'是字符串?
#不,Perl不关心这个。
#只要它们“看起来像”数字,就可以放到一起运算,不是么?
print $x;           #输出了30

在弱类型的世界中,所有的东西都是一样的,你不用区分它们到底是什么类型。事实上,也许在内部实现中,所有的东西最终都被存储为同一种类型。

显式类型一定是强类型的,而弱类型一定是隐式类型的。但隐式类型也有可能是强类型的,比如Python。

怎样区分强类型还是弱类型?很简单,让它们做一做 10 + ‘20’ 吧

强类型和弱类型的主要区别在于:在语言中是否存在明确的类型概念。 Python、C++是强类型的语言。 Perl、PHP是很著名的弱类型语言。