JAVA_SE基础——11.Java中的运算符

原创 2015年07月08日 14:40:14

在程序设计中,运算符应用得十分广泛,通过运算符可以将两个变量进行任意运算。数学中的“+”、“-”、“*”、“/”运算符同样也适用于Java语言。除了这些算术运算符外,Java中还包含有关系运算符、逻辑运算符、位运算符等,本节将向大家详细介绍这些运算符。


1.算术运算符

在数学运算中最常见的就是加减乘除,被称作四则运算。Java中的算术运算符就是用来处理四则运算的符号,,,

 序号                    运算符               含义

  1               +              加法

  2               -              减法

  3               *              乘法

  4               /              除法(division)

  5               %              模运算(取余运算modulus)

  6               ++             递增运算

  7               --             递减运算

Java的算术运算符分为一元运算符和二元运算符。一元运算符只有一个操作数;二元运算符有两个操作数,运算符位于两个操作数之间。算术运算符的操作数必须是数值类型。

    (补充)a/b 是a除以b,也是b除a。说除以时,前面的数是被除数;说除时,后面的数是被除数。

  (1)一元运算符

  一元运算符有:正(+)、负(-)、自增(++)和自减(--)4个。

  自增和自减运算符只允许用于数值类型的变量,不允许用于表达式中。该运算符既可放在变量之前(如++i),也可放在变量之后(如i++),两者的差别是:如果放在变量之前(如++i),则变量值先加1或减1,然后进行其他相应的操作(主要是赋值操作);如果放在变量之后(如i++),则先进行其他相应的操作,然后再进行变量值加1或减1。

  例如:

  int i=6,j,k,m,n;

  j = +i;    //取原值,即j=6

  k = -i;    //取负值,即k=-6

  m = i++;    //先m=i,再i=i+1,即m=6,i=7

  m = ++i;    //先i=i+1,再m=i,即i=7,m=7

  n = j--;    //先n=j,再j=j-1,即n=6,j=5

  n = --j;    //先j=j-1,再n=j,即j=5,n=5

  在书写时还要注意的是:一元运算符与其前后的操作数之间不允许有空格,否则编译时会出错。

  (2)二元运算符

  二元运算符有:加(+)、减(-)、乘(*)、除(/)、取模(%)。其中+、-、*、/完成加、减、乘、除四则运算,%是求两个操作数相除后的余数。

  %求余操作举例:

  a % b = a - (a / b) * b

  取余运算符既可用于两个操作数都是整数的情况,也可用于两个操作数都是浮点数(或一个操作数是浮点数)的情况。当两个操作数都是浮点数时,例如7.6 % 2.9时,计算结果为:7.6 - 2 * 2.9 = 1.8。

  当两个操作数都是int类型数时,a%b的计算公式为:

  a % b = a - (int)(a / b) * b

  当两个操作数都是long类型(或其他整数类型)数时,a%b的计算公式可以类推。

  当参加二元运算的两个操作数的数据类型不同时,所得结果的数据类型与精度较高(或位数更长)的那种数据类型一致。

  例如:

  7 / 3     //整除,运算结果为2

  7.0 / 3   //除法,运算结果为2.33333,即结果与精度较高的类型一致

  7 % 3     //取余,运算结果为1

  7.0 % 3   //取余,运算结果为1.0

  -7 % 3   //取余,运算结果为-1,即运算结果的符号与左操作数相同

  7 % -3   //取余,运算结果为1,即运算结果的符号与左操作数相同

  注:JAVA运算符的优先级

  运算符的优先级决定了多个运算符在一个表达式中运算的顺序,其中最简单的是乘除的优先级大于加减。而一旦表达式比较复杂时,程序员经常会忘记其他优先级规则,所以应该用括号明确规定计算顺序。

  例:int a = 100 - 12.5 * 3 + 5 / 2 + 2 ;

  这个表达式的顺序如果不加打括号,任何人都会先计算乘除,然后才计算加减。而只要加上括号后,这个表达式就有了个不同的含义。比如:int a = (100 – 12.5) * 3 + 5 / (2 + 2) 。


