什么是强类型语言?
严格类型语言强制对所有交互数据进行类型定义。
例如:
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 中可以包含任何东西;一个字符串,一个数字,甚至是一个对象。直到运行代码并查看发生了什么,你才能知道。
字符串
和数字
相加可能会导致错误。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)
必须声明变量以包含特定类型数据的语言。
如果您的变量声明如下:
String myString = "Fred";
如果您的语言是强类型的,变量"myString"被明确声明为仅包含字符串数据。
如果以下代码可以正常工作:
x = 10;
x = "Fred";
那么它就是松散类型的(同一变量和作用域中有两种不同类型的数据)。
string x = "Fred"
,它仍然是一个字符串类型。请注意,这里的重点是静态类型和强类型的区别,而不是变量类型是否需要显式声明。 - hasen在某些编程语言中,'1' + 3
是非法的,因为它将一个字符串加到了一个整数上。