非C和C++语言未定义行为的示例 - c#

As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center作为指导。
                            
                        
                    
                
                7年前关闭。
            
        

听到来自C和C ++的大量未定义行为示例的消息让我感到有些奇怪,但从其他语言中却没有听到,我也知道C和C ++在可靠性至关重要的许多情况下使用。在SO上搜索“未定义行为”几乎只能得到C和C ++结果。

在我所教的课程中,我还要举例说明其他主要语言的怪异陷阱或不确定行为。有人可以举一些类似于int i的具体例子吗? if(-i == i ++){...}导致其他语言的不确定行为?

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

参考方案

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

这也可能导致问题-如果您不必声明变量,则变量类型错误会导致难以发现的错误。这就是为什么Visual Basic具有Option Explicit语句,该语句将覆盖默认行为,并强制用户声明每个变量-沿途捕获许多错误。同一件事(不声明变量)可能导致意外的范围问题-与“未定义”行为不同,而与“意外”相同。

在具有“很好,简单”的数组操作的语言(例如Python或Perl)中,当您遍历要更改其内容的数组时,可能会遇到有趣的(并且我认为是未定义的)行为:

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

(在此示例中,遍历列表并从Remove items from a list while iterating中删除满足某些条件的元组)

当数组在foreach循环中增大或缩小时,所有选择都将关闭(某些解释器将引发异常)。再一次-做错误的事情很容易,并得到意想不到的结果...

在Java中,执行“ ++++++++”表达式,编译器未报告任何错误并且可以正确执行? - java

我用eclipse编写了这段代码,用war写过,结果为3d。public static void main(String[] args) { double a = 5d + + + + + +-+3d; System.out.println(a); } 参考方案 您的表情可以改写为(5d) + (+ + + + +-+3d) 其中第一个+是应用于两个操作数的…

如何用Cython保持C++类名不变? - c++

我有一个名为Foo的C++类。如果遵循Cython C++ tutorial,则需要以其他方式调用Python类,例如PyFoo。但是我确实也需要调用Python类Foo。如何有效地做到这一点?编辑:我正在尝试接口以前与Boost Python接口的现有C++库。由于不同的原因,我想测试Cython。由于使用Boost:Python调用了Python类,因此…

从C++调用Python函数 - c++

我正在尝试从C++实现调用Python函数。我以为可以通过函数指针来实现,但是似乎不可能。我一直在使用boost.python完成此操作。假设在Python中定义了一个函数:def callback(arg1, arg2): #do something return something 现在,我需要将此函数传递给C++,以便可以从那里调用它。如何使用boos…

SWIG和C++共享库 - c++

我有一个C++库(我们将其称为mylib)编译为libmylib.so中的/usr/local/lib文件,并且我在my lib中一个名为/usr/local/include的目录中有许多头文件。现在,我想做的(对于初学者而言)只是将其中一个头文件(包含有关我的图书馆提供的类的信息)与SWIG一起使用,以生成mylib_wrap.cxx文件,然后进行编译并将…

编写虚拟网络摄像头? - c++

我需要创建一个虚拟的网络摄像头,该虚拟的网络摄像头冒充一个网络摄像头,但是将其播放的一组图像作为输入。我见过诸如ManyCam和Fake Webcam之类的解决方案,但它们似乎都在一个限制或另一个限制(分辨率,最大文件大小,fps等)上,我正在使用Windows XP SP3。我知道我必须为此任务编写WIA接口,但是作为Python程序员,我从未编写过驱动程…