关于C++:整数到布尔奇怪语法

Integer to Boolean strange syntax

本问题已经有最佳答案,请猛点这里访问。

我不到一年的C++开发(专注于其他语言之前),我正在看一个家伙的代码谁已经这样做了二十年。我以前从未见过这种语法,希望有人能帮上忙。

1
2
3
4
5
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)正在发生的事情的各个方面。有人能解释一下为什么这个比我更懂语言的人会这样做吗?


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

然后将该值分配给b

如果你更喜欢简洁而不是明晰的话,你会从b = i;得到同样的结果,因为标准的布尔值转换是从数字类型得到的,这使得false为零,而true为非零。

如果你喜欢无关冗长的话,也可以选择b = (i != 0) ? true : false;


请阅读:http://en.cppreference.com/w/cpp/language/operator_比较

操作员的结果!=是一个布尔。所以这个人说"将i中的值与0进行比较"。如果"i"不等于0,那么"!='返回真。

因此实际上,b中的值是"如果‘i’不是零,则为真"

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


基本上,如果满足条件(i不等于0),b得到值"真"。否则B得到值"假"。


这是相当基本的语法。!=运算符执行"不等于"比较。

您可能会被直接从比较运算符的结果初始化bool的简写所混淆,但语法本身并不深奥。

程序基本上等同于:

1
2
3
4
5
6
7
8
9
bool b;
int i;

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

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

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


(i != 0)是一个计算为truefalse的表达式。因此,根据i的值,b得到true/false的值。


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

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

你也可以做像…

1
2
3
4
5
6
7
boolean canDrinkAlcohol = (person.age() >= 18 && person.country.equals("UK") || person.age() >= 21 && person.county.equals("US"));

...

if(canDrinkAlcohol) {
   ...
}

或者什么