ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

计算机基础知识 - 运算符的优先级(位运算符、关系运算符、逻辑运算符等)

2021-07-31 14:01:58  阅读:589  来源: 互联网

标签:操作数 false ++ 基础知识 运算符 println 优先级 true


前言

情况说明:本人目前技术栈是Java这一套,所以这里提及的运算符测试都是在Java语言中的,不能保证在其他语言中也适用

作为一个程序员,你一定遇到过写的代码在你的逻辑里面没有问题,但是一运行就error满天飞。下面来看一个踩坑场景,求取 n 与 2倍m 的和

/**
     * 求取 n 与 2倍m 的和
     * @param n
     * @param m
     * @return
     */
public int sum(int n,int m){
    return n + m << 1;// 错误
    //return n + (m << 1);// 正确
}

如果问题出现在基本的运算符优先级上,那很难找到问题的所在。并且,对于运算符的优先级掌握到位可以间接的节省代码的复杂度。



一、运算符分类

运算符可用于表示数据的运算赋值比较等。Java运算符分为:

  1. 算术运算+,-,*,/,%,++,--
  2. 赋值运算=,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=,>>>=
  3. 位运算符&,|,~,^,<<,>>,>>>
  4. 比较运算符>,>=,<,<=,==
  5. 逻辑运算符&&,&,||,|,!,^
  6. 三目运算符? :


二、运算符的说明

针对于三个操作数的叫做三目运算符(如?:),针对于两个操作数的叫做二目运算符(如 +),针对于一个操作数的叫做单目运算符(如++)。

1.算术运算

+:加法运算符

把运算符左右的两个数值加起来,也可作为字符串的连接运算符:

//1.数值相加
System.out.println(1+2);//put 3
//2.字符串拼接
System.out.println("a"+"b");//put ab

+运算符具有拼接字符串的功能,那么下面这个场景是怎样的:

System.out.println(1+2+"3");//到底是怎么样执行的?

它会先执行1+2=3,它也就等价于3+“3”,此时就是字符串的拼接,输出"33",这里涉及到int类型的3自动装箱为Intger类,之后在转化为String字符串进行拼接。


-:减法运算符

运算符左边减去运算符右边的数值。示例代码:

//2 - 1 == 1
System.out.println(2 - 1);//put 1

*:乘法运算符

运算符左边的数乘以运算符右边的数值。示例代码:

//2 * 3 == 6
System.out.println(2 * 3);//put 6

/:除法运算符

运算符左边除以运算符右边的数值。示例代码:

//4 / 2 == 2
System.out.println(4 / 2);//put 2

当除法运算符左右的数都是整数类型(int和Long)时,计算得到的结果也为整数,此时除数不能为0;如果除法运算符左右的数中至少有一个是浮点数,则计算结果也是浮点数,此时除数可以为0或0.0,得到的结果是无穷大

System.out.println(1.1/0);//Infinity

%:取余(取模)运算符

运算符左边减去运算符右边的数值。示例代码:

//10 % 3 == 1
System.out.println(10 % 1);//put 1

取余运算符得到结果不一定总是整数,如果取余运算符的左右两个数值都是整数,那么取余数(第二个数)不能为0;如果取余运算符左右的数中至少有一个是浮点数,此时第二个数可以为0或0.0,得到的结果是NaN(非数值)。


++/--:自加/自减运算符

++--是单目运算符,只有一个操作数,它们又两种用法,以为++为例:

  1. 一种是放在操作数的左边,表示先把操作数加1;
  2. 另一种是放在操作数的右边,先运算其他语句,再把操作数加一。

概念还是不好理解,看一下示例代码:

//++测试
int n = 1,m = 1;
//++放在操作数左边
System.out.println(++n + 1);//put 2 现在n==2
//++放在操作数右边
System.out.println(m++ + 1);//put 3 现在m==2

++/--运算符对于初学者很容易出错,这里需要结合示例好好了解一下。

