整数到布尔的奇怪语法

Integer to Boolean strange syntax

我从事 C++ 开发还不到一年(在此之前专注于其他语言),我正在查看一个从事此工作二十年的人的代码。我以前从未见过这种语法,希望有人能提供帮助。

bool b; // There exists a Boolean variable.
int i;  // There exists an integer variable.

sscanf(value, "%d", &i); // The int is assigned from a scan.
b = (i != 0); // I have never seen this syntax before.

我知道布尔值是从刚刚扫描的 int 中分配的,但我不了解正在发生的事情的 (* != 0) 方面。有人可以解释为什么这个比我更了解该语言的人正在使用这样的语法吗?

阅读这里: http://en.cppreference.com/w/cpp/language/operator_comparison

运算符 != 的结果是布尔值。所以这个人说 "compare the value in i with 0"。如果 'i' 不等于 0,则 '!=' returns 为真。

所以实际上 b 中的值是 "true if 'i' is anything but zero"

编辑:为了回应 OP 对此的评论,是的,如果您使用 returns bool 的任何其他运算符,您可能会遇到 类似 的情况。当然,当与 int 类型一起使用时,!= 表示负数计算结果为真。如果使用 > 0,则 0 和负数都将计算为 false。

(i != 0) 是一个计算结果为 truefalse 的表达式。因此,b 根据 i.

的值得到 true/false 的值

这是相当基础的语法。 != 运算符执行 "not equal to" 比较。

您可能会对直接从比较运算符的结果初始化 bool 的 shorthand 感到困惑,但语法本身并不深奥。

该程序本质上等同于:

bool b;
int i;

sscanf(value, "%d", &i);

if (i != 0)
   b = true;
else
   b = false;

关键是 i != 0 本身是一个计算结果为 truefalse 的表达式,而不是一些只能在 if 语句中使用的魔法。

基本上,如果满足条件(i not_equal_to 0 ),b得到值"true"。否则 b 得到值 "false".

这里,"i != 0" 是一个布尔表达式,如果 "i" 非零则为真,如果为零则为假。

这里发生的一切都是该表达式被分配给变量的结果。

你也可以做...

boolean canDrinkAlcohol = (person.age() >= 18 && person.country.equals("UK") || person.age() >= 21 && person.county.equals("US"));

...

if(canDrinkAlcohol) {
   ...
}

什么的

表达式 (i != 0) 的计算结果为布尔值,如果表达式为真(即如果 i 为非零)则为 true,否则为 false

然后将此值分配给 b

如果你更喜欢简洁而不是明确,你会从 b = i; 得到相同的结果,因为从数字类型给出的标准布尔转换 false 表示零,true 表示非零.

或者 b = (i != 0) ? true : false; 如果你喜欢多余的冗长。