【发布时间】:2011-07-09 09:04:08
【问题描述】:
这里有一个 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?
操作 x && y 被评估为 T.假(x)? x : T.&(x, y)
到底为什么要这样做?如果 false 重载返回 true 并且 true 运算符返回 true 则根本不计算 y。卧槽!!!!
我还是不明白。因为这对我来说太奇怪了,所以我花了一段时间才理解另一个问题的答案。在 C# 中,v = 1 && 2; 不起作用,因为您不能在整数上执行 &&。在 C 中,这返回 true(此处为代码/示例 http://codepad.org/9iCaqzQ2)。如果我们遵循上面的操作规则,我们会这样做
(使用 1 && 2)
- Int.False(1) 为假
- 1 & 2 (== 0)
- Int.True(0) (== false)
这会让你得到错误的结果。
那么... C# 以这种方式使用 &&(和 ||)运算符的原因是什么。
【问题讨论】:
-
请花一些时间来改进文章。无法理解你想问什么。
-
@archer 这是很自然的事情。如果一种语言与旧语言的做法不同,它通常有这样做的理由。为了与众不同而与众不同通常不是一个好主意。了解某事为何如此运作几乎与了解某事如何运作一样重要。
-
@CodeInChaos:正是 CodeInChaos。我想知道为什么你是唯一一个告诉我为什么事情实际上不同的人,而不是说“不,你做错了”和“你在说什么”-_-。我对每个人都很失望。
-
我是在知道pascal之后才学c的。 Pascal 只有一个
and运算符,它在布尔值上是逻辑(和短路),在整数上是二进制。因此,当切换到 c 时,我遇到了与您相反的问题。为什么 c 没有布尔值并使用两种and来代替?你可以习惯这样的事情,以至于你不再质疑为什么。如果您从&&是短路的定义开始,那么您的问题没有意义,如果您从逻辑 vs 二进制开始。 -
然后是工程师 vs 科学家,“怎么样?” vs“为什么?”。我的价值之一是“为什么?”高得多。如果您知道为什么通常变得微不足道。这样做的另一面是,我很难使用我不太了解的东西。
标签: c#