想知道如果 next 的值为 NULL(节点是链表),下一条语句是否会导致保护错误和其他可怕的事情。
if (!node->next || node->next->some_field != some_value) {
我假设一旦第一部分为真,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
总是被评估。如果条件是,则整体只评估为而不评估条件。first
OR
!node->next
second
node->next->some_field != some_value
OR
first
true
expression
true
second
您只是在为您的linked list
. next
只有当它是 时,您才会进一步访问指针not NULL
。