有点奇怪,我听说过来自C和C ++的大量未定义行为示例,但是没有来自其他语言,我也知道在可靠性至关重要的许多情况下使用C和C ++。在SO上搜索“未定义的行为”几乎只能产生C和C ++结果。
在我正在教授的课程中,我还想提供一些其他主要语言中奇怪的陷阱或未定义行为的例子。有人可以提供一些类似于int i的具体例子; if( - i == i ++){...}导致其他语言中的未定义行为?
例如,我理解是否( - i == i ++){...}在c ++中未定义,但在c#中定义,因为此处描述了额外的序列点Is (--i == i++) an Undefined Behavior?。我想要其他语言中未定义行为的示例,这些行为不是非强制错误,例如忘记初始化变量或不锁定共享数据。
答案 0 :(得分:2)
C和C ++语言希望程序员能够付出艰苦的努力 - 这意味着没有边界检查等等。这样做的好处就是速度 - 如果你知道你不会写出数组的末尾(你的算法禁止它),没有必要检查每次迭代。许多高级语言都构建了许多安全措施 - 它们会在首次声明时自动分配变量,如果在当前边界之外分配,则展开数组,跟踪字符串的长度,...
这也可能导致问题 - 如果您不必声明变量,那么错误的变量可能会导致难以发现的错误。这就是为什么Visual Basic具有Option Explicit
语句,该语句覆盖默认行为并强制用户声明每个变量 - 沿途捕获许多错误。同样的事情(不是声明变量)会导致意外的范围问题 - 与“未定义”行为不同,而是“意外”。
在具有“漂亮,简单”的数组操作的语言中 - 例如,Python或Perl - 当你循环一个你正在改变其内容的数组时,你会遇到一个有趣的(我认为是未定义的)行为: / p>
for tup in somelist:
if determine(tup):
code_to_remove_tup
(在此示例中,循环遍历列表并删除符合特定条件的元组 - 来自Remove items from a list while iterating)
当一个数组在foreach
循环期间增长或收缩时,所有的赌注都会关闭(并且一些解释器会抛出异常)。再一次 - 做错事是“容易”,并得到意想不到的结果......