我一直在阅读别人的代码,但人们对if语句使用的参数真的让我感到困惑。我见过人们把指针和结构作为参数,但我不明白如何决定逻辑语句的结果是真是假。例如:
struct Foo foo;
if(foo)
doSomething();
char *ch = malloc(sizeof(char));
if(num)
doSomethingElse();
如果有人编写和编译这个,如何从If语句中的逻辑语句中确定结果的正确性或错误性?
指针可用作布尔值。null指针被认为是false,而非null指针则被认为是true。
数字可用作布尔值。零值被认为是假,任何其他值都被认为是真。
结构不能用作布尔值,尽管指向结构的指针是.
if
语句的控制表达式不能是聚合类型(例如结构类型),只能是标量类型(例如整数类型、指针类型…)。
struct Foo foo;
if (foo) // not valid, foo is of a structure type
if (&foo) // valid, &foo is of a pointer type
if ((void *) 0) // valid, (void *) 0 is of a pointer type
if (42) // valid, 42 is of an integer type
if (3.14159) // valid, 3.14159 is of a floating point type
在C中,如果表达式需要解释为真值,则将其与0
进行比较,并根据需要应用正常转换。在整数的情况下,这是显而易见的。在浮点值的情况下,0
被转换为0.0
。在指针的情况下,将指针与空指针进行比较。在结构或并集的情况下,比较是没有意义的,并且会给出编译时错误。