if (!file) 和 if (file == NULL) 的区别

Difference between if (!file) and if (file == NULL)

这两个检查文件是否实际打开的版本有什么区别吗:

FILE *file = fopen(fname, "rb");
if (!file)
{
    exit(1);
}

FILE *file = fopen(fname, "rb");
if (file == NULL)
{
    exit(1);
}

这两个是等价的。

逻辑 NOT 运算符 !C standard 的第 6.5.3.3p5 节中定义如下:

The result of the logical negation operator ! is 0 if the value of its operand compares unequal to 0, 1 if the value of its operand compares equal to 0. The result has type int. The expression !E is equivalent to (0==E)

因此 !file0 == file 相同。值 0 被认为是一个 空指针常量 ,在 6.3.2.3p3:

节中定义

An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.66) If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function

66 ) The macro NULL is defined in <stddef.h> (and other headers) as a null pointer constant; see 7.19

这意味着将指针与 0 进行比较与将其与 NULL 进行比较是相同的。所以 !filefile == NULL 是一样的。

https://github.com/gcc-mirror/gcc/blob/master/gcc/ginclude/stddef.h

<stddef.h> 将 NULL 定义为字面上的 0。

C 中的条件语句之所以成为 'true',是因为它不是 0。就是这样。

! 运算符将非零值转换为 0,将 0 值转换为 1。 == 运算符 returns 如果操作数相等则为 1,否则为 0。

你的两个陈述在逻辑上是等价的。 (可能)唯一的区别是风格或个人喜好。您可能会发现查看已编译的程序集以进行更深入的研究很有趣。