6

想知道如果 next 的值为 NULL(节点是链表),下一条语句是否会导致保护错误和其他可怕的事情。

if (!node->next || node->next->some_field != some_value) {

我假设一旦第一部分为真,OR 的第二部分就不会被评估。我假设这个错了吗?这个编译器是特定的吗?

4

5 回答 5

10

在 ISO-IEC-9899-1999 标准 (C99) 的第 6.5.14 节中:

|| 如果任一操作数比较不等于 0,则运算符应产生 1;否则,它产生 0。结果具有 int 类型。4 不同于按位 | 运算符,|| 运算符保证从左到右的评估;在计算第一个操作数之后有一个序列点。如果第一个操作数比较不等于 0,则不计算第二个操作数。

这不是特定于编译器的。如果node->nextNULL,则永远不会评估条件的其余部分。

于 2013-01-10T13:18:19.017 回答
5

在 OR 中,

if ( expr_1 || expr_2)

expr_2 只有在 expr_1 失败时才被“测试”(为假)

在一个 AND

if( expr_1 && expr_2 )

expr_2 只有在 expr_1 成功时才被“测试”(为真)

于 2013-01-10T13:15:56.197 回答
2

可以安全地假设,如果左侧的计算结果为 true,则不会计算右侧的布尔表达式。请参阅相关问题

于 2013-01-10T13:16:14.333 回答
2

它不是特定于编译器的。您可以安全地依赖短路,您的代码将按预期工作。

于 2013-01-10T13:16:47.100 回答
2

你是对的。

在运算符之后的条件()之前,运算符( )之前的条件compiler independent总是被评估。如果条件是,则整体只评估为而不评估条件。firstOR!node->nextsecondnode->next->some_field != some_valueORfirsttrueexpressiontruesecond

您只是在为您的linked list. next只有当它是 时,您才会进一步访问指针not NULL

于 2013-01-10T13:17:30.297 回答