06 运算符 v1.0

本贴最后更新于 2719 天前,其中的信息可能已经时过境迁

1.表达式:

表达式就是符号(如加号、减号)与操作数(如 b,3 等)的组合

运算符按照其要求的操作数数目来分,可以有单目运算符双目运算符和三目运算符,它们分别对应于 1 个、2 个、3 个操作数。

单目:+(取正)-(取负) ++(自增) - -(自减)

双目:+ - * / %(取余)

三目:a>b?true:false 说明:当 a 大于 b 的时候,为 true(也就是冒号之前的值),否则为 false;

运算符按其功能来分,有算术运算符赋值运算符关系运算符逻辑运算符位运算符和其他运算符。

2.赋值运算符 = //特别要注意的是,不是表示等于,表示等于用==

变量名 = 表达式; //将右边的值给左边的变量

3.算术运算符 +,-,*,/,%

int int1 = 99;

int int2 = 25;

prt.println("int1 + int2 = " + (int1 + int2));

prt.println("int1 - int2 = " + (int1 - int2));

prt.println("int1 * int2 = " + (int1 * int2));

prt.println("int1 / int2 = " + (int1 / int2));

prt.println("int1 % int2 = " + (int1 % int2));

4.关系运算符 >, < ,>=,<=,==,!=

// 关系运算符

int a = 50;

int b = 60;

prt.println("a = " + a);

prt.println("b = " + b);

prt.println("a > b : " + (a > b));

prt.println("a >= b : " + (a >= b));

prt.println("a == b : " + (a == b));

prt.println("a != b : " + (a != b));

prt.println("a < b : " + (a < b));

prt.println("a <= b : " + (a <= b));

5.逻辑运算符 &&,||,!

// 逻辑运算

boolean bn1 = true;

boolean bn2 = false;

prt.println("bn1 && bn2 :" + (bn1 && bn2));

prt.println("bn1 || bn2 :" + (bn1 || bn2));

prt.println("!bn1 :" + !bn1);

逻辑运算符用于连接布尔型表达式,

在 Java 中不可以写成 33 && x<6 。

短路逻辑运算符

当使用与逻辑运算符时,在两个操作数都为 true 时,结果才为 true,但是当得到第一个操作为 false 时,其结果就必定是 false,这时候就不会再判断第二个操作了。

当使用或逻辑运算符时,两个操作数,当第一个已经是 true 时,就不会再判断第二个了。

6.三目运算符 ?:

// 三目运算符

int i = 5, j = 9;

int result = i > j ? i : j; // ?号前面的表达式为真取 i,否则取 j

prt.println("result : " + result);

这整个运算符包括一个关系运算符(可以是“>”"<""!="等等),一个“?”,一个“:”,冒号前后需要有两个表达式或者是值或者是对象。

7.字符串连接符 + 用于拼接字符串

//String

String address1 = "Anhui";

String address2 = "Hefei";

int code = 5;

String ret = address1 +" "+ address2 +" "+ code+" 号";

prt.println("ret :" + ret);

8.数据类型转换操作符 () 用于转换数据类型

//类型转换

int num = 1000;

short shot;

shot = (short) num;

prt.println("shot : " + shot);

9.递增递减运算符 ++, --

//递增递减运算符

int age = 6;

prt.println("age = " + age);

age++; //先使用后 ++

prt.println("age++: " + age);

age--; //先使用再递减

prt.println("age--: " + age);

++age; //先自增再使用

prt.println("++age: " + age);

--age; //先递减再使用

prt.println("--age: " + age);

10.逗号操作符

11.扩展赋值运算符 +=,-=,/=,*=,%=

//int1 +=int2;

prt.println("--------------------------------");

prt.println("int1 +=int2 :" + (int1 +=int2));

prt.println("int1 -=int2 :" + (int1 -=int2));

prt.println("int1 *=int2 :" + (int1 *=int2));

prt.println("int1 /=int2 :" + (int1 /=int2));

prt.println("int1 %=int2 :" + (int1 %=int2));

a+=b 等价于 a=a+b

12.位操作符/移位操作符

Java 定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。

位运算符作用在所有的位上,并且按位运算。假设 a = 60,b = 13;它们的二进制格式表示将如下:

A = 0011 1100 B = 0000 1101 ----------------- A&b = 0000 1100 A|B = 0011 1101 A^B = 0011 0001 ~A = 1100 0011

| 操作符 | 描述 | 例子 |
| & | 如果相对应位都是 1,则结果为 1,否则为 0 | (A&B),得到 12,即 0000 1100 |
| | | 如果相对应位都是 0,则结果为 0,否则为 1 | (A | B)得到 61,即 0011 1101 |
| ^ | 如果相对应位值相同,则结果为 0,否则为 1 | (A ^ B)得到 49,即 0011 0001 |
| 〜 | 按位补运算符翻转操作数的每一位,即 0 变成 1,1 变成 0。 | (〜A)得到-61,即 1100 0011 |
| << | 按位左移运算符。左操作数按位左移右操作数指定的位数。 | A << 2 得到 240,即 1111 0000 |
| >> | 按位右移运算符。左操作数按位右移右操作数指定的位数。 | A >> 2 得到 15 即 1111 |
| >>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | A>>>2 得到 15 即 0000 1111 |

  >> :若符号位为正,则在最高位插入 0;若符号位为负,则在最高位插入 1

  >>> :无论正负,都在最高位插入 0

14.基本数据类型和和其对应的引用类型的包装类

