布尔表达式中的整数和指针

所有整数或指针都可以在被解释为真值的表达式中使用。

int main(int argc, char* argv[]) {
  if (argc % 4) {
    puts("arguments number is not divisible by 4");
  } else {
    puts("argument number is divisible by 4");
  }
...

表达 argc % 4 被评估并导致 0123 中的一个值。第一个,0 是唯一的值并将执行带入 else 部分。所有其他值都是真实的并进入 if 部分。

double* A = malloc(n*sizeof *A);
if (!A) {
   perror("allocation problems");
   exit(EXIT_FAILURE);
}

这里评估指针 A,如果它是空指针,则检测到错误并退出程序。

很多人喜欢用 A == NULL 来写一些东西,但是如果你把这种指针比较作为其他复杂表达的一部分,事情很快就会难以阅读。

char const* s = ....;   /* some pointer that we receive */
if (s != NULL && s[0] != '\0' && isalpha(s[0])) {
   printf("this starts well, %c is alphabetic\n", s[0]);
}

要进行检查,你必须扫描表达式中的复杂代码并确保运算符首选项。

char const* s = ....;   /* some pointer that we receive */
if (s && s[0] && isalpha(s[0])) {
   printf("this starts well, %c is alphabetic\n", s[0]);
}

相对容易捕获:如果指针有效,我们检查第一个字符是否为非零,然后检查它是否是一个字母。