2.比较运算符

通过关系运算符计算的结果是一个boolean类型值。对于应用关系运算符的表达式,计算机将会判断运算对象之间的通过关系运算符指定的关系是否成立,若成立则表达式的返回值为true,否则为false。 关系运算符包括>(大于)、<(小于)、>=(大于或等于)、<=(小于或等于)、==(等于)和!=(不等于)。其中,等于和不等于运算符适用于引用类型和所有的基本数据类型,而其他的关系运算符只适用于除boolean类型以外的所有基本数据类型。

运算符 运算 范例 结果

== 相当于 4==3 false

!= 不等于 4!=3 true

< 小于 4<3 false

> 大于 4>3 true

<= 小于等于 4<=3 false

>= 大于等于 4>=3 true


比较运算符在使用时需要注意一个问题,不能将比较运算符==误写成赋值运算符=


3.逻辑运算符

与 
0&&0 =0 
1&&0 =0 
0&&1 =0 

1&&1 =1 

或 
0||0 =0 
1||0 =1 
0||1 =1 
1||1 =1 

非  !

!true      结果是:false

!false    结果是:true 


异或
真^假=真 
假^真=真 
假^假=假 
真^真=假


短路与 &&

true&&true 结果是:true

true&&false   结果是:false

false&&false   结果是:false

false&&true   结果是:false

(2边要同时为true 结果就为ture    不管那方有false  结果都为false)


短路或 ||

true||true 结果是:true

true||false 结果是:true

false||false 结果是:false

false||true 结果是:true

(2边有一个为true  结果就为ture)

public class Example06 {
	public static void main(String[] args) {
		int x = 0; // 定义变量x,初始值为0
		int y = 0; // 定义变量y,初始值为0
		int z = 0; // 定义变量z,初始值为0
		boolean a, b; // 定义boolean变量a和b
		a = x > 0 & y++ > 1; // 逻辑运算符&对表达式进行运算
		System.out.println(a);
		System.out.println("y = " + y);
		b = x > 0 && z++ > 1; // 逻辑运算符&&对表达式进行运算
		System.out.println(b);
		System.out.println("z = " + z);
	}
}

运行结果如下:


知道为什么2个都为false  但是结果不同吗?

a = x > 0 & y++ > 1;

因为 &  符号 要前后都运行  前面判断为false  然后继续运行后半部分  y++了  所以最后输出的y为1.

b = x > 0 && z++ > 1;
而上面这段代码使用的是&&  这叫短路与  只判断前面第一个  前部分是true  那结果就是true   前部分是false 那结果就是true   所以x>0  为false  后面的z++没执行  所以z=0



二、位运算符

如:11001010 与

        00011011 进行 与,  或, 以及 异或 运算,

      (与,结果) 00001010 、(或,结果)11011011、(异或,结果)11010001


 异或 俗话可以这样理解:相同为0 不相同为1


三种移位运算符的移动规则和使用如下所示:
  
<<运算规则:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
  语法格式:
  需要移位的数字 << 移位的次数
  例如: 3 << 2,则是将数字3左移2位
  计算过程:
  3 << 2
  首先把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011,然后把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,最后在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100,则转换为十进制是12.数学意义:
  在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
  >>运算规则:按二进制形式把所有的数字向右移动对应巍峨位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1.
  语法格式:
  需要移位的数字 >> 移位的次数
  例如11 >> 2,则是将数字11右移2位
  计算过程:11的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1011,然后把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 0010.转换为十进制是3.数学意义:右移一位相当于除2,右移n位相当于除以2的n次方。

  >>>运算规则:按二进制形式把所有的数字向右移动对应巍峨位数,低位移出(舍弃),高位的空位补零。对于正数来说和带符号右移相同,对于负数来说不同。
  其他结构和>>相似。
  小结
  二进制运算符,包括位运算符和移位运算符,使程序员可以在二进制基础上操作数字,可以更有效的进行运算,并且可以以二进制的形式存储和转换数据,是实现网络协议解析以及加密等算法的基础。

 

    int a=5;
    System.out.println(a<<33);
    按照常理推测,把a左移33位应该将a的所有有效位都移出去了,那剩   下的都是零啊,所以输出结果应该是0才对啊, 可是执行后发现输出结果是10,为什么呢?因为Java语言对位移运算作了优化处理,Java语言对a<<b转化为a<<(b%32) 来处理,所以当要移位的位数b超过32时,实际上移位的位数是b%32的值,那么上面的代码中a<<33相当于a<<1,所以输 出结果是10. 




