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)
因此 !file
与 0 == 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
进行比较是相同的。所以 !file
和 file == 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。
你的两个陈述在逻辑上是等价的。 (可能)唯一的区别是风格或个人喜好。您可能会发现查看已编译的程序集以进行更深入的研究很有趣。
这两个检查文件是否实际打开的版本有什么区别吗:
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 typeint
. The expression!E
is equivalent to(0==E)
因此 !file
与 0 == 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 function66 ) The macro
NULL
is defined in <stddef.h> (and other headers) as a null pointer constant; see 7.19
这意味着将指针与 0 进行比较与将其与 NULL
进行比较是相同的。所以 !file
和 file == 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。
你的两个陈述在逻辑上是等价的。 (可能)唯一的区别是风格或个人喜好。您可能会发现查看已编译的程序集以进行更深入的研究很有趣。