C中逻辑OR执行的顺序
想知道下一个语句是否会导致保护错误和其他可怕的东西,如果next的值是NULL(节点是链表)。
if (!node->next || node->next->some_field != some_value) {
我假设一旦第一部分为真,则不评估OR的第二部分。 假设这个我错了吗? 这个编译器是否具体?
在ISO-IEC-9899-1999标准(C99)中,第6.5.14节:
|| 如果操作数的任何一个比较不等于0,则运算符应该为1; 否则,它产生0.结果类型为int。 4与按位|不同 运算符,|| 运营商保证从左到右的评估; 在评估第一个操作数后有一个序列点。 如果第一个操作数比较不等于0,则不计算第二个操作数。
这不是特定于编译器的。 如果node->next
为NULL
,则永远不会评估其余条件。
在OR中,
if ( expr_1 || expr_2)
expr_2仅在expr_1失败时被’测试’(为假)
在一个AND
if( expr_1 && expr_2 )
expr_2仅在expr_1成功时被“测试”(为真)
如果左侧的计算结果为true,则可以安全地假设不会计算右侧布尔表达式。 见相关问题 。
它不是特定于编译器的。 您可以放心地依赖短路,您的代码将按预期工作。
你是对的。
它与compiler independent
并且在OR
运算符之后评估second
条件( node->next->some_field != some_value
)之前,始终是OR
运算符( !node->next
)之前的second
条件。 如果第first
条件为true
,则整个expression
仅在不评估second
条件的情况下求值为true
。
您只是在linked list
充分利用此function。 只有当它not NULL
您才会进一步访问next
指针。