【发布时间】:2011-07-09 09:27:15
【问题描述】:
I got frustated with my other question。所以我写了这个例子。
In C the below is true. See demo
int main()
{
printf("%d", 1 && 2);
return 0;
}
输出:
1
在 C# 中。这是错误的。为什么这是假的? 我也不明白为什么我需要在这个例子中创建 bool 运算符,但不是我的另一个问题中的那个,但没关系。为什么下面是假的?这对我来说毫无意义。
顺便说一句,使以下错误的逻辑描述为here
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
MyInt a=1, b=2;
bool res=a && b;
Console.WriteLine("result is {0}", res);
}
class MyInt
{
public int val;
public static bool operator true(MyInt t) { return t.val != 0; }
public static bool operator false(MyInt t) { return t.val == 0; }
public static MyInt operator &(MyInt l, MyInt r) { return l.val & r.val; }
public static MyInt operator |(MyInt l, MyInt r) { return l.val | r.val; }
public static implicit operator MyInt(int v) { return new MyInt() { val = v }; }
public static implicit operator bool(MyInt t) { return t.val != 0; }
}
}
}
【问题讨论】:
-
如果你想用 C 编写代码,就用 C 编写代码。如果你想用 C++ 编写代码,就用 C++ 编写代码。如果你想在 C# 中编写 C# 代码。但是你不能假设这些语言是可以互换的。如果您的代码按照您正在编写的语言的规则而不是按照其他语言的规则进行编码,您将获得最大的成功。
-
通用约定应该总是胜过其他所有方面 - 如果 1 始终为真,而 0 始终为假,则应该批评一种以不同方式做事的语言。我们这些可怜的人只记得这么多,而且我们会犯错误,所以改变惯例只会增加错误的可能性。
-
@gbjbaanb:确切地说,如果它会改变,至少告诉我们它背后的原因,这样我们就可以利用它改变的原因。这就是我想问的(三遍。几乎没有人知道)。这(原因)就是为什么我喜欢 CodeInChaos 在另一个问题中的回答 stackoverflow.com/questions/5203498/…
-
@gbjbaanb: 如果 & 和 | 对于上面的 MyInt 类,0 保持为假,1 保持为真正如我在下面指定的那样,运算符已正确实现。该语言并没有“以不同的方式做事”,至少不是您似乎暗示的方式。它只使用 & 和 |当操作数不是整数时,作为非短路布尔运算符。
-
@Eric J.:我阅读了泛型、getter、setter、this[T t],以及显式/隐式转换如何工作,因为它不同于 C++ 运算符 T()。但是,我没有研究 for 循环是如何工作的或 '|' 是如何工作的有效,因为每种语言都有它们并且它们都工作相同。然而,我没想到||到现在为止会有所不同,也不会有所不同。它做得很好,让我相信它是一样的。我不认为您建议我应该阅读每种语言的函数调用如何工作? (但我确实知道命名参数,但自从我开始使用的版本以来这是新的)或者赋值运算符?
标签: c# boolean boolean-operations