我使用C的assert.h assert函数的方法类似于下面的方法:

int x = 3;

if (x == 3)
    printf("x is 3 ✅");

assert(x != 3);

在运行它时,我发现if语句被完全跳过,程序在达到assert语句时终止.不用说,在我找到罪魁祸首之前,这在我的程序中造成了几个非常糟糕的错误.这可能是什么原因呢?为什么条件条件被完全跳过了?如果它没有被跳过,那么为什么里面的代码没有被执行?我在网上建立了一个here个例子.

推荐答案

不跳过if语句.

assert被执行时,它不被认为是"干净的"程序终止.因此,不会刷新I/O缓冲区.try 添加fflush()调用以显式刷新stdout的缓冲区:

int x = 3;

if (x == 3)
{
    printf("x is 3 ✅");
    fflush(stdout);
}

assert(x != 3);

以下是C17标准的相关段落(斜体强调我的):

7.2.1.1

ASSERT宏将诊断测试放入程序中;它扩展为一个空表达式.执行时,如果表达式(应该具有标量类型)为FALSE(即,比较等于0),则Assert宏将有关失败的特定调用的信息(包括参数文本、源文件名、源行号和封闭函数的名称-后者分别是预处理宏__FILE____LINE__以及标识符__func__的值)以实现定义的格式写入标准错误流.It then calls the abort function.

7.22.4.1

ABORT功能导致abnormal program termination发生,除非信号SIGABRT 正在被捕获,并且信号处理程序不返回.Whether open streams with unwritten buffered data are flushed, open streams are closed, or temporary files are removed is implementation-defined.

C++相关问答推荐

为什么静态说明符为内联函数生成外部定义?

Mbed TLS:OAEP的就地en—/decryption似乎不起作用'

如何解决C中的严格别名?

*p[num]和(*p)num的区别

将常量转换为指针会增加.数据大小增加1000字节

无法在OpenGL上绘制三角形

当b是无符号字符时,int a=(b<;<;2)>;>;2;和int a=b&;0x3F;之间有什么区别?

在C++中允许使用字符作为宏参数

我正在try 将QSORT算法实现为C++中的泛型函数

如何在C宏定义中包含双引号?

try 查找带有指针的数组的最小值和最大值

在文件描述符上设置FD_CLOEXEC与将其传递给POSIX_SPOWN_FILE_ACTIONS_ADCLOSE有区别吗?

存储和访问指向 struct 的指针数组

使用mmap为N整数分配内存

为什么GCC不能在 struct 初始值设定项中以sizeof作为条件的三进制中处理复合文字的编译时求值?

Tcl_GetDoubleFromObj在列表的迭代中是一个缺点

访问未对齐联合的成员是否为未定义行为,即使被访问的成员已充分对齐?

C循环条件内的函数

std::malloc/calloc/realloc/free 与纯 C 的 malloc/calloc/realloc/free 有什么不同

保存有符号整数结果的变量是否会溢出(后增量的副作用),并且此后从未在任何表达式中使用过它,是否会导致 UB?