什么是强类型语言?

11

什么是强类型语言?

5个回答

20

严格类型语言强制对所有交互数据进行类型定义。

例如:

int i = 3
string s = "4"

从现在开始,每当您使用 i 时,您只能将其视为整数类型进行交互。这意味着您受限于使用与整数相关的方法。

至于字符串 s,您只能将其视为字符串类型进行交互。您可以将其与其他字符串连接,打印输出等。但是尽管它包含字符 "4",您不能在不使用某些函数将字符串转换为整数类型的情况下将其添加到整数中。

在动态类型语言中,您有更多的灵活性:

i = 3
s = "4"

类型是被推断的;这意味着它们是基于它们所设置的数据来确定的。根据设置的方式,i 显然是一个数字类型,s 是一个字符串类型。但是当您执行 i + s 时,类型推断被使用,取决于您的环境,您可能会得到 i + s = 7 的结果,因为编程环境隐式地将 s 转换为 int。然而,这个操作也可能导致字符串 "34",如果环境推断 int + 字符串应该等于连接操作而不是加法操作。

这种灵活性使松散类型语言非常受欢迎。然而,由于这些类型推断有时会产生意外的结果;如果你不小心,它们也可能导致代码中更多的错误。在一个类型化的语言中,如果我执行 i + s,编译器强制我首先将 s 改变为 int,因此我知道通过将 i 添加到 s 中,我将获得 7,因为我被强制将 s 明确转换为 int。在动态语言中,它会隐式地为您完成这项工作,但结果可能不是您预期的,因为 i 或 s 中可以包含任何东西;一个字符串,一个数字,甚至是一个对象。直到运行代码并查看发生了什么,你才能知道。


1
类型推断和严格类型是互斥的。Haskell同时采用了两者。 - Joe Shanahan
3
这个回答混淆了几个概念:强/弱类型和静态/动态类型;类型推断和隐式类型转换。coobird给出了一个更清晰的答案。 - SergiyKolesnikov

9
我试图查找“strict typing”的确切定义,但未能找到。也许它指的是强类型语言?强类型指的是有限制的类型系统,不同类型的两个变量进行操作时会受到限制。例如,在一个非常强类型的语言中,尝试将字符串数字相加可能会导致错误。
string s;
number n;
s + n;          <-- Type error.

错误可能在静态类型语言的编译时发生,也可能在动态类型语言的运行时发生。需要注意的是,静态/动态和强/弱听起来可能类似,但它们是完全不同的概念。
较少强制类型的语言可能允许变量转换,以允许来自不同类型的变量之间的操作:
s + (string)n;  <-- Allowed, as (number) has been explicitly
                    casted to (string), so variable types match.

在弱类型语言中,不同类型的变量可能会自动转换为兼容的类型。
s + n;          <-- Allowed, where the language will cast
                    the (number) to (string)

也许,“严格类型语言”指的是一种非常强类型的语言,在这种语言中,对于不同类型的变量如何进行操作有更加“严格”的限制。

很好的解释。你能列举一些每种类型(强,较弱,弱)的语言的例子吗? - EthanAlvaree

5

关于各种类型系统的强弱,存在不同意见,但我通常听到“严格类型编程语言”指的是非常 严格类型编程语言。这通常描述了几种函数式语言中发现的静态类型系统。


3

必须声明变量以包含特定类型数据的语言。

如果您的变量声明如下:

String myString = "Fred";

如果您的语言是强类型的,变量"myString"被明确声明为仅包含字符串数据。

如果以下代码可以正常工作:

x = 10;
x = "Fred";

那么它就是松散类型的(同一变量和作用域中有两种不同类型的数据)。


4
你正在描述静态类型,而不是强类型。Python允许使用未声明类型的变量,但它确实具有一种类型。例如 x = "Fred",即使你没有写成 string x = "Fred",它仍然是一个字符串类型。请注意,这里的重点是静态类型和强类型的区别,而不是变量类型是否需要显式声明。 - hasen
哦,当然,我忘了说,Python是强类型的。 - hasen
@hasen Python是如何强类型的?我从未必须指定我的变量保存的是哪种值。例如,name = "john" 是松散类型(Python风格),而String name = "john" (Java风格)是强类型。如果我错了,请纠正我。 - Skadoosh

0

在某些编程语言中,'1' + 3 是非法的,因为它将一个字符串加到了一个整数上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接