38

谁能告诉我强类型和弱类型是什么意思,哪个更好?

4

8 回答 8

53

这将是照顾的理论答案,但实践方面似乎被忽视了......

强类型意味着您不能使用一种类型的变量来预期另一种类型的变量(或这样做有限制)。弱类型意味着你可以混合不同的类型。例如,在 PHP 中,您可以混合使用数字和字符串,PHP 不会抱怨,因为它是一种弱类型语言。

$message = "You are visitor number ".$count;

如果它是强类型的,则必须将 $count 从整数转换为字符串,通常使用强制类型转换:

$message = "you are visitor number ".(string)$count;

...或函数:

$message = "you are visitor number ".strval($count);

至于哪个更好,那是主观的。强类型的拥护者会告诉你,它会帮助你避免一些错误和/或错误,并帮助传达变量的用途等。他们还会告诉你弱类型的拥护者会称强类型“不必要”被常识“或类似的东西变得毫无意义的语言绒毛”。作为弱打字组的持卡成员,我不得不说他们有我的号码......但我也有他们的,可以把它放在一个字符串中:)

于 2008-11-27T10:58:30.817 回答
14

“强类型”及其相反的“弱类型”在含义上相当弱,部分原因是被认为是“强”的概念可能会因您询问的对象而异。例如,C 被不同的作者称为“强类型”和“弱类型”,这实际上取决于您将其与什么进行比较。

一般来说,如果一个类型系统可以表达与另一个相同的约束,甚至更多,那么它应该被认为是更强大的。但是,通常两种类型的系统是不可比较的——一种可能具有另一种缺乏的功能,反之亦然。任何关于相对优势的讨论都取决于个人喜好。

拥有更强大的类型系统意味着编译器或运行时将报告更多错误,这通常是一件好事,尽管它可能以必须手动提供更多类型信息为代价,这可能被认为不值得付出努力。我会声称“强类型”通常更好,但你必须看看成本。

同样重要的是要认识到“强类型”经常被错误地使用,而不是“静态类型”甚至“清单类型”。“静态类型”意味着在编译时进行类型检查,“清单类型”意味着类型被显式声明。清单类型可能是使类型系统更强大的最著名方法(想想 Java),但您可以通过其他方式(例如类型推断)来增加强度。

于 2008-11-27T09:51:54.617 回答
5

我想重申,弱类型动态类型不同。

这是一篇关于该主题的写得相当好的文章,如果您不确定强、弱、静态和动态类型系统之间的区别,我绝对建议您阅读它。它详细说明了差异,比简短回答中的预期要好得多,并且有一些非常有启发性的例子。

http://en.wikipedia.org/wiki/Type_system

于 2008-11-27T11:24:00.420 回答
4

强类型是现代编程语言中最常见的类型模型。这些语言有一个简单的特性——在运行时了解类型值。我们可以说强类型语言防止两种或多种不同类型之间的混合操作。这是Java中的示例:

String foo = "Hello, world!";
Object obj = foo;

String bar = (String) obj;
Date baz = (Date) obj; // This line will throw an error

前面的示例将运行良好,直到程序遇到将引发 ClassCastException 的最后一行代码,因为 Java 是强类型编程语言。

当我们谈论弱类型语言时,Perl 就是其中之一。下面的例子展示了 Perl 如何在混合两种不同类型时没有任何问题。

$a = 10;
$b = "a";
$c = $a . $b;
print $c; # returns 10a

希望这个对你有帮助,

谢谢。

于 2015-02-08T13:46:02.867 回答
2

这篇文章很好读: http: //blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html在研究时为我清理了很多东西试图回答类似的问题,希望其他人也觉得它有用。

强类型和弱类型:

可能最常见的类型系统分类方式是“强”或“弱”。这是不幸的,因为这些词几乎没有任何意义。在有限的范围内,可以将两种语言与非常相似的类型系统进行比较,并指定一种语言具有这两种系统中更强的一种。除此之外,这些话根本没有任何意义。

静态和动态类型

这几乎是唯一具有实际意义的类型系统的常见分类。事实上,它的重要性经常被低估 [...] 动态和静态类型系统是两个完全不同的东西,它们的目标恰好部分重叠。

静态类型系统是一种机制,编译器通过该机制检查源代码并将标签(称为“类型”)分配给语法片段,然后使用它们来推断程序的行为。动态类型系统是一种机制,编译器通过该机制生成代码以跟踪程序使用的数据类型(巧合的是,也称为“类型”)。当然,在这两个系统中使用同一个词“类型”并非完全巧合。但最好将其理解为具有某种微弱的历史意义。试图找到一种世界观,其中“类型”在两个系统中真正意味着相同的东西,导致了极大的混乱。它没有。

显式/隐式类型:

当使用这些术语时,它们指的是编译器对程序部分的静态类型进行推理的程度。所有编程语言都有某种形式的关于类型的推理。有些人比其他人拥有更多。ML 和 Haskell 具有隐式类型,因为不需要(或很少,取决于使用的语言和扩展)类型声明。Java 和 Ada 有非常明确的类型,并且不断地声明事物的类型。以上所有都具有(例如,相对于 C 和 C++)强静态类型系统。

于 2014-03-31T00:03:25.897 回答
1

语言中的强/弱类型与您进行类型转换的难易程度有关:

例如在 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 */

因此 Python 的类型比 C 更强(从这个角度来看)。

于 2015-11-30T17:53:55.440 回答
0

也许这可以帮助你理解强类型和弱类型......

强类型:它尽快检查变量的类型,通常在编译时。它可以防止不匹配类型之间的混合操作。

强类型编程语言是一种:

  • 所有变量(或数据类型)在编译时都是已知的
  • 严格执行输入规则(字符串不能用于需要整数的地方)
  • 键入规则的所有例外都会导致编译时错误

弱类型:虽然弱类型会尽可能晚地延迟检查系统的类型,通常延迟到运行时。在这种情况下,您可以混合类型而无需显式转换。

“弱类型”编程语言只是一种非强类型的编程语言。

哪个是首选取决于你想要什么。对于脚本和好东西,您通常需要弱类型,因为您希望编写尽可能少的代码。在大型程序中,强类型可以减少编译时的错误。

于 2016-06-01T12:28:42.060 回答
-2

弱类型意味着您不指定变量的类型,而强类型意味着您为每个变量指定严格的类型。

每个都有其优点,弱类型(或通常称为动态类型),更灵活并且需要更少的程序员代码。另一方面,强类型需要开发人员做更多的工作,但作为回报,它可以在编译代码时提醒您许多错误,然后再运行它。动态类型可能会延迟这些简单问题的发现,直到代码被执行。

根据手头的任务,弱类型可能比强类型更好,反之亦然,但这主要是个人喜好问题。弱类型通常用于脚本语言,而强类型则用于大多数编译语言。

于 2008-11-27T09:44:07.657 回答