06 运算符 v1.0

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

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 - 博客园

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

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

    3201 引用 • 8216 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • RemNote
    2 引用 • 16 回帖 • 13 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 549 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 1 关注
  • Openfire

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

    6 引用 • 7 回帖 • 107 关注
  • OnlyOffice
    4 引用 • 22 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    89 引用 • 1251 回帖 • 406 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 123 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 740 关注
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    108 引用 • 295 回帖
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 160 关注
  • Excel
    31 引用 • 28 回帖 • 2 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    8 引用 • 26 回帖 • 4 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖 • 1 关注
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖 • 2 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 84 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 786 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 117 关注
  • WebSocket

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

    48 引用 • 206 回帖 • 289 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 585 回帖
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 734 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖
  • Swift

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

    36 引用 • 37 回帖 • 547 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 636 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    22 引用 • 148 回帖 • 16 关注
  • OneDrive
    2 引用 • 1 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    21 引用 • 245 回帖 • 227 关注