06 运算符 v1.0

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

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

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

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

    3194 引用 • 8214 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • OneNote
    1 引用 • 3 回帖
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 644 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 391 关注
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 168 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    335 引用 • 324 回帖
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 545 关注
  • 正则表达式

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

    31 引用 • 94 回帖 • 1 关注
  • jQuery

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

    63 引用 • 134 回帖 • 731 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    31 引用 • 108 回帖 • 1 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 488 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 702 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    226 引用 • 476 回帖
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    167 引用 • 595 回帖 • 1 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    124 引用 • 74 回帖 • 1 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 618 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    93 引用 • 901 回帖
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 503 关注
  • 人工智能

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

    159 引用 • 298 回帖
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    693 引用 • 537 回帖
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖 • 2 关注
  • InfluxDB

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

    2 引用 • 87 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 489 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 249 关注
  • 国际化

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

    8 引用 • 26 回帖 • 1 关注