版权声明:本文为博主原创文章,未经博主允许不得转载。

Python基本语法_运算符详解

目录目录 前言 软件环境 身份运算符is is not 算术运算符 比较运算符 位移运算符 自变运算符 位运算符 逻辑运算符 成员关系运算符 Python真值表 最后前言在前面的博文介绍了Pytho...
  • Jmilk
  • Jmilk
  • 2015年09月22日 23:50
  • 5223

Rookie零基础学java(五)之运算符练习

Rookie零基础学java博客目录(不断更新) 1.算术运算符: 算术运算符是读者最熟悉不过的了,主要用于算术表达式中,比如“+”、“-”、“*”、“/”,它的本节先来介绍算术运算符如何应用...
  • lujinjian605894472
  • lujinjian605894472
  • 2013年01月03日 06:55
  • 2812

Common Lisp入门笔记(一)7个基本运算符

表达式实例: >(+ 1 2) >3 Common Lisp表达式求值规则是: 首先对每个参数从左到右进行求值; 其次将这些已经求值的参数作为运算符函数的参数进行函数调用求值; 所求得的值作为表达式的...
  • zhutulang
  • zhutulang
  • 2016年05月08日 18:13
  • 2658

JAVA_SE基础——41.instanceof关键字(运算符)

instanceof 关键字 instanceof关键字的作用:判断一个对象是否属于指定的类别。 instanceof关键字的使用前提:判断的对象与指定的类别必须要存在继承或者实现的关系。关于...
  • ThesCript_j
  • ThesCript_j
  • 2015年10月10日 21:38
  • 548

JAVA_SE基础——37.main方法的详解

主函数 大家都会写吧。    大家一直都不知道为何这样设计,这样设计有什么好处呢? 白话解释: main函数的修饰符是public: 公共的    为何不用private 等等的修饰符 而规定只用...
  • ThesCript_j
  • ThesCript_j
  • 2015年10月02日 22:16
  • 535

JAVA_SE基础——47.接口

如果一个抽象类中的所有方法都是抽象的,则可以将这个类用另一种方法来定义,即 接口~ 在定义接口时,需要用interface关键字来声明,具体实例如code1 接口的定义格式: interfac...
  • ThesCript_j
  • ThesCript_j
  • 2015年10月26日 22:33
  • 1275

Java SE《基础篇》——(十一)多线程

进程、线程基本概念 进程介绍 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元。在操作系统中每启动一个应用程序就会启动一个进程与之相对应。不同进程之间...
  • qq_15014327
  • qq_15014327
  • 2018年01月13日 18:00
  • 19

Java SE《基础篇》——(五)数组02

上一节我们介绍了一下数组的特性和基本使用。这一课时我们重点在讲解数组的排序、数组查找。我们都知道数组是一种简单的数据结构。它采用连续存储的方式保存数据,那么问题来了? 1. 我们想得到一个有顺序...
  • qq_15014327
  • qq_15014327
  • 2018年01月03日 01:11
  • 30

Java SE《基础篇》——(四)数组01

数组 一维数组 二维数组
  • qq_15014327
  • qq_15014327
  • 2017年12月31日 11:12
  • 54

JAVA_SE基础——72.自定义线程

进程 :  正在执行的程序称作为一个进程。  进程负责了内存空间的划分。   问题: windows号称是多任务的操作系统,那么windows是同时运行多个应用程序吗? 从宏观的角度: wi...
  • ThesCript_j
  • ThesCript_j
  • 2016年11月30日 13:45
  • 183
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA_SE基础——11.Java中的运算符
举报原因:
原因补充:

(最多只允许输入30个字)