C/C++是一个不是数字的int值?

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上激活断言,是否会出现这种情况.

并且我没有可能更改代码以便在断言未激活的情况下打印数字.

有任何想法吗?

编辑:在阅读了几条评论后,我被迫编辑.显示代码?你为什么要做这个蠢事?我不相信!在哪里使用?从我的问题来看,显然我不会发布/更改代码,原因有以下几种:

  • 我是一个初学者并且对代码感到羞耻(那里没有犯罪,如果我发布它,肯定会更容易回答问题)
  • 我被要求只用很少的信息帮助一个朋友(不,我没有问他为什么你不能检查返回的数字,或者为什么他不能只添加一个断点).
  • 我在没有任何编译器的emacs中编写我的代码,并将其发送到编译它的远程服务器,运行它并且只有在出现问题时才能返回失败的断言.

如果你认为我是恶作剧或恶作剧你应该投票支持关闭线程.我会完全没问题.但是添加这样的不必要的评论只会让我想要一个"态度"的标志来实现.

我要感谢其他人的意见和答案,他们实际上试图解释并回答我的问题.

rlb*_*ond 14

assert如果NDEBUG定义了宏,则取消选中.#undef NDEBUG编译此翻译单元时请确保您.

您可以使用-E开关调用gcc 以验证断言语句是否仍在代码中.


Ste*_*ini 13

正如我在生活中看到过如此丑陋的事情,可以解释一下perform_calc()是否有缓冲区溢出会覆盖堆栈中的返回地址.当函数结束时,覆盖的地址从堆栈中恢复并设置为当前的PC,导致可能在程序的另一个区域跳转,显然超过了断言调用.

虽然这是一个非常遥远的可能性,所以这就是你所展示的.

另一种可能性是有人做了一个丑陋的宏伎俩.检查你是否有类似的东西

#define assert 
Run Code Online (Sandbox Code Playgroud)

或者当你在洗手间时,一些同事把这样的东西放在标题中

#define < ==
#define > ==
Run Code Online (Sandbox Code Playgroud)

正如另一个答案中所建议的那样,请使用gcc -E查看实际编译的代码.


gre*_*ade 5

首先看起来代码不正确.如果打开调试(设置了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()吗?


R. *_*des 5

这个代码是多线程的吗?也许你有竞争条件.