Mil*_*lan 2 c c++ int assert numbers
这会发生吗?3断言,其中一个应该激活.
int nr = perform_calc();
assert( nr == 0);
assert( nr > 0);
assert( nr < 0);
Run Code Online (Sandbox Code Playgroud)
如果程序没有在g ++ 3.4.4上激活断言,是否会出现这种情况.
并且我没有可能更改代码以便在断言未激活的情况下打印数字.
有任何想法吗?
编辑:在阅读了几条评论后,我被迫编辑.显示代码?你为什么要做这个蠢事?我不相信!在哪里使用?从我的问题来看,显然我不会发布/更改代码,原因有以下几种:
如果你认为我是恶作剧或恶作剧你应该投票支持关闭线程.我会完全没问题.但是添加这样的不必要的评论只会让我想要一个"态度"的标志来实现.
我要感谢其他人的意见和答案,他们实际上试图解释并回答我的问题.
Ste*_*ini 13
正如我在生活中看到过如此丑陋的事情,可以解释一下perform_calc()是否有缓冲区溢出会覆盖堆栈中的返回地址.当函数结束时,覆盖的地址从堆栈中恢复并设置为当前的PC,导致可能在程序的另一个区域跳转,显然超过了断言调用.
虽然这是一个非常遥远的可能性,所以这就是你所展示的.
另一种可能性是有人做了一个丑陋的宏伎俩.检查你是否有类似的东西
#define assert
Run Code Online (Sandbox Code Playgroud)
或者当你在洗手间时,一些同事把这样的东西放在标题中
#define < ==
#define > ==
Run Code Online (Sandbox Code Playgroud)
正如另一个答案中所建议的那样,请使用gcc -E查看实际编译的代码.
首先看起来代码不正确.如果打开调试(设置了DEBUG和/或_DEBUG并且未设置NDEBUG):
assert( nr == 0);
Run Code Online (Sandbox Code Playgroud)
如果nr!= 0,上面的行将调用exit().因此,如果该行通过,则第二个断言将执行:
assert( nr > 0);
Run Code Online (Sandbox Code Playgroud)
...并调用exit(),因为nr == 0和!(nr> 0).
assert( nr < 0);
Run Code Online (Sandbox Code Playgroud)
而这第三条线永远不会运行.
具体而言,这段代码的重点是什么?为什么,如果可以添加这些断言,你可以不添加printf()吗?