++/--只能操作变量,不能操作常量或表达式等。



2.赋值运算符

赋值运算符用于为变量指定变量值。组合的赋值运算符就减少了代码量

  • =:赋值,如int a = 1;
  • += 对于a += b,等价于a = a + b;
  • -= 对于a -= b,等价于a = a - b;
  • *= 对于a *= b,等价于a = a * b;
  • /= 对于a /= b,等价于a = a / b;
  • %= 对于a %= b,等价于a = a % b;
  • &= 对于a &= b,等价于a = a & b;
  • |= 对于a |= b,等价于a = a | b;
  • ^= 对于a ^= b,等价于a = a ^ b;
  • <<= 对于a <<= b,等价于a = a << b;
  • >>= 对于a >>= b,等价于a = a >> b;
  • >>>= 对于a >>>= b,等价于a = a >>> b;


3.位运算符

对于位运算符的详细分析请点击我移步这篇文章

  • &:按位与。当两位同时为1时才返回1。
  • |:按位或。只要有一位为1就返回1。
  • ~:按位非。单目运算符,将操作数的每一位(包括符号位)全部取反。
  • ^:按位异或。当两位不同时返回1,相同时返回0。
  • <<:左移运算符
  • >>:右移运算符
  • >>>:无符号右移运算符


4.比较运算符

比较运算符用于判断两个常量或变量的大小,比较结果是一个布尔值(true或false)。

比较运算符有 >(大于),>=(大于等于),<(小于),<=(小于等于),==(等于)



5.逻辑运算符

逻辑运算符用于操作两个布尔的变量或常量,有如下6个:

  • &&:短路与,两个操作数都为true才返回true,否则返回false。

  • &:不短路与,作用与&&相同,但不会短路。

    这里需要讲解一下 &&& 的区别,两者都是左右都为true才返回true,而&在判断左边为false后会再去判断右边,&&判断左边为false后就直接返回false了,不会再去判断右边。|||也是这一个但道理。

  • ||:短路或,两个操作数只要有一个为true,就返回true,两个操作数都为false才返回false。

  • |:不短路或,作用与||相同,但不会短路。

  • :非, 或取反,如果操作数是true,则返回false。如果是false,则返回true。

  • ^:异或,当两个操作数不同时才返回true,相同返回false。

下面代码示范了逻辑运算符短路与不短路的区别(以&和&&的区别为例):

int n = 1, m = 1;
//不短路与 左边为false还是会判断右边
if (false & n++ > 0) {}
System.out.println(n);//put 2
//短路与 左边为false就短路不在判断右边
if (false && m++ > 0) {}
System.out.println(m);//put 1


6.三目运算符

三目运算符? :,语法格式:(expression) ? if-true-statement : if-false-statement。先判断逻辑表达式expression,为true就返回if-true-statement,为false就返回if-true-statement。示例:

String n = 2 > 1 ? "2大于1" : "2不大于1";
System.out.println(str); //put  "2大于1"


三、运算符的优先级

可以使用括号()指定优先级。在不确定优先级的时候,按照自己指定的代码执行逻辑添加一个()是没有问题的,唯一的缺点就是代码看起来不美观… …

先看一下前辈的口诀:单目乘除位关系,逻辑三目后赋值。运算符号优先级由高到低:

运算符说明Java运算符
分隔符. [] () {} , ;
单目运算符++ – ~ !
强制类型转换运算符(type),如(int)
乘、除、取余* / %
加、减+ -
移位运算符<<(左移) >>(右移) >>>(无符号左移)
关系运算符< <= > >= instanceof
等价运算符==(等) !=(不等)
按位与&
按位异或^
按位或|
条件与&&
条件或||
三目运算符? :
赋值运算符= += -= *= /= &= |= ^= %= <<= >>= >>>=

标签:操作数,false,++,基础知识,运算符,println,优先级,true
来源: https://blog.csdn.net/yeahPeng11/article/details/119274699

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有