加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-13 19:16:58 所属栏目:Linux 来源:网络整理
导读:假设x是int类型的变量,其值为5,请考虑以下语句: int y = !!x; 这就是我认为它发生的事情:x被隐式地转换为bool并且执行第一个否定,之后进行最后的否定,所以是一个演员和两个否定. 我的问题是,不仅仅是使用bool(执行int y =(bool)x;而不是使用int y = !! x)
假设x是int类型的变量,其值为5,请考虑以下语句:
int y = !!x;

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

我的问题是,不仅仅是使用bool(执行int y =(bool)x;而不是使用int y = !! x)比使用双重否定更快,因为你要保存两个否定执行.

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

解决方法

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

附录:根据C89 draft standard,section 3.3.3.3:

The result of the logical negation operator ! is 0 if the value of its operand compares unequal to 0,1 if the value of its operand compares equal to 0. The result has type int . The expression !E is equivalent to (0==E).

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读