c#中(&&,)与(&,)的区别和共同点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#中(&&,)与(&,)的区别和共同点相关的知识,希望对你有一定的参考价值。

今天看C#,看到运算符部分,有个问题不明白,请教高手回答一下,谢谢!
(&&,||)与(&,|),书上说前者于后者的计算结果不同,只是性能上有差别,可是后来又说(&,|)是位运算,(&&,||)不是逻辑运算吗?这两种说法是不是矛盾了?
(&&,||)与(&,|),书上说前者于后者的计算结果相同,而不是不同,写错了,不好意思

&&是布尔与运算,那么5&&2应该是真,因为非零即真,两真相与结果应该为真;
&是位与运算,那么5&2应该是假,因为5=101,而2=010,按位与,结果应该为000,即假。这样该怎么理解呢?(二者结果相同,只是性能不同)

之所以说相同,是针对他们各自的运算对象来说的。
对于(&&,||),运算的对象是逻辑值,也就是True/False
运算结果只有下列四种情况。
True && True = True
True && False = False
False && True = False
False && False = False

True || True = True
True || False = True
False || True = True
False || False = False

对于(&,|),运算的对象是位,也就是1/0
运算结果只有下列四种情况。
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0

1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0

&&和&对于他们各自的运算对象来说,结果是一样的。
同理,||和|也是一样的。

你说到的
5&&2
的运算结果,是这样对待的。
首先5,非零,即为True
2,非零,True
True&&True = True
结果即为True。整个的运算过程是需要做变换的。并不是直接使用操作数的二进制直接比较。所以结果是不同的。在比较的时候,True应该会被转成类似11111111这样的二进制的值,False可能会转成00000000。

这里的一样,说的是针对运算对象。
&&的运算对象是True/False 不管你使用的是什么类型的表达式,他首先要转换为True/False中的一个,然后才参与运算。
&的运算对象就是0/1,不需要转换,有多少位直接计算多少位就可以了。
参考技术A

&&和||是用于条件判断,而&和|是位运算。

· 【&】

//相当于二进制减法;

//计算原理:数值转成二进制 > 二进制相减(遇0为0) > 再将二进制计算结果转成数值;

(1&1) = (0001 - 0001 = 0001) = 1

(1&2) = (0001 - 0010 = 0000) = 0

(2&2) = (0010 - 0010 = 0010) = 2

(7&5) = (0111 - 0101 = 0101) = 5

(7&8) = (0111 - 1000 = 0000) = 0

(8&4) = (1000 - 0100 = 0000) = 0

//如:true = 0001, false = 0000

(true|false) = (0001 - 0000 = 0000) = false

(true|true) = (0001 - 0001 = 0001) = true

(false|false) = (0000 - 0000 = 0000) = false

· 【|】

//相当于二进制加法;

//计算原理:数值转成二进制 > 二进制相减(遇1为1) > 再将二进制计算结果转成数值;

(1|1) = (0001 + 0001 = 0001) = 1

(1|2) = (0001 + 0010 = 0011) = 3

(2|2) = (0010 + 0010 = 0010) = 2

(7|5) = (0111 + 0101 = 0111) = 7

(7|8) = (0111 + 1000 = 1111) = 15

(8|4) = (1000 + 0100 = 1100) = 12

//如:true = 0001, false = 0000

(true|false) = (0001 + 0000 = 0001) = true

(true|true) = (0001 + 0001 = 0001) = true

(false|false) = (0000 + 0000 = 0000) = false

· 【&&】

//条件与

//其中一方为false则返回false

//左右两方同时为true则返回true

(true&&false) = false

(true&&true  ) = true

(false&&false) = false

· 【||】

//条件或

//其中一方为true则返回true

//左右两方同时为false则返回false

(true || false) = true

(true || true  ) = true

(false || false) = false

转载自

参考技术B 逻辑运算的时候应该是性能上的区分,结果是一样的。
&& 运算时 比如 (表达式1)&&(表达式2)时 只要第一个表达式是false则它不会再去确认第二个表达式的结果。
& 则是两个表达式都计算出结果然后才能确定最终的结果。
||和|也是同样的道理。
参考技术C & ,| , 叫“短路符”
& 与 && 的区别, () && ()它会计算 两边的值,
而 & 它先是计算左边的值, 如果左边的值为真, 则在计算右边表达式的值, 如果 左边的值为假, 则直接返回 False ,不会在计算右边的值 了, 所以有时会有出乎意料的结果。
这也是 “短路符“的名字意思,即短路。
参考技术D &&是且的意思,a&&b 两者都为真才为真.
||是或的意思,a||b 两者有一为真即真.

