判断 a 不为 0 并且 1/a 大于 0,有人把 && 写成单个 &,结果 a 为 0 时照样抛除零异常。差别就在短路两个字,编译器不会报错,运行时才炸,这种 bug 最难查。
一个算二进制位,一个算真假
& 是按位与,把两个整数按二进制逐位比较,都为 1 才是 1。6 & 3 的结果是 2,因为 110 和 011 逐位与完是 010。&& 是逻辑与,两边都是布尔值,全为真才返回真。判断奇偶常用 n & 1,比取模快一点,但可读性差;负数做位运算用的是补码,结果可能和直觉不一样。
短路才是实际影响最大的地方
&& 左边为假,右边直接不执行;& 不管左边真假,右边都要算一遍。所以判空要写 obj != null && obj.size() > 0,顺序反了或者用了单个 &,都可能空指针。Java 里 & 也能用于布尔表达式,只是不短路,日常基本不用。这就是为什么判空、判长度这类检查要放在 && 左边,顺序本身就是逻辑的一部分。
命令行里的意思又不一样
Linux 和 Windows 的 cmd 里,命令后面加 & 是放到后台运行,command1 && command2 则是前一条执行成功才执行后一条。这里的 && 跟编程里的逻辑与是两套东西,别拿位运算的思路去理解。写 shell 脚本时,&& 常用来保证前一步成功再执行下一步;命令后面只加一个 &,终端关掉进程可能跟着退,长期跑要用 nohup。
Excel 里的 & 是拼接文本
表格公式里 =A1&B1 表示把两个单元格的内容连起来,没有 && 这种写法。做报表拼姓名和部门经常用到。Excel 里没有逻辑与的符号写法,要判断条件用 AND 函数。同一个符号,在 C、Java、Shell、Excel 里的含义各不相同,看语境判断。
& 的优先级比 && 高,也低于 == 和 !=,混用时加括号最保险。位运算和逻辑运算返回的类型也不一样,别拿整数结果去当条件用。
&和&&的区别,说到底就三句话:布尔判断用 && 图省事还安全,位操作用 &,命令行里的 && 是串命令。写代码时看到单个 &,先想想是不是手滑漏了一个,面试题里常拿它和 ||、| 一起考,道理是一样的。