是C强类型?

Syd*_*ius 78 c strong-typing weakly-typed

引用维基百科:

支持多种隐式转换的两种常用语言是C和C++,有时声称它们是弱类型语言.然而,其他人认为这些语言对如何混合不同类型的操作数有足够的限制,这两种应该被视为强类型语言.

有更确定的答案吗?

Nor*_*sey 145

"强类型"和"弱类型"是没有广泛认可的技术含义的术语.具有明确定义的术语是

  • 动态类型表示类型在运行时附加到值,并且尝试混合不同类型的值可能会导致"运行时类型错误".例如,如果在Scheme中尝试通过写入(+ 1 #t)将其添加为true,则会导致错误.只有在尝试执行违规代码时才会遇到错误.

  • 静态类型意味着在编译时检查类型,并且编译器拒绝不具有静态类型的程序.例如,如果在ML中尝试通过写入1 + true将其添加为true ,则程序将被拒绝(可能是神秘的)错误消息.即使代码可能永远不会被执行,您也总是会收到错误.

不同的人更喜欢不同的系统,部分原因在于他们对灵活性的重视程度以及他们对运行时错误的担忧程度.

有时"强类型"用于表示"静态类型",而"弱类型"用于表示"动态类型".更好地使用术语"强类型"是"你不能解决或破坏类型系统",而"弱类型"意味着"类型系统中存在漏洞".反过来说,大多数使用静态类型系统的语言都有漏洞,而许多使用动态类型系统的语言都没有漏洞.

这些术语都不以任何方式与语言中可用的隐式转换数相关联.

如果你想精确地谈论编程语言,最好避免使用"强类型"和"弱类型"这两个术语.我会说C是一种静态类型但有很多漏洞的语言.一个漏洞是你可以自由地将任何指针类型转换为任何其他指针类型.您还可以通过声明具有两个成员的C联合来创建您选择的任何两种类型之间的漏洞,每个成员对应一种类型.

我已经写了更多关于静态和动态类型的内容,为什么 - 解释langs-are-duck-duckty-while-compiled-have-strong-typing.

  • @Sydius:在过去的20年中,大部分时间都花在设计,构建和分析编程语言和类型系统的人身上.那是我的有薪工作:-) (4认同)
  • 你从哪里得到你建议的强/弱类型(漏洞)的定义? (2认同)
  • 为什么在动态类型环境中需要“漏洞”? (2认同)

Ada*_*eld 21

很难将每种语言分为"弱"或"强"类型 - 它更像是一个连续统一体.但是,与其他语言相比,C的输入相当强.每个对象都有一个编译时类型,编译器会让你知道(大声)你是否正在使用其类型不允许你做的对象.例如,您不能使用错误类型的参数调用函数,访问不存在的struct/union成员等.

但是有一些弱点.一个主要的弱点是类型转换 - 他们基本上说你将会使用对象的类型,并且编译器应该是安静的(如果可以的话). void*也是另一个弱点 - 它是一个指向未知类型的通用指针,当你使用它们时,你必须格外小心你正在做正确的事情.编译器无法静态检查大多数用途void*. void*也可以转换为指向任何类型的指针而不使用强制转换(仅在C中,而不是在C++中),这是另一个弱点.

  • 在打字方面你会感到困惑"静态"和"强烈".这两个概念彼此独立. (13认同)
  • Dennis Richie(C 作者)称 C 为“强类型和弱检查” (2认同)

mip*_*adi 11

C被认为是弱类型的,因为您可以通过强制转换将任何类型转换为任何其他类型,而不会出现编译器错误.您可以在此处详细了解该问题.

  • 弱类型并不意味着语言没有任何类型,它只是意味着类型可以从一种类型隐式强制转换为另一种类型.与Python相比,Python是一种强类型语言,您必须使用函数调用显式转换类型. (10认同)
  • 维基百科在这里有误导性。C 是强类型的,类型是非常有效的,如果你弄错了,编译器会拒绝,但是,C 也提供了一些功能来绕过这个。与仅具有“字节”类型的 BCPL 等语言相比。 (2认同)

Jul*_*les 9

文献对此并不清楚.我认为强类型不是/不是,有不同程度的强类型.

