C和C++以外的语言中未定义行为的示例

本文关键字:未定义 语言 C++ | 更新日期: 2023-09-27 17:59:42

我听说过C和C++中有很多未定义的行为示例,但没有听说过其他语言中的未定义行为示例,我也知道C和C++在许多可靠性至关重要的情况下都会使用。在SO上搜索"未定义的行为"几乎只会产生C和C++结果。

在我教的一门课程中,我也想举一些其他主要语言中奇怪的gotchas或未定义行为的例子。有人能举几个类似int i的具体例子吗;如果(--i==i++){…}导致其他语言中的未定义行为?

例如,我理解如果(--I==I++){…}在c++中未定义,但在c#中定义,因为这里描述了额外的序列点。(--I==I++)是未定义的行为吗?。我想要其他语言中未定义行为的例子,这些行为不是非受迫性错误,比如忘记初始化变量或不锁定共享数据。

C和C++以外的语言中未定义行为的示例

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

这也可能导致问题——如果你不必声明一个变量,那么一个错误类型的变量可能会导致一个难以发现的错误。这就是为什么Visual Basic有Option Explicit语句,该语句覆盖默认行为并强制用户声明每个变量,从而捕获许多错误。同样的事情(不声明变量)可能会导致意外的范围问题——这与"未定义"行为不同,而是"意外"行为。

在具有"漂亮、简单"数组操作的语言中,例如Python或Perl,当您在一个内容正在更改的数组上循环时,您可能会遇到一个有趣的(我认为是未定义的)行为:

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

(在本例中,循环遍历列表并删除符合特定条件的元组-从迭代时从列表中删除项目)

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