0

我听说过大量来自 C 和 C++ 而不是来自其他语言的未定义行为示例,这让我感到有点奇怪,我也知道 C 和 C++ 用于许多可靠性至关重要的情况。在 SO 上搜索“未定义行为”几乎只产生 C 和 C++ 结果。

在我正在教的一门课程中,我还想举一些其他主要语言的奇怪陷阱或未定义行为的例子。有人可以举几个类似于 int i 的具体例子吗?if(--i == i++){...} 会导致其他语言中未定义的行为?

例如,我理解 if(--i == i++){...} 在 c++ 中未定义,但在 c# 中定义,因为此处描述的额外序列点是 (--i == i++) 是未定义的行为吗?. 我想要其他语言中未定义行为的示例,这些示例不是非强制错误,例如忘记初始化变量或未锁定共享数据。

4

1 回答 1

3

C 和 C++ 语言期望程序员做艰苦的工作——这意味着没有边界检查等。这样做的好处是速度——如果你知道你不会写超出数组的末端(你的算法禁止它),不需要在每次迭代中检查。许多高级语言都内置了许多保护措施——它们会在首次声明时自动分配变量,如果您在当前范围之外分配,则扩展数组,为您跟踪字符串的长度,...

这也可能导致问题 - 如果您不必声明变量,那么输入错误的变量可能会导致难以发现的错误。这就是为什么例如 Visual Basic 具有Option Explicit覆盖默认行为并强制用户声明每个变量的语句 - 在此过程中捕获许多错误。同样的事情(不声明变量)可能导致意外的范围问题 - 与“未定义”行为不同,而是“意外”。

在具有“不错、简单”的数组操作的语言中——例如 Python 或 Perl——当你遍历一个你正在更改其内容的数组时,你可能会遇到一个有趣的(而且,我认为是未定义的)行为:

for tup in somelist:
    if determine(tup):
         code_to_remove_tup

(在此示例中,循环遍历列表并删除满足特定条件的元组 - 从在迭代时从列表中删除项目

当一个数组在foreach循环过程中增长或缩小时,所有的赌注都被取消了(一些解释器会抛出异常)。再一次 - 做错事很“容易”,并得到意想不到的结果......

于 2013-02-17T22:15:06.383 回答