引用维基百科:
支持两种隐式转换的两种常用语言是C和C ++,有时会声称它们是弱类型语言。但是,其他人则认为,这些语言对如何混合不同类型的操作数施加了足够的限制,因此应将两者视为强类型语言。
还有更明确的答案吗?
引用维基百科:
支持两种隐式转换的两种常用语言是C和C ++,有时会声称它们是弱类型语言。但是,其他人则认为,这些语言对如何混合不同类型的操作数施加了足够的限制,因此应将两者视为强类型语言。
还有更明确的答案吗?
Answers:
“强类型”和“弱类型”是没有广泛认可的技术含义的术语。确实具有明确含义的术语是
动态类型表示在运行时将类型附加到值,并且尝试混合不同类型的值可能会导致“运行时类型错误”。例如,如果您在Scheme中尝试通过写入将1加到true,(+ 1 #t)
则将导致错误。仅当您尝试执行有问题的代码时,您才会遇到错误。
静态类型意味着在编译时检查类型,而没有静态类型的程序将被编译器拒绝。例如,如果在ML中您尝试通过写入将1加到true 1 + true
,则该程序将被拒绝,并显示一条(可能是隐秘的)错误消息。即使可能永远不会执行代码,也始终会出现错误。
不同的人喜欢不同的系统,部分原因是他们对灵活性的重视程度以及对运行时错误的担忧程度。
有时,“强类型”用于松散地表示“静态类型”,而“弱类型”被错误地用于表示“动态类型”。术语“强类型”的更好用法是“您不能解决或破坏类型系统”,而“弱类型”则意味着“类型系统中存在漏洞”。相反,大多数具有静态类型系统的语言都存在漏洞,而许多具有动态类型系统的语言则没有漏洞。
这些术语都没有以任何方式与某种语言中可用的隐式转换数量相关联。
如果要精确地谈论编程语言,最好避免使用术语“强类型”和“弱类型”。我要说的是C是一种静态类型的语言,但存在很多漏洞。一个漏洞是您可以将任何指针类型自由转换为任何其他指针类型。您还可以通过声明具有两个成员的C联合,在所选择的任何两种类型之间创建漏洞,每种有问题的类型一个。
我在为什么解释的语言大多是鸭式而在编译时却要强类型化方面写了更多有关静态和动态类型的文章。
whereas "weakly typed" means "there are loopholes in the type system
很难将每种语言分类为“弱”或“强”类型,这更像是一个连续体。但是,与其他语言相比,C是强类型的。每个对象都有一个编译时类型,如果您正在使用该类型不允许您执行的操作,编译器会(大声地)通知您。例如,您不能使用错误的参数类型来调用函数,访问不存在的struct / union成员等。
但是有一些缺点。一个主要的弱点是类型转换-它们实质上是在说您将迷惑对象的类型,并且编译器应该保持安静(如果可以的话)。 void*
这也是另一个弱点-它是指向未知类型的通用指针,当您使用它们时,必须格外小心,以确保执行正确的操作。编译器无法静态检查的大多数使用void*
。 void*
还可以将其转换为指向任何类型的指针而无需强制转换(仅在C中而不在C ++中),这是另一个缺点。
文献尚不清楚。我认为强类型不是肯定/否,强类型存在不同程度的差异。
编程语言对如何执行程序进行了规范。有时不清楚如何使用某些程序执行。例如,试图从数字中减去字符串的程序。或除以零的程序。有几种处理这些情况的方法。某些语言具有处理这些错误的规则(例如,它们引发异常)。其他语言只是没有规则来处理这些情况。这些语言通常具有类型系统,以防止编译导致未指定行为的程序。还有一些语言具有未指定的行为,并且没有防止在编译时出现这些错误的类型系统(如果编写的程序遇到未指定的行为,则可能会发射导弹)。
所以:
指定在每种情况下在运行时会发生什么情况的语言(如在字符串中添加数字)称为动态类型。防止在编译时执行带有错误的程序的语言是静态类型的。未指定发生情况且也没有防止错误的类型系统的语言称为弱类型。
Java是静态类型的吗?是的,因为其类型系统不允许从数字中减去字符串。不可以,因为它允许您除以零。您可以使用类型系统在编译时防止被零除。例如,通过创建一个不能为零的数字类型(例如NonZeroInt),并且只允许除以具有该类型的数字。
那么C是强类型还是弱类型?C是强类型的,因为类型系统不允许某些类型错误。但是在其他情况下,如果未定义会发生什么,它的类型就会很弱(并且类型系统无法保护您)。
int
从用户或命令行参数或文件中获取值,则编译器无法采取任何措施阻止它成为零!
C被认为是弱类型的,因为您可以通过强制转换将任何类型转换为任何其他类型,而不会产生编译器错误。您可以在此处阅读有关此问题的更多信息。
C比Javascript更强类型,而Ada不那么强类型。
我会说它更多地属于连续体的强类型方面。但其他人可能会不同意(即使他们错了)。
到底是怎么回事?
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。
这里有很多好的答案。我想提出真实世界Haskell的一个重要观点:
意识到许多语言社区都有自己的“强类型”定义是很有用的。不过,我们将简要地和广泛地谈谈类型系统中的强度概念。
(剪断)
围绕类型系统的烟花源于普通英语,人们在其中将“弱”和“强”一词视为价值观念:我们通常认为强胜于弱。与学术术语相比,有更多的程序员说普通话,而且很多时候,学者们确实在为任何不适合他们的幻想的类型系统投掷砖瓦。结果常常是流行的互联网消遣,一场火焰大战。
因此,请查看有关C和C ++的答案,但请记住,“强”和“弱”不会映射为“好”和“坏”。
术语强类型没有一个商定的定义。因此,除非您定义“强类型”的含义,否则无法回答您的问题。
在我的经验中,术语“强类型”和“弱类型”使用专门的巨魔,由于缺乏定义允许巨魔重新定义他们中间参数,以满足他们的议程。除了启动火焰战争外,这些术语几乎没有用。
您可能还想看看强类型语言的主要方面是什么?在StackOverflow上。
您查询的原因是什么?我要问的原因是,这是一个微小的差异,您对“强类型”的特定用法可能需要或多或少地加以说明。我肯定会说Java和其他语言对隐式类型对话有更严格的限制。
我会说C的类型与编译器/平台所指定的一样强。例如,如果您在严格的平台上构建,则取消引用类型查询指针可能会中断:
void m_free(void **p)
{
if (*p != NULL) {
free(*p);
*p = NULL;
}
}
....
char *str = strdup("foo");
m_free((void **) &foo);
现在,如果您告诉编译器跳过严格的别名,那将不是问题,但不是很容易移植。因此,从这种意义上讲,突破语言的界限是可能的,但可能不是最好的主意。这比典型的转换(即将int转换的时间长)超出了一个步骤,并且确实显示了虚假的可能陷阱之一。
因此,我想说C基本上是严格类型化的,但是它的各种编译器假定程序员最清楚并且允许一定的灵活性。这实际上取决于编译器,有些人不会选择那些潜在的哎呀。因此,从这个意义上讲,选择的编译器在回答问题时确实发挥了作用。正确的方法通常不同于编译器允许您使用的方法。
没有强类型。
请考虑以下函数原型告诉您有关参数的数据类型的信息:
void func (int n, char ch, ...);
没有。因此,我建议强类型不适用于此处。