C++被认为是弱类型的吗?为什么?

Meh*_*dad 15 c++ weak-typing strong-typing reinterpret-cast

我一直认为C++是最强类型的语言之一.
所以我很震惊地看到本文的表3表明C++是弱类型的.

显然,

C和C++被认为是弱类型的,因为由于类型转换,人们可以将结构的字段解释为整数作为指针.

类型铸造的存在是否重要?这种演员的明确性是否无关紧要?

更一般地说,C++的弱类型是否真的被普遍接受?为什么?

小智 25

该文件首先声称:

相反,如果类型混淆可以无声地(未检测到)发生,并且最终导致难以本地化的错误,则语言是弱类型的.

然后声称:

此外,C和C++被认为是弱类型的,因为由于类型转换,人们可以将结构的字段解释为整数作为指针.

这似乎与我相矛盾.在C和C++中,由于强制转换而导致的类型混淆不会以静默方式发生 - 这是一个演员!这并没有证明这些语言中的任何一种都是弱类型的,至少不是那篇论文中的定义.

也就是说,根据论文中的定义,C和C++ 可能仍然被认为是弱类型的.正如对问题的评论中所指出的那样,语言支持隐式类型转换.可以隐式转换许多类型,类型bool的文字零int可以静默转换为任何指针类型,不同大小的整数之间有转换等,所以这似乎是考虑C和C++弱类型的一个很好的理由本文的目的.

对于C(但不是C++),还有一些值得一提的更危险的隐式转换:

int main() {
  int i = 0;
  void *v = &i;
  char *c = v;
  return *c;
}
Run Code Online (Sandbox Code Playgroud)

出于本文的目的,必须将其视为弱类型.对位的重新解释是静默发生的,并且可以通过修改它以使用完全不相关的类型来做得更糟,这些类型具有静默的未定义行为,通常具有与重新解释位相同的效果,但在启用优化时以神秘但有时有趣的方式爆炸.

但总的来说,我认为没有"强类型"和"弱类型"的固定定义.有各种等级,与装配相比,强类型的语言与Pascal相比可能是弱类型的.要确定C或C++是否为弱类型,首先必须询问您想要弱类型的含义.

  • @AndreyChernyakhovskiy不,他们不能."Cast"表示"显式转换"(或具体地说,用于编写显式转换的语法).有一些隐含的转换,就像我在回答中已经提到的那样,但它们并不被称为强制转换. (3认同)
  • @Mehrdad 同意,并扩展了我的答案。 (2认同)

The*_*ant 9

"弱类型"是一个非常主观的术语.我更喜欢术语"严格打字""静态打字""松散打字""动态打字",因为它们更客观,更精确.

据我所知,人们通常使用"弱类型"作为一个小型贬义词,意思是"我不喜欢这种语言中的类型概念".对于那些无法针对特定语言提出专业或技术论据的人来说,这是一种论证广告(或者更确切地说,是论证广告语言).

"严格打字"一词也有不同的解释; 根据我的经验,普遍接受的含义是"如果类型不匹配,编译器会生成错误".另一种解释是"没有或很少有隐含的转换".基于此,C++实际上可以被认为是一种严格类型的语言,并且通常被认为是这样的语言.我会说C++的普遍共识是它一种严格类型的语言.

当然,我们可以尝试一种更细微的方法来解决问题,并说语言的某些部分是严格类型的(这是大多数情况),其他部分是松散类型的(一些隐式转换,例如算术转换和四种类型)显式转换).

此外,还有一些程序员,特别是不熟悉多种语言的初学者,他们不打算或不能区分"严格"和"静态","松散"和"动态",并根据他们有限的经验(通常是流行的脚本语言中的动态和松散类型的相关性)来混淆两个 - 否则是正交的概念.

实际上,C++(虚拟调用)的一部分强制要求类型系统是部分动态的,但标准中的其他内容要求它是严格的.同样,这不是问题,因为这些是正交概念.

总结一下:可能没有语言完全适合一个类别或另一个类别,但我们可以说某个特定语言的哪个特定属性占主导地位.在C++中,严格确实占主导地位.


ruo*_*ola 5

好吧,既然 C++ 的创建者 Bjarne Stroustrup 在《C++ 编程语言》(第 4 版)中说该语言是强类型的,我就相信他的话:

\n\n
\n

C++ 编程基于强静态类型检查,大多数技术旨在实现高级抽象并直接表示程序员\xe2\x80\x99 的想法。与较低级别的技术相比,这通常可以在不影响运行时间和空间效率的情况下完成。为了获得 C++ 的优势,从不同语言转向 C++ 的程序员必须学习并内化惯用的 C++ 编程风格和技术。这同样适用于习惯了早期且表达能力较差的 C++ 版本的程序员。

\n
\n\n

在 1994 年的视频讲座中,他还指出 C 的弱类型系统确实困扰着他,这就是他将 C++ 强类型化的原因:C++ 的设计,Bjarne Stroustrup 的讲座

\n