我想知道是否总是编译以下代码,这样就不会出现非法的NULL ptr引用?
我担心的是,编译器可能会在第一次检查"b"是否为NULL之前检查是否为b->值。
typedef struct
{
int value;
} mystruct;
int func(mystruct * b)
{
if((NULL == b) || (b->value == 0))
{
return -1;
}
printf("value: %dn", b->value);
}
如果b
是NULL
,则(NULL != b)
是false,则将检查第二面。(请参阅短路评估),您可能会得到NULL ptr取消引用。
将||
更改为&&
是的,(NULL != b)
将在(b->value == 0)
之前进行测试。
你所做的就是所谓的短路评估。
您不必担心,除非第一个条件尚未确定结果,否则不会执行第二个条件。