gpt4 book ai didi

c# - 之间的区别!和 ~ 在 C# 中

转载 作者:IT王子 更新时间:2023-10-29 04:23:03 25 4
gpt4 key购买 nike

当我第一次学习如何编写程序时,我使用了 C。(非常基本的命令行应用程序)
在两种语言中,您都使用 ! - 运算符(operator)通常是这样的:

    if(!true){
//false..
}

我想在 c# 中做一些位屏蔽,我想知道 '~' 运算符。

现在我有点困惑,因为以我自己的理解!和 ~ 应该做同样的事情。

这适用于 C#:
int i = ~0xffffffff; // i = 0
bool j = !true; // j = false

这不是:(但它确实在 c 中工作并且完全符合我的预期)
int i = !0xffffffff; // i = 0

那么 ~ 和 ! 之间的区别是什么?为什么他们把他们分开?

最佳答案

C# 决定将整数运算与 bool 运算完全分开。例如你不能做 if(x & 4)你必须做if((x & 4) != 0)显式地从整数转移到 bool 值。

这与超过 4 年的 C 及其前辈的经验一致,在这些经验中人们经常犯错误,例如 &ing 两个真值为 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 .

如果你想做等价于!someInteger在 C# 中,做 someInteger == 0 .

编辑:

值得注意的是,有时将运算符拆分为“按位”('&'、'|' 和 '~')和“ bool 值”('&&'、'||' 和 '!')会引起一些困惑.这种区分并不完全正确。

现在,最后三个确实只在 bool 上下文中有意义,因此 C# 在 bool 值和整数值之间有更严格的分离,它们不再应用于整数。

'~' 在 bool 上下文中确实没有意义('~x',其中 'x' 为真将产生一个仍然为真的 'x',4294967295 次中有 4294967294 次),因此对于 C#,它不再适用于 bool 值.

'&' 和 '|'保留 bool 用途。如果 'A()' 和 'B()' 分别返回 bool ,然后同时 A() && B()只会调用 B()如果 A()为假(即“短路”),A() & B()在执行 之前,将始终调用这两种方法 bool 运算。这往往很少见,因为:

  • 大部分时间调用 B()只是浪费时间,短路可以给我们带来性能提升,范围从大规模(如果 B() 很贵)到无差别但无论如何我们都没有失去任何东西,所以这是习惯。(但请考虑,如果 B() 非常便宜,无论如何调用它的成本可能比分支便宜,特别是如果预测错误,请参阅下面的评论)。
  • 有时 &&是强制性的,例如 x != null && x.Length != 0其中不短路会在第二个参数上引发异常。
  • 如果确保调用这两种方法很重要,那么最好在单独的语句中进行编码,以便其他开发人员(或您稍后回来时自己)清楚这一点。

  • 但是,如果我们要讨论带有 bool 参数和整数参数的运算符之间的区别,我们应该包括 | 的 bool 用法。和 & ,因为它们确实出现了(有时是拼写错误!),如果人们错误地将“按位运算符”和“ bool 运算符”分开并忘记有两个符号同时用作两者,它们会引起混淆。

    关于c# - 之间的区别!和 ~ 在 C# 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21134166/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com