编程语言具有如何执行程序的规范.有时不清楚如何执行某些程序.例如,尝试从数字中减去字符串的程序.或者除以零的程序.有几种方法可以处理这些情况.有些语言有处理这些错误的规则(例如,它们会抛出异常).其他语言没有处理这些情况的规则.这些语言通常具有类型系统,以防止编译导致未指定行为的程序.并且还存在具有未指定行为的语言,并且没有类型系统来在编译时防止这些错误(如果您编写的程序遇到未指定的行为,则可能会启动导弹).

所以:

指定在每种情况下在运行时发生的事情的语言(如向字符串添加数字)被称为动态类型.在编译时阻止执行程序错误的语言是静态类型的.没有指定发生的事情并且没有类型系统来防止错误的语言被称为弱类型.

Java静态类型也是如此?是的,因为它的类型系统不允许从数字中减去字符串.不,因为它允许你除以零.您可以在编译时使用类型系统防止除零.例如,通过创建一个不能为零的数字类型(例如NonZeroInt),并且只允许除以具有此类型的数字.

那么C是强类型还是弱类型?C是强类型的,因为类型系统不允许某些类型错误.但是在其他情况下,如果未定义会发生什么(并且类型系统不能保护您),则会进行弱键入.


Mic*_*urr 7

C比Javascript更强类型,并且比Ada更不强类型.

我会说它更多地落入连续体的强类型方面.但是其他人可能不同意(即使他们错了).

对于确定性如何?

  • 好吧,正如Norm Ramsey的非常好的答案所表明的那样,"强类型"和"弱类型"并不是特别明确的术语.此外,对于强类型的Javascript,有些人可能认为("4"/"2")是有效的Javascript表达式可能另有说明. (4认同)
  • Javascript 是强类型的。它只是不是静态类型的。所有类型检查都发生在运行时(动态的,而不是静态的),但它们确实会发生并且可以防止您破坏内存(强类型的一方面)。 (2认同)

Cer*_*rvo 5

C被视为静态类型(不能将变量从int更改为float)。声明变量后,该变量将被卡住。

但是,由于类型可以翻转,因此被认为是弱类型的。

什么是0?'\ 0',FALSE,0.0等。

在许多语言中,您不能说IF(变量),因为条件只会从布尔表达式中获取布尔值。这些是更强类型的。字符和整数之间的转换也是如此。

基本上,c具有两种主要的简单数据类型,即整数和浮点数(尽管具有各种精度)。其他所有布尔值,枚举(不简单,但很合适)等都被实现为其中之一。偶数字符基本上是整数。

与其他具有字符串类型的语言相比,只能将枚举类型分配给已定义的值的布尔类型,仅可以使用生成布尔值或true / false的表达式的布尔类型。

但是您可以辩称,与Perl C相比,它是强类型的。因此,它是那些著名的论点之一(vi vs emacs,linux vs Windows等)。C#比C具有更强的类型。基本上,您可以使用任何一种方法进行争论。而且您的答案可能会双向:)还有一些教科书/网页会说C是弱类型的,而有些会说C是强类型的。如果您去维基百科,C条目将显示“部分弱类型”。我要说比起Python C是弱类型的。因此,在连续体上使用Python / C#,C,Perl。


sli*_*lim 5

这里有很多好的答案。我想提出现实世界 Haskell中的一个重要观点:

\n\n
\n

意识到许多语言社区都有自己的 \n \xe2\x80\x9cstrong 类型\xe2\x80\x9d 定义是很有用的。尽管如此,我们将简要而广泛地讨论类型系统中强度的概念。

\n
\n\n

(剪断)

\n\n
\n

围绕类型系统的烟花起源于普通英语,人们将值的概念附加到单词 \xe2\x80\x9cweak\xe2\x80\x9d 和 \xe2\x80\x9cstrong\xe2\x80\x9d 上:我们通常认为优势胜于劣势。更多的程序员会说简单的英语,而不是学术术语,而且学术界经常对任何不符合他们喜好的类型系统进行批评。结果往往是流行的互联网消遣,一场激烈的战争。

\n
\n\n

因此,请查看有关 C 和 C++ 的答案,但请记住“强”和“弱”并不映射到“好”和“坏”。

\n


mig*_*WOZ 5

根据 Dennis Ritchie(C 的创造者)和 Brian Kernighan 的说法,C 不是一种强类型语言。以下几行来自《C 编程语言》第 3 页第 5 段

C 不是强类型语言,但随着它的发展,它的类型检查得到了加强。