为什么linux内核使用双逻辑否定而不是强制转换为bools?

Gar*_*ain 8 c casting negation

鉴于这x是一个int以数字5作为其值的类型变量,请考虑以下语句:

int y = !!x;
Run Code Online (Sandbox Code Playgroud)

这就是我认为它发生的事情:x隐式地转换为a bool并且执行第一个否定,之后进行最后的否定,所以一个演员和两个否定.

我的问题是,不仅仅是使用bool(执行int y = (bool)x;代替int y = !!x)而不是使用双重否定,因为你正在执行两个否定.

我可能错了,因为我在Linux内核中看到了很多双重否定,但我不明白我的直觉出错了,也许你可以帮助我.

jwd*_*hue 11

Linux首次编写时没有bool类型.C语言将布尔表达式中不为零的所有内容视为真.所以7,-2和0xFF都是"真".没有bool类型可以转换为.双重否定技巧确保结果为零或编译器编写者选择在布尔表达式中表示为真的任何位模式.当您调试代码并查看内存和寄存器值时,当它们都具有相同的位模式时,更容易识别真值.

附录:根据C89标准草案,第3.3.3.3节:

逻辑否定运算符的结果!如果其操作数的值比较不等于0则为0;如果其操作数的值比较等于0则为1.结果的类型为int.表达式!E等价于(0 == E).

因此,虽然在Linux OS的早期阶段没有布尔类型,但是双重否定会产生0或1(感谢Gox指出这一点),这取决于表达式的真实性.换句话说,在INT_MIN..-1和的范围内的任何位模式1..INT_MAX将产生1并且零位模式是不言自明的.