复合如果检查为null,那么C中的其他条件总是安全的吗?

Dar*_*usz 1 c if-statement operator-precedence

(这个问题是Is复合的精确副本,如果检查null,然后C++中的其他条件总是安全的?但是关于C,而不是C++.有人指出问题应该更具体).

我一直在使用以下类型的if条件.

char* ptr = ...;
if (ptr != NULL && ptr[0] != '\0') // <=== is this always safe?
{ /* ... */ }
Run Code Online (Sandbox Code Playgroud)

它依赖于ptr != NULL之前的检查ptr[0] !='\0'.

在所有标准,编译器和架构下都安全吗?或者是否有可能ptr[0] != '\0'在之前进行检查ptr != NULL

use*_*733 11

是的,这是安全的.

C标准说(N1570 - 6.5.13逻辑AND运算符):

与按位二进制和运算符不同,&&运算符保证从左到右的评估; 如果计算第二个操作数,则在第一个和第二个操作数的计算之间存在一个序列点.如果第一个操作数比较等于0,则不计算第二个操作数.

  • +½仅用于引用_one_标准 (3认同)
  • +1引用标准:) (2认同)
  • 也许还要先添加:"是". (2认同)