简短回答:负值以及任何一般的非零值在用作条件时都被视为真。
对于 C,有许多上下文将表达式视为条件。条件不一定是bool 或_Bool 类型;该类型仅由 1999 年标准添加到语言中。
这些上下文中最明显的是if 语句中的表达式,但还有其他示例:while、do-while、for 标头中的第二个表达式、@987654327 的第一个操作数@ 条件运算符,以及 !、&& 和 || 运算符的操作数。 (我认为这是一个详尽的列表,但我不确定。)
以下是 C 标准对 if 语句行为的说明(“两种形式”指的是 if 有和没有 else 子句):
在这两种形式中,如果表达式比较不等于 0,则执行第一个子语句。
这意味着:
if (foo) ...
等价于:
if ((foo) != 0) ...
(添加额外的括号以避免任何运算符优先级问题)。如果foo 是int 类型,则含义很明确。如果foo 是某种浮点类型,0 将转换为相同的类型(如果该值恰好是负零或 NaN,则可能会导致一些细微差别)。而如果foo 是一个指针,0 被视为一个空指针常量; if (ptr) 等价于if (ptr != NULL)(假设NULL 的定义可见)。
对于 C++,规则的表述略有不同,但效果是一样的。 C++ if 语句中的条件转换为类型 bool(与 C 中不同,类型 bool 自早期历史以来就已内置到 C++ 中)。 C++ 标准将任何标量类型的值转换为bool 定义为:
零值、空指针值或空成员指针值是
转换为 false;任何其他值都将转换为 true。一种
std::nullptr_t 类型的纯右值可以转换为
输入 bool;结果值为 false。
所以在 C 和 C++ 中,任何标量(即整数、浮点或指针)值都可以用作条件,如果标量等于 0,则条件为假,否则为真等于零。 C 将此定义为与0 的不等式比较; C++ 将其定义为对bool 的转换——但结果是一样的。
这有点偏离问题的主题,但我会提到重要的是要注意被视为真实条件的值不一定等于到true . true(如果您有 #include <stdbool.h>,则在 C 中为 1,并且在 C++ 中为 bool 类型的唯一值)只是在条件中使用时具有“真实性”的众多值之一。这就是为什么你几乎不应该写的原因:
if (cond == true) ...
在 C 或 C++ 中(除非你真的需要将它与那个值进行比较);随便写:
if (cond) ...
一个 C++ 示例:
#include <iostream>
int main() {
int n = 2;
if (n) std::cout << "n has truthiness\n";
else std::cout << "n does not have truthiness\n";
if (n == true) std::cout << "n == true\n";
else std::cout << "n != true\n";
}
输出是:
n has truthiness
n != true