![]() |
1
4
在C语言和C++语言中,不确定行为的概念是必需的,因为检测导致它的条件是不可能的或昂贵的。以该代码为例:
在这里,指针被删除了两次,导致未找到的行为。对于C语言或C++语言来说,检测错误太难了。 |
![]() |
2
1
主要是因为,为了达到某些目的,这是必要的。例如,C和C++最初用于编写操作系统,包括设备驱动程序之类的东西。为了做到这一点,他们使用(除其他外)直接访问表示I/O设备的特定硬件位置。阻止对这些位置的访问将阻止C用于其预期目的(并且C++专门针对允许所有与C相同的能力)。 另一个因素是在指定 语言 并指定 平台 . 为了使用相同的例子,C和C++都是基于有意识的决定来限制定义的。 语言 ,并将该语言周围的平台分开。相当多的替代方案,以Java和.NET作为两个最明显的例子,指定了整个平台。 这两个都反映了设计态度的基本差异。C(主要是C++中的设计)的一个基本原则是“信任程序员”。虽然从来没有这么直接地陈述过,但Java的基本“沙箱”概念是基于这样一种想法的: 不 相信程序员。 至于什么语言有/没有未定义的行为,这是一个肮脏的小秘密:对于所有实际用途, 全部的 他们中有人行为不明确。一些语言(又是C和C++是最好的例子),要付出相当多的努力来指出什么行为是未定义的,而许多其他人却试图声称它不存在(例如Java),或者大部分忽略了它出现的许多“黑暗角落”(例如,Pascal,大多数.NET)。 那些声称它不存在的人通常会产生最大的问题。例如,Java包含很多规则 尝试 保证浮点数结果一致。在这个过程中,他们不可能在相当多的硬件上有效地执行Java——但是浮点结果仍然不能保证是一致的。更糟糕的是,他们要求的浮点模型并不完全完美,因此在某些情况下 防止 尽你所能取得最好的结果(或者至少让你做了很多额外的工作来完成它要求的任务)。 值得称道的是,Sun/Oracle(最终)已经开始注意到这个问题,现在正在研究一个完全不同的浮点模型,这应该是一个改进。我不确定这是否已经被包含在Java中,但是我怀疑当/如果它是,旧模型的代码和新模型的代码之间会有相当大的“裂痕”。 |
![]() |
3
0
因为不同的操作系统的操作方式不同(…),您不能只说“在这种情况下崩溃”,因为这可能是操作系统可以做得更好的事情。 |