&,|是位运算符.即对位进行运算,

如00000011 & 00000001=00000001

00000011 | 00000001=00000011

Java与C# 简单异同

Java和C#都是编程的语言,它们是两个不同方向的两种语言

相同点:

他们都是面向对象的语言,也就是说,它们都能实现面向对象的思想(封装,继承,多态)

区别:

1.c#中的命名空间是namespace类似于Java中的package(包),在Java中导入包用import而c#中用using。
2.c#和Java都是从main函数入口的,但是c#中的main函数的首字母必须大写,它有四种写法如下:
static void Main(string args[]){}
static int Main(string args[]){}
static void Main(){}
static void Main(){}
而Java中只有一种形式:static void main(String [] args){}
3.数据类型:Java跟c#基本都差不多,但是Java的String类型的首字母必须大写,而c#中可以小写也可以大写,还有布尔型,Java中是boolean,c#中是bool。
4.变量的命名:Java中可以用$符号,而c#中不可以使用。
5.注释:Java比c#少一种"///"的文档注释。
6.输出:c#有三种方式输出:Cosole.WriteLine(); Cosole.WriteLine(要输出的值); Cosole.WriteLine("格式字符串",变量列表); 前两种的用法与Java中的ystem.out.println()方法的用法相同,第三种方式是根据占位符输出的,比Java更方便了。
7.控制流语句:c#跟Java类似,还有c#中的switch如果case后面有内容必须要有break;Java可以没有break;
8.数组:两种语言的声明都是用new关键字的。都可以在创建数组的同时初始化如:int a[]={1,2,3,5,5};但是c#比Java多两种初始化如:int a[]=new int[3]{1,2,3}; int a[]=new int[]{1,2,3};
9.方法中传递的参数:两种语言都使用值传递与引用传递。
C#的引用传递的关键字是ref与out,ref侧重于修改,out侧重于输出。而Java中都以传值方式;
10.访问修饰符:C#中的访问修饰符与Java中的基本对应,但多出了一个internal。简而言之,C#有5种类型的可访问性,如下所示:
public:成员可以从任何代码访问。protected:成员只能从派生类访问。
internal:成员只能从同一程序集的内部访问。
protected:成员只能从同一程序集内的派生类访问。
private:成员只能在当前类的内部访问。
11.由于C#中不存在final关键词,如果想要某个类不再被派生,你可以使用sealed关键词密封。
12.集合:两种语言都有集合ArrayList,还有通过键访问值的Java中是HashMap而c#中是HashTable。c#比Java多泛型集合List<T>与Dictionary<K,V>更容易了,无需拆箱装箱了,更安全了。
13.继承:Java中用关键字extends,c#只用":"就行了.调用父类的构造方法Java用super关键字,而c#用base关键字。
14.多态:抽象类和抽象方法两种语言都用abstract关键字。Java中另外一个类如果继承了它,实现直接重写此方法就可以了;而c#必须加上关键字override实现。C#还比Java多一种虚方法来实现多态。
15.接口:都用关键字interface定义,Java实现用关键字implements;c#用":"实现。在C#中,接口内的所有方法默认都是公用方法。在Java中,方法声明可以带有public修饰符(即使这并非必要),但在C#中,显式为接口的方法指定public修饰符是非法的。
16.C#中的is操作符与Java中的instanceof操作符一样,两者都可以用来测试某个对象的实例是否属于特定的类型。在Java中没有与C#中的as操作符等价的操作符。as操作符与is操作符非常相似,但它更富有"进取心":如果类型正确的话,as操作符会尝试把被测试的对象引用转换成目标类型;否则,它把变量引用设置成null。
17.结构(Struct)与类很相似,而结构是一种值类型,它存储在栈中或者是嵌入式的,结构可以实现接口,可以象类一样拥有成员,但结构不支持继承。
18.c#保留了指针。Unsafe。(C#使用指针不安全,最后这条有待考证)

出处:


https://www.cnblogs.com/xfweb/archive/2020/06/08/13067795.html


以上是关于c#中(&&,)与(&,)的区别和共同点的主要内容,如果未能解决你的问题,请参考以下文章

c语言和c++和c#的区别

C#中virtual和abstract的区别

C#中virtual和abstract的区别

JAVA与C#的区别

hibernate中JTA、JPA和Plain JDBC的区别

Hibernate和MyBatis的相同点和区别!