很多写代码或者做逻辑规则设计的朋友,都经常被单个&和两个&&搞混,这俩符号看起来只差一个&,实际的作用逻辑、适用场景差距特别大,单&既能用来做按位运算,也能当不短路的逻辑与运算符,双&&是专门用的逻辑短路与,搞清楚一个&和两个&&的区别能少写不少bug,下面就把它们的用法和具体差异讲清楚。
单个&最常用的场景是做按位与运算,就是把两个数字转成二进制之后,每一位对应相乘,同为1的时候结果位才是1,否则就是0,比如数字5的二进制是101,数字3的二进制是011,5&3算出来的结果就是001,转成十进制就是1。另外在很多编程语言里,单&也能用来做逻辑与的判断,但它和双&&最大的不同就是不会短路,也就是说不管左边的表达式是真是假,右边的表达式都会正常执行一遍。
两个&&叫做逻辑短路与运算符,专门用在逻辑判断的场景里,它的执行规则是先看左边的表达式结果,如果左边是假,那右边的表达式根本不会执行,直接返回左边的结果,只有左边是真的时候,才会去跑右边的表达式。比如你写一个判断用户是否登录的逻辑,user.isLogin&&getUserInfo(),要是用户没登录,isLogin是假,那获取用户信息的函数根本不会被调用,既省了性能,又避免了没登录的时候调用接口报错。
聊完各自的用法,一个&和两个&&的区别就非常明显了,主要体现在三个方面:第一是执行逻辑不一样,单&不会短路,左右两边的表达式都会执行,双&&会短路,左边为假就直接结束,不会跑右边。第二是适用场景不一样,单&大多用在按位运算、必须两边都执行的逻辑场景,双&&全用在逻辑判断里。第三是返回结果不一样,按位与运算返回的是数值结果,逻辑与返回的是布尔值或者实际被执行的那个表达式的值,比如1&&2的结果是2,1&2的结果是0。
很多人写逻辑判断的时候不小心把&&写成&,结果本来想短路的结果没短路,比如判断输入框内容的时候写了input&checkFormat(),要是输入框是空的,本来不用校验格式,结果还是执行了校验,还会触发空值的报错。另外在做按位运算的时候误用了双&&,根本得不到想要的二进制计算结果,了解了一个&和两个&&的区别之后,就能避开这些常见的错误,另外不同编程语言里这俩的规则可能有细微差别,但核心的短路逻辑和按位运算逻辑是不变的,用的时候注意区分场景就行。