不起眼但是很要命的Java小细节 -- 短路与和与、短路或和或的区别

发布时间 2024-01-12 16:27:00作者: 即溶咖啡粉

在实际开发时,开发者常常会直接使用短路与,短路或. 一般情况下是不会有问题的,但是在某些场景下,会因为开发者遗忘的短路语法细节导致程序走向不符合预期的流程.

基础语法

&&(短路与)与 &(非短路与)的区别:

  • 最终结果都是一样的
  • &&: 具有短路的效果。左边是false,右边就不执行
  • &: 不具有短路的效果。不管左边啥情况,右边都执行
  int x1 = 3;
  int y1 = 4;
  System.out.println( (++x1 == 3) & (++y1 == 4));  //false & false = false 右侧必须执行
  System.out.println("x1 = " + x1);     //x1 = 4
  System.out.println("y1= " + y1);     //y1 = 5

  int x2 = 3;
  int y2 = 4;
  System.out.println((++x2 == 3) && (++y2 == 4));  //false (&& 右侧不执行) = false
  System.out.println("x2 = " + x2);     //x2 = 4
  System.out.println("y2 = " + y2);     //y2 = 4

||(短路或)与|(非短路或)的区别:

  • 最终的效果都是一样的
  • ||: 具有短路的效果。左边为true,右边不执行
  • |: 不具有短路的效果。不管左边啥情况,右边都执行
  int x1 = 3;
  int y1 = 4;
  System.out.println((++x1 == 4) | (++y1 == 4)); //false & false = false
  System.out.println("x1 = " + x1);     //x1 = 4
  System.out.println("y1= " + y1);     //y1 = 5

  int x2 = 3;
  int y2 = 4;
  System.out.println((++x2 == 4) || (++y2 == 4)); //true (|| 右侧不执行) = true
  System.out.println("x2 = " + x2);     //x2 = 4
  System.out.println("y3 = " + y2);     //y2 = 4

说明: 在应用与、或条件时,一定要关注右侧的表达式是否一定要执行. 如果右侧强制要求一定要执行,则用非短路的逻辑运算符