c/c++开发分享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指针。

      以上就是c/c++开发分享C中逻辑OR执行的顺序相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(猴子技术宅)。

      本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

      如若转载,请注明出处:https://www.ssfiction.com/c-cyuyankaifa/545889.html

      发表评论

      电子邮件地址不会被公开。 必填项已用*标注