为什么C#中的1 && 2是假的?

13 c# boolean boolean-operations

我对另一个问题感到沮丧.所以我写了这个例子.

在C中,以下是真实的.见演示

int main()
{
printf("%d", 1 && 2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

1
Run Code Online (Sandbox Code Playgroud)

在C#中.这是假的.为什么这是假的?此外,我不明白为什么我需要在这个例子中创建bool运算符,但不是在我的另一个问题,但无论如何.为什么以下是假的?对我来说完全是无稽之谈.

这里描述使得下面的假的逻辑

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; }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

And*_*rey 22

C不存在bool.公约就是0现在false!= 0将来true.if语句处理条件表达式结果就是这样.

C++ bool介绍中.但是,它与旧规则,兼容0的处理falsefalse作为0,和之间存在着隐式转换intbool.

在C#中是不一样的:有boolint他们是无法转换为海誓山盟.这就是C#标准所说的.期.

因此,当您尝试重新实现boolint兼容性时,您犯了一个错误.你使用&&这是逻辑运算符,但是在C#中你不能覆盖它而只能覆盖&,它是按位实现的.1 & 2 == 0 == false!这里是!

你甚至不应该超载按位的,以保持兼容性,你只需要离开operator truefalse.

此代码按预期工作:

class Programx
{
    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 implicit operator MyInt(int v)
        {
            return new MyInt() { val = v };
        }
        public static implicit operator bool(MyInt t)
        {
            return t.val != 0;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

结果是真的

  • 在 C 语言中,直到 1999 年才**没有 `bool`。 (2认同)

Jol*_*hic 9

您的operator&和operator的实现 错了.当应用于整数类型时,这些二元运算符具有逐位含义,并且当应用于具有自己的&和|的布尔类型或类时 运算符,它们具有逻辑AND和OR语义(是&&和||的非短路表兄弟).正确的实现如下:

operator &(MyInt l, MyInt r) {return l.val != 0 && r.val != 0);}
operator |(MyInt l, MyInt r) {return l.val != 0 || r.val != 0);}
Run Code Online (Sandbox Code Playgroud)

  • @acid &&在任何合理的类型上都不是按位短路的.你的问题的核心是误解了`&`在C#中表示按位`和`.它没有.这意味着非短路`和`. (3认同)
  • @ acidzombie24:恐怕我不明白这个区别是什么意思.&和|,当作为类的用户定义的运算符支持时,执行双重任务,同时支持非短路逻辑(即布尔)&和| 操作和短路逻辑(即布尔)&&和|| 操作.它们不旨在支持按位(即二进制数学)运算. (2认同)