引用Wikipedia的话:
支持许多种隐式转换的两种常用语言是C和C++,有时被认为这些是弱类型语言。然而,其他人则认为这些语言对不同类型的操作数如何混合使用施加了足够的限制,应将其视为强类型语言。
是否有更明确的答案?
引用Wikipedia的话:
支持许多种隐式转换的两种常用语言是C和C++,有时被认为这些是弱类型语言。然而,其他人则认为这些语言对不同类型的操作数如何混合使用施加了足够的限制,应将其视为强类型语言。
是否有更明确的答案?
很难将每种语言归类为“弱类型”或“强类型” -- 这更像是一个连续的过程。但与其他语言相比,C语言具有相当强的类型化特性。每个对象都有编译时类型,如果您正在对类型不允许的对象进行操作,编译器会大声提醒您。例如,您无法使用错误类型的参数调用函数,访问不存在的结构/联合成员等。
但是这里还有一些弱点。其中一个主要弱点是类型转换 - 它们基本上表示您将要处理对象的类型,并且编译器应该保持安静(如果可以)。 void*
也是另一个弱点--它是指向未知类型的通用指针,当您使用它们时,必须格外小心以确保正确性。大多数情况下,编译器无法静态检查void*
的使用方式。在C中,void*
也可以转换为任何类型的指针而无需转换(但在C++中不行),这是另一个弱点。
C语言被认为是弱类型语言,因为你可以通过转换将任何类型转换为另一种类型而不会触发编译器错误。您可以在此处了解更多相关信息。
文献对此并不清楚。我认为强类型并非是只有是/否的问题,而是有不同程度的强类型。
编程语言规定了如何执行程序。有时候在执行某些程序时并不清楚该怎么做。例如,试图从数字中减去一个字符串的程序或者除以零的程序。有多种方法来处理这些情况。一些语言有处理这些错误的规则(例如,抛出异常)。其他语言则没有处理这些情况的规则。那些语言通常会有类型系统来防止编译导致未指定行为的程序。也存在一些语言,它们具有未指定的行为,并且没有类型系统来在编译时防止这些错误(如果您编写了一个触发未指定行为的程序,它可能会发射导弹)。
所以:
在每种情况下具体规定运行时操作的语言(例如将数字加到字符串上)称为动态类型。 在编译时防止执行带有错误的程序的语言称为静态类型。 既不具体说明会发生什么,也没有类型系统来防止错误的语言称为弱类型。
那么Java是静态类型的吗?是的,因为它的类型系统不允许从数字中减去一个字符串。不是的,因为它允许你除以零。可以通过类型系统在编译时防止除以零。例如,通过创建一个不能为零的数字类型(例如NonZeroInt),并且只允许除以具有此类型的数字来实现。
C语言是强类型还是弱类型呢? C语言的类型系统不允许某些类型错误,所以它是强类型。但在其他情况下,当发生未定义的情况时(而类型系统不能保护您)它是弱类型。
据C语言的创造者Dennis Ritchie和Brian Kernighan所说,C语言并非强类型语言。以下内容摘自《C程序设计语言》第3页第5段。
C语言并非强类型语言,但随着其发展,其类型检查已得到加强。
C语言比Javascript更强类型,但比Ada弱一些。
我认为它更偏向于强类型的一侧,但其他人可能会持不同意见(即使他们是错的)。
这样的定义还算准确吗?
C被认为是静态类型的(变量不能从int更改为float)。一旦变量被声明,它就会保持不变。
但它被认为是弱类型的,因为类型可以翻转。
0是什么?'\ 0',FALSE,0.0等。
在许多语言中,您不能说IF(variable),因为条件只会从布尔表达式中获取布尔值。这些更加强类型化。同样适用于字符和整数之间的转换。
基本上,C有两种主要的简单数据类型:整数和浮点数(尽管具有各种精度)。其他所有内容,如布尔值、枚举(不是简单的,但它适合)、等等都是作为其中之一实现的。甚至字符基本上也是整数。
与其他语言相比,其他语言有字符串类型、只能分配给定义值的枚举类型、只能使用生成布尔值或true/false的表达式的布尔类型。
但你可以争论相对于Perl,C是强类型的。所以这是那些著名的争论(vi vs emacs,linux vs windows等)之一。C#比C更强类型。基本上你可以从任何角度来进行争论。而你的答案可能会两面都有:)还有一些教科书/网页会说C是弱类型的,有些会说C是强类型的。如果您去维基百科,C条目说“部分弱类型”。我会说相对于Python C是弱类型的。因此Python/C#,C,Perl处于连续体中。
在我看来,C/C++是强类型语言。允许类型转换(void*)的黑客方式之所以存在,是因为C接近于机器。换句话说,你可以从Pascal调用汇编命令并操纵指针,但Pascal仍被视为强类型语言。你可以通过JNI从Java调用汇编和C可执行文件,但这并不意味着Java是弱类型语言。
C只是将汇编“嵌入”其中,并使用原始指针等。