[英]Difference between ! and ~ in c#
当我第一次学习如何编写程序时,我使用了C.(非常基本的命令行应用程序)在这两种语言中你都使用了! - 操作员通常喜欢这样:
if(!true){
//false..
}
我想在c#中做一些比特掩码,我想知道'〜'运算符。
现在我有点困惑,因为在我自己的理解! 和〜应该做同样的事情。
这适用于c#:
int i = ~0xffffffff; // i = 0
bool j = !true; // j = false
这不是:(但它确实在c中工作,并且完全符合我的预期)
int i = !0xffffffff; // i = 0
那么〜和之间的差异是什么? 他们为什么把它们分开?
C#决定将整数运算与布尔运算完全分开。 例如, if(x & 4)
你必须做if((x & 4) != 0)
以明确地从整数移动到布尔值。
这正符合了40年的C和它的前辈的经验中,人们常常用它制成的错误,如:荷兰国际集团是具有真值两个值true
和获得false
,因为虽然他们其中两个非零他们没有共同的非零位。
C和C ++都在其历史的后期引入了bool
类型,以在表示数字或位模式的整数与我们只关心真值的值之间添加更明确的差异,但必须与旧代码兼容。 C#拥有更加明确的奢侈品。
考虑到这一点,C#的!
和~
与C完全相同,只是有些东西不再有意义:
在C !
否定真理价值。 它将0(假)变为1(真),并将所有非零(真)变为0(假)。 在C#中只对bool
有意义,而不是int
。
在C ~
产生一个补体; 它产生一个值,其中每1位变为0并且每0位变为1(例如0xFFFFFFFF变为0,0xF0F0F0F0变为0x0F0F0F0F,依此类推)。 在C#中使用int
有意义,但不是bool
。
如果你想在C#中执行相当于!someInteger
,请执行someInteger == 0
。
编辑:
值得注意的是,运算符被分成“按位”('&','|'和'〜')和“boolean”('&&','||'和'!')会导致混乱。 。 这种区别并不完全正确。
现在,最后三个确实只在布尔上下文中有意义,因此C#在布尔值和整数值之间有更严格的分离,它们不再应用于整数。
'〜'确实在布尔上下文中没有意义('~x',其中'x'为真将生成'x'仍为真,4294967295中有4294967294次),因此使用C#它不再适用于bools 。
'&'和'|' 保留一个布尔用途。 在'A()'和'B()'各自返回bool
,然后A() && B()
只调用B()
如果A()
为假(即,它“短路”在执行∧
布尔算术之前,“), A() & B()
将始终调用这两种方法。 这往往很少见,因为:
大多数时候调用B()
只是浪费时间,而短路可以给我们带来性能提升,范围从大规模(如果B()
是昂贵的)到制造 - 没有差异 - 但是我们做了' t-lose-anything-any,所以这是习惯。(但考虑到如果B()
非常便宜,无论如何调用它的成本可能比分支更便宜,特别是如果错误预测,请参阅下面的评论)。
有时&&
是强制性的,例如x != null && x.Length != 0
,其中不短路会在第二个参数上引发异常。
如果确保调用这两个方法非常重要,那么在单独的语句中更好地编写代码,以便向其他开发人员(或者稍后再回来时)自己清楚。
但是如果我们要讨论使用布尔和整数参数的运算符之间的区别,我们应该包括布尔使用的|
和&
,因为它们确实出现了(有时通过拼写错误!),如果人们错误地将“按位运算符”和“布尔运算符”分开并忘记有两个符号同时用作两者,它们会引起混淆。
!
是一个布尔反转,它将一个值从true
反转为false
,反之亦然。 http://msdn.microsoft.com/en-us/library/f2kd6eb2.aspx
~
是按位反转,它反转整数值的每一位,如int i
。 http://msdn.microsoft.com/en-us/library/d2bd4x66.aspx
有关所有运营商的完整指南,请参阅http://msdn.microsoft.com/en-us/library/6a71f45d.aspx 。
之所以!
和~
分开是因为他们做了不同的事情。
~
按位NOT运算符是一元运算符,因为它包含单个操作数。 与其他按位运算符不同,按位版本不使用与类似布尔运算符相同的符号。 为了实现一个补码,波形符(〜)位于要修改的值的左侧。
byte valueToComplement = 187; // 10111011
byte complement = (byte) ~valueToComplement; // Result = 68
!
- 是一个布尔反转,可以是true或false。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.