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->nextNULL ,则永远不会评估其余条件。

在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指针。