2013-02-17 67 views
0

它让我感到有点奇怪,我听说过来自C和C++但未从其他语言中加载未定义的行为示例,其中我也知道C和C++是在可靠性至关重要的许多情况下使用。在SO上搜索“未定义的行为”几乎完全是C和C++的结果。C和C++以外的语言中未定义行为的示例

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

例如,我明白如果(-i == i ++){...}在C++中未定义,但在c#中定义,因为这里描述的额外序列点Is (--i == i++) an Undefined Behavior?。我想要其他语言中的未定义行为的示例,这些行为不是非强制性错误,例如忘记初始化变量或不锁定共享数据。

+2

多线程程序错误的同步可能导致“未定义的行为”,在许多语言中,我想。你是指这种行为? – 2013-02-17 22:10:05

+1

这是一个有趣的问题,但这不是真正的这个论坛的问题...更可能引起辩论而不是清晰的答案。 – Floris 2013-02-17 22:10:13

+0

这可能是因为在c/C++中你用指针工作得太多了,你必须自己分配内存。当你在c中使用一个字符串(char *)时,很容易忘记添加尾随的'\ 0',如果你试图打印它,会导致未命中的行为,而在很多语言中,比如python,你不会必须担心这一点。 – 2013-02-17 22:10:19

回答

2

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

这也会导致问题 - 如果你不需要声明一个变量,那么错误的变量可能会导致一个难以察觉的错误。这就是为什么例如Visual Basic具有Option Explicit语句,它覆盖默认行为并强制用户声明每个变量 - 一路捕捉许多错误。同样的事情(不声明变量)可能会导致意外的范围问题 - 与“未定义”行为不同,但是“意外”。例如,在使用“nice,easy”数组操作的语言中(例如,Python或Perl),当您循环访问正在更改其内容的数组时,您可能遇到一个有趣的(和,我认为未定义的)行为:

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

(在这个例子中,循环在一个列表和删除符合特定标准的元组 - 从Remove items from a list while iterating

当一个数组要么生长或foreach循环期间收缩,所有的赌注都关闭(和一些口译员会抛出异常)。再一次 - 做错事情“很容易”,并得到意想不到的结果...

+0

抱歉不简明,我编辑了我的问题以更好地描述我正在寻找的内容。 – odinthenerd 2013-02-17 22:34:54