有人能告诉我什么是强类型和弱类型,哪种更好吗?
有人能告诉我什么是强类型和弱类型,哪种更好吗?
理论方面的答案已经解决了,但实践似乎被忽视了...
强类型意味着你不能在一个期望使用另一种类型变量的地方使用一个类型的变量(或有限制这样做)。弱类型意味着你可以混合使用不同类型。例如,在PHP中,你可以混合使用数字和字符串,PHP不会抱怨,因为它是一门弱类型语言。
$message = "You are visitor number ".$count;
如果它是强类型的,你就需要将$count从整数转换为字符串,通常使用转换操作符:
$message = "you are visitor number ".(string)$count;
...或者一个函数:
$message = "you are visitor number ".strval($count);
就哪种更好这个问题而言,那是主观的。支持强类型变量的人会告诉你,它有助于避免某些错误和/或错误,并帮助传达变量的用途等。他们还会告诉你,支持弱类型变量的人将称强类型变量为“不必要的语言废话,因为常识会让它变得毫无意义”,或类似的东西。作为一个支持弱类型变量的人,我得说他们了解我的想法...但我的也一样,我可以将它放在字符串中 :)
interest_rate
(或interestRate
或$interest_rate
或者你想要如何大写/空格它)的变量,无论它是强类型还是弱类型、静态还是动态,都能清楚地传达其目的。 - Dave Sherohman“强类型”和它的相反概念“弱类型”在意义上有些含糊,部分原因是因为什么被认为是“强”取决于你问谁。例如,不同的作者曾经把C语言称为“强类型”和“弱类型”,这实际上取决于你要比较什么。
一般来说,如果一个类型系统可以表达与另一个系统相同的约束条件并且更多,那么该类型系统应该被认为更强。但是往往两个类型系统无法进行比较,因为一个可能具有另一个缺乏的特性,反之亦然。任何关于相对强度的讨论都取决于个人口味。
拥有更强的类型系统意味着编译器或运行时将报告更多错误,这通常是一件好事,尽管这可能需要手动提供更多类型信息,这可能被认为是不值得的努力。我会说,“强类型”通常更好,但你必须考虑代价。
还要注意,“强类型”经常被错误地用于表示“静态类型”甚至是“显式类型”。 “静态类型”意味着在编译时进行类型检查,“显式类型”意味着类型被明确声明。 显式类型可能是使类型系统更强大的最常见方式(例如Java),但你也可以通过其他方式添加强度,比如类型推断。
强类型是现代编程语言中最常见的类型模型。这些语言具有一个简单的特性 - 在运行时了解类型值。我们可以说,强类型语言防止在两种或更多不同类型之间混合操作。以下是Java的示例:
String foo = "Hello, world!";
Object obj = foo;
String bar = (String) obj;
Date baz = (Date) obj; // This line will throw an error
前面的例子在程序执行到代码的最后一行时能够正常工作,但是由于Java是强类型语言,因此将抛出ClassCastException。
当我们谈论弱类型语言时,Perl是其中之一。下面的例子展示了Perl如何毫无问题地混合使用两种不同类型。
$a = 10;
$b = "a";
$c = $a . $b;
print $c; # returns 10a
语言中的强/弱类型与类型转换的难易程度有关:
例如,在Python中:
str = 5 + 'a'
# would throw an error since it does not want to cast one type to the other implicitly.
就 C 语言而言:
int a = 5;
a = 5 + 'c';
/* is fine, because C treats 'c' as an integer in this case */
弱类型意味着您不指定变量的类型,而强类型则意味着您为每个变量提供严格的类型。
两者都有其优点,弱类型(或常称为动态类型)更灵活,需要程序员编写的代码较少。另一方面,强类型需要开发人员进行更多的工作,但是作为回报,它可以在编译代码之前警告您许多错误。动态类型可能会延迟发现这些简单问题直到执行代码。
根据手头的任务,弱类型可能比强类型更好,或反之亦然,但这主要是一种口味问题。弱类型通常用于脚本语言,而强类型则用于大多数编译语言。