c# - 为什么 C# && 和 ||运算符(operator)按照他们的方式工作?

标签 c#

这是一个 tl;dr

我有 C++ 背景。 && 假设检查左侧是否为真,右侧是否为真。这与 & 有什么关系?为什么在 && 逻辑中使用它?


我听不懂http://msdn.microsoft.com/en-us/library/aa691312%28v=vs.71%29.aspx并问了一个问题。我花了很长时间才理解并接受这个答案。我不得不做很多跟进阅读 How does operator overloading of true and false work?

The operation x && y is evaluated as T.false(x) ? x : T.&(x, y)

它到底为什么要这样做?如果 false 重载返回 true 并且 true 运算符返回 true 则根本不会评估 y 。 WTF!!!!

我还是不明白。因为这对我来说太奇怪了,所以我花了一段时间才理解另一个问题的答案。在 C# 中,v = 1 && 2; 不起作用,因为您不能对整数执行 &&。在 C 中,这返回 true(这里是代码/示例 http://codepad.org/9iCaqzQ2)。如果我们按照上面的操作规则,我们会这样做

(使用 1 && 2)

  • Int.False(1) 为假
  • 1 & 2 (== 0)
  • Int.True(0) (== false)

这会给您带来错误的结果。

那么... C# 以其方式执行 &&(和 ||)运算符的原因是什么。

最佳答案

&& 被定义为短路运算符;如果第一个操作数的计算结果为假,则要求在那里短路并且不计算右侧。您期望它还能做什么?这允许像 if(arg != null && arg.Foo) {...} 等检查

你的问题基本上是说“如果我写了一个不正确的真/假运算符实现,就会发生坏事”......所以;不要那样做!要么根本不写真/假运算符,要么你写;做对...

还有&|短路

关于c# - 为什么 C# && 和 ||运算符(operator)按照他们的方式工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5203498/

相关文章:

c# - 在XAML的窗口内显示页面

C# 联锁交换

c# - 如何从另一个项目的appsettings文件读取连接字符串

c# - GetSystemInfo() 为最大应用程序地址返回不同的值

c# - 使用 Specflow.Assist .Dynamic 访问具有特殊字符的属性

c# - XNA(C#) 中的 Vector2.Transform() 和 Vector2.TransformNormal() 有什么区别

c# - 从 SQL Server 中检索所有值作为字符串

c# - 在单个程序集 C# 中拥有多个命名空间是好的还是坏的编码实践?

C# 和 PHP 使用相同的代码逻辑显示两个不同的计算结果

c# - Visual Studio 2019 和 AWS : "not a supported code page" when doing a . NET Core 2.1 项目