int ---- Integer

char ---- Character

byte ---- Byte

short ---- Short

long ---- Long

float ---- Float

double ---- Double

boolean ---- Boolean

规律总结:

A.除了 int 和 char 外,基本类型的首字母大写就是其对应的引用类型的包装类;

B.基本数据类型和其包装类之间,可以自动实现装箱和拆箱操作;

15.数据类型之间的转换,比如:String 类型和 Integer 类型之间的转换思路:

A.可以先查看 String 类有没有提供转换为目标类型的方法,有则使用;

B.String 类型若没有,检查目标类型有没有提供从 String 类型转换为自己的类型!

16.Java 运算符优先级:

| 序列号 | 符号 | 名称 | 结合性(与操作数) | 目数 | 说明 |
| 1 | . | 点 | 从左到右 | 双目 |
|
| ( ) | 圆括号 | 从左到右 |
|
|
| [ ] | 方括号 | 从左到右 |
|
|
| 2 | + | 正号 | 从右到左 | 单目 |
|
| - | 负号 | 从右到左 | 单目 |
|
| ++ | 自增 | 从右到左 | 单目 | 前缀增,后缀增 |
| - - | 自减 | 从右到左 | 前缀减,后缀减 |
| ~ | 按位非 | 从右到左 | 单目 |
|
| ! | 逻辑非 | 从右到左 | 单目 | “!”不可以与“=”联用 |
| 3 | * | 乘 | 从左到右 | 双目 |
|
| / | 除 | 从左到右 | 双目 | 整数除法:取商的整数部分,小数部分去掉,不四舍五入 |
| % | 取余 | 从左到右 | 双目 |
|
| 4 | + | 加 | 从左到右 | 双目 |
|
| - | 减 | 从左到右 | 双目 |
|
| 5 | << | 左移位运算符 | 从左到右 | 双目 |
|
| >> | 带符号右移位运算符 | 从左到右 | 双目 |
|
| >>> | 无符号右移 | 从左到右 | 双目 |
|
| 6 | < | 小于 | 从左到右 | 双目 | |
| <= | 小于或等于 | 从左到右 | 双目 |
|
| > | 大于 | 从左到右 | 双目 |
|
| >= | 大于或等于 | 从左到右 | 双目 |
|
| instanceof | 确定某对象是否属于指定的类 | 从左到右 | 双目 |
|
| 7 | == | 等于 | 从左到右 | 双目 | |
| != | 不等于 | 从左到右 | 双目 |
|
| 8 | & | 按位与 | 从左到右 | 双目 |
|
| 9 | | | 按位或 | 从左到右 | 双目 |
|
| 10 | ^ | 按位异或 | 从左到右 | 双目 |
|
| 11 | && | 短路与 | 从左到右 | 双目 |
|
| 12 | || | 短路或 | 从左到右 | 双目 |
|
| 13 | ? : | 条件运算符 | 从右到左 | 三目 |
|
| 14 | = | 赋值运算符 | 从右到左 | 双目 |
|
| += | 混合赋值运算符 |
|
| -= |
|
| *= |
|
| /= |
|
| %= |
|
| &= |
|
| |= |
|
| ^= |
|
| <<= |
|
| >>= |
|
| >>>= |
|

其他知识:

一. 机器数和真值

在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.

1、机器数

一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为 0, 负数为 1.

比如,十进制中的数 +3 ,计算机字长为 8 位,转换成二进制就是 00000011。如果是 -3 ,就是 10000011 。

那么,这里的 00000011 和 10000011 就是机器数。

2、真值

因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位 1 代表负,其真正数值是 -3 而不是形式值 131(10000011 转换成十进制等于 131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。

例:0000 0001 的真值 = +000 0001 = +1,1000 0001 的真值 = –000 0001 = –1

二. 原码, 反码, 补码的基础概念和计算方法.

在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式.

1. 原码

原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是 8 位二进制:

[+1]原 = 0000 0001

[-1]原 = 1000 0001

第一位是符号位. 因为第一位是符号位, 所以 8 位二进制数的取值范围就是:

[1111 1111 , 0111 1111]

[-127 , 127]

原码是人脑最容易理解和计算的表示方式.

2. 反码

反码的表示方法是:

正数的反码是其本身

负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.

[+1] = [00000001]原 = [00000001]反

[-1] = [10000001]原 = [11111110]反

可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.

3. 补码

补码的表示方法是:

正数的补码就是其本身

负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后 +1. (即在反码的基础上 +1)

[+1] = [00000001]原 = [00000001]反 = [00000001]补

[-1] = [10000001]原 = [11111110]反 = [11111111]补

对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.

参考链接:

Java运算符优先级 - zero516cn - 博客园

  • 开发
    38 引用 • 159 回帖 • 2 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3190 引用 • 8214 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 161 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖 • 1 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1348 回帖
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 16 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖 • 1 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 319 关注
  • 音乐

    你听到信仰的声音了么?

    61 引用 • 511 回帖
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 672 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    313 引用 • 547 回帖
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    186 引用 • 318 回帖 • 281 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 559 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 14 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    55 引用 • 85 回帖 • 1 关注
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖 • 2 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    52 引用 • 190 回帖 • 1 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    135 引用 • 190 回帖
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖 • 3 关注
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 370 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 76 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 6 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    288 引用 • 4485 回帖 • 664 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 584 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 4 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    36 引用 • 37 回帖 • 535 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 101 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖 • 1 关注