赵雅智_java运算符与表达式

原创 2012年03月28日 21:41:53
  • 运算符

运算符:用于标记对数据执行某种运算的特定符号 。

操作数:参加运算的数据称为运算对象(操作数)。

分类

按运算符的功能 :算术运算符、关系运算符、逻辑运算符、位运算符等。

按参与运算的操作数的个数:单目运算符、双目运算符、三目运算符。

  • 算数运算符:
  1. 单目运算符:+(1.计算 2.连接两个字符串)、—、*、/、%(1.整数取模 2.小数取-->模判断奇偶)
  2. 双目运算符:+、-、++、--(++(--)运算符的操作数必须是变量)
  3. char类型的数据可以进行算术运算,
  4. boolean类型的数据不能进行算术运算。

自增自减运算符的使用

public class Testlncrement
{
	public static void main(String[] args)
	{
		int i = 9;
		int j;
		j = ++i;            //等价于 i=i+1;j=i;
		System.out.println("i=" + i + "\tj=" + j);
		j = i++;            //等价于 j=i;i=i+1;
		System.out.println("i=" + i + "\tj=" + j);
	}
}

输出结果:i=10,j=10;i=11,j=10

  • 关系运算符

<、<=、>、>=、==、!=

判断两个操作数的等价性和大小关系,得到的结果为布尔类型。常用于逻辑判断(if或循环)。

关系运算符的使用

public class TestComparison
{
	public static void main(String[],args)
	int a = 4;
	int b = 6;
	if(a == b)
		System.out.println("a 等于 b");
	if(a != b)
		System.out.println("a 不等于 b");
	if(a > b)
		System.out.println("a 大于 b");
	if(a < b)
		System.out.println("a 小于 b");
	if(a >= b)
		System.out.println("a 大于等于 b");
	if(a <= b)
		System.out.println("a 小于等于 b");
}


输出结果:a不等于b,a小于b,a小于等于b。

  • 逻辑运算符

&、|、!、^(抑或,不同真相同假)、[&&、||提高效率]

a b ! a a & b a | b a ^ b a && b a || b
true true false true true false true true
true false false false true true false true
false true true false true true false true
false false true false false false false false

逻辑运算符的使用。

public class TestBooleanOperator
{
	public static void main(String[] args)
	{
		boolean b1,b2;
	b2 = false;
	b1 = ! b2;
	System.out.println("逻辑值:b1=" + b1 + ",b2=" + b2);
	System.out.println("逻辑与:b1 & b2=" + (b1 & b2);
	System.out.println("逻辑或:b1 | b2=" + (b1 | b2);
	System.out.println("逻辑抑或:b1 ^ b2=" + (b1 ^ b2)");

	int x=3,y=9;
	b1 = x > y && x ++ == y --;
	System.out.println("短路与的结果:" + b1 + ",x = "+ x +",y=" + y);

	x=3;
	y=9;
	b2 = x > y & x ++ == y --;
	System.out.println("逻辑与的结果:" + b1 + ",x = "+ x +",y=" + y);
	}
}


输出结果:

逻辑值:b1=true,b2=false;

逻辑与:b1&b2=false;

逻辑或:b1|b2=true

逻辑抑或:b1^b2=true

短路与的结果:false,x=3,y=9

逻辑与的结果:false,x=4,y=8

  • 位运算符

&、|、^、>>、<<、>>>、~

位运算符用来对整型(byte、short、int、long)或字符型(char)数据二进制位进行操作,结果为一个整数。

负数:将绝对值取反+1

15: 00000000 00000000 00000000 00001111

-15:11111111 11111111 11111111 11110001

~ (按位取反) :将操作数a中的二进制位由1变0,由0变1。

& (按位相与) :两个操作数的相应位都为1,则该位为1,否则为0。

>> (按位右移) :将a右移b位,右端的低位被舍弃,左端高位补原来的符号位。

<< (按位左移) :将a左移b位,右端的低位补0,左端的高位被舍弃。

>>>(无符号右移):将a右移b位,右端的低位被舍弃,左端的高位补0。

注意:移位运算时真正的移位位数不一定是指定的b位。

当a为int型(或byte、short、char型)时,系统会先将b对32取模,得到的结果才是真正移位的位数

而当a为long型时,系统先将b对64取模,得到的结果作为真正的移位位数。

public class TestBitwiseOPerator
{
	public static void main(String[] args)
	{
		int a = 9 & 12;               	9:1001
		int b = 9 | 12;		        12:1100	
		int c = 9 ^ 12;			&:1000   8	
		int d = ~12;			|:1101   13
		System.out.print("9 & 12 =" + a);	^:0101   5
		System.out.print("9 & 12 =" + b);	~:1100  
		System.out.print("9 & 12 =" + c);	   0011
		System.out.print("9 & 12 =" + d);	   0010
	}					   1101   -13
}

输出结果:9 & 12 = 8,9 | 12 = 13,9 ^ 12 = 5,~ 12 = -13

public class TestMask
{
	public int getOneBit(int num,int n)//public static int getOneBit(int num,int n)
	{
		int i = 1 << (n - 1);
		int nb = num & i;
		return nb >> (n-1);
	}

	public static void main(String[] args)
	{
		int x = 9;
		TestMask obj = new TestMask();//
		System.out.print(obj.getOneBit(x,4));//System.out.println(TestMask.getOneBit(x,4));//System.out.println(getOneBit(x,4))
		System.out.print(obj.getOneBit(x,3));//System.out.println(TestMask.getOneBit(x,3));//System.out.println(getOneBit(x,3))
		System.out.print(obj.getOneBit(x,2));//System.out.println(TestMask.getOneBit(x,2));//System.out.println(getOneBit(x,2))
		System.out.println(obj.getOneBit(x,1));//System.out.println(TestMask.getOneBit(x,1));//System.out.println(getOneBit(x,1))
	}
}

输出结果:1001

分析:方法getOneBit()可以返回参数num的第n-1位。

  • 赋值运算符

格式:变量(已声明)=表达式 double d = 7.8f; //合法 int a = 78L; //非法 int a = (int)78L; //合法 10 = i + j;//非法 i + j = 10; //非

当赋值运算符两侧的类型不一致时,如果左侧变量的数据类型的表示范围更大,则把右侧的数据自动转换为与左侧相同的数据类型,然后赋给左侧变量

否则,需要使用强制类型转换运算符。

复合的赋值运算符 +=、-=、*=、/=、%=、&=、|=、^=、 >>=、 <<= 、>>>=

  • 条件运算符

    格式:表达式1 ? 表达式2 :表达式3(表达式1应是boolean类型的表达式;表达式2和表达式3的类型要一致。)
import javax.swing.JOptionPane;
public class TestConditionalOpreator
{
	public static void main(String[] args)
	{
		int score;
		score = Integer.parseInt(JOpionPane.showInputDialog("请输入百分制成绩:"));
		String result = (score>=60)?"及格":"不及格";
		System.out.println(result);
	}
}

分析:
弹出输入对话框,接收用户输入: JOptionPane.showInputDialog(s)
将数字的字符串表示形式转换为整数:Integer.parseInt(s)
result = (score>=60) ? "及格" : "不及格"

  • 表达式

表达式:若干操作数(operand)和运算符(operator)按照约定规则构成的一个序列。

运算符标明对操作数进行何种操作;

操作数可以是变量、常量或有返回值的方法调用等其他的表达式。

运算符优先级和结合方向
优先级 运算符 操作数 结合方向
1 []、()    
2 ++、--、+(单目)、-(单目)、~、!、(强制类型转换)、new 单目 右-->左
3 *、/、% 双目 左-->右
4 +、= 双目 左-->右
5 <<、>>、>>> 双目 左-->右
6 <、<=、>、>=、instanceof 双目 左-->右
7 ==、!= 双目 左-->右
8 & 双目 左-->右
9 ^ 双目 左-->右
10 | 双目 左-->右
11 && 双目 左-->右
12 || 双目 左-->右
13 ?: 三目 右-->左
14 =、+=、-=、*=、/=、^=、%=、&=、|=、<<=、>>=、>>>= 双目 右-->左

  • 表达式中的数据类型转换
  1. 自动类型转换
    为了保证精度,转换从表示数的范围较小的数据类型到表示数的范围较大的数据类型。
    (byte或short)和 int-->int
    (byte或short或int)和 long-->long
    (byte或short或int或long)和 float-->float
    (byte或short或int或long或float)和 double-->double
    char和int-->int
    箭头左边表示参与运算的数据类型,操作可以是算术运算、赋值运算等,箭头右边转换后进行运行的数据类型
    long longVar = 12345; double doubleVar = 1.2f;
    float f = 23456434563L;
    doubleVar = doubleVar * (12 + longVar);
    int a=doubleVar/100; //错,需使用强制类型转换
    注意:布尔类型不能与任何其它数据类型转换。
  2. 强制类型转换
    目标数据类型)变量或表达式 float)5 / 9 * (f - 32)
    注意:强制类型转换时,由于目标数据类型的取值范围小于待转换数据类型的取值范围,在转换过程中会出现截断,导致高位数据丢失或精度下降。
public class TypeConversion
{
	public static void main(String[],args)
	{
		int intVar = Oxff56;
		byte byteVar = (byte)intVar;
		System.out.println("intVar=" + Integer.toString(intVar,2) + ";" + intVar);
		System.out.println("byteVar=" + Integer.toString(byteVar,2) + ";" + intVar);
	}
}

结果:intVar=1111111101010110;65366;

byteVar=1010110;86;

将32位整数65366强制转换为byte型后,整数的高位被截掉,只剩下低8位,字节数据为86,导致数据丢失。

数值的类型转换。

public class TypeConversion
{
	public static void main(String[],args)
	{
		int i1 = 1234567891;
		float f = i1;			//合法,但任然可能存在精度损失
		System.out.println(f);
		double d1 = i1;			//合法,不存在精度损失
		System.out.println(d1);

		double d2 = 3.99;
		int i2 = (int)d2;
		System.out.println(i2);

		byte a = 37;			//合法
		byte b = 112;			//合法
		//byte c = 200;			//非法,超出范围
		//byte d = a + b;		//非法,可能存在精度损失
		int e = a + b;
		System.out.println(e);

		int k = 12;
		//byte b1 = k;			//非法,可能存在精度损失
	}
}

结果:1.23456794E9

1.234567891E9

3

149

相关文章推荐

【JSP】赵雅智_EL表达式

知识要点 EL表达式概述EL表达式的基本语法EL表达式的隐式对象禁用EL表达式 EL表达式的目的是为了使JSP页面编写起来更简单。 EL表达式概述 EL表达式是为了便于获取数据而定义的一种...

赵雅智_java.方法

静态方法 方法的参数传递 形参长度可变的方法 递归方法 方法重载 方法是类或对象的行为特征的抽象,是类或对象最重的组成部分。 static 用stati...

赵雅智_Java JDK 5.0 枚举

为什么需要枚举? 一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值 此类问题在JDK5以前采用自定义带有枚举功能的类解决,Java5以后可以直接使用枚举予以解决。 JDK 5新...

赵雅智_java 网络编程(4)之URL

让IE作为客户端编写服务端程序: package net.csdn.web; import java.io.IOException; import java.io.PrintWriter; imp...

赵雅智_java单例类

单例类:一个类始终只能创建一个实例设计模式:解决一个类在内存中只存在一个对象。解决方法: 1.禁止其他程序自由创建对象:将构造方法私有化,使用private修饰。 2.为了让其他程序可以访问到该类...

赵雅智_java语言基础

分隔符、标识符以及关键字java程序的注释基本数据类型编码惯例 分隔符 起到分隔作用的符号。 分号(“;”)   :语句结束的标记 、for循环中分隔不同的成分  逗号(“,”):方法...

赵雅智_java 接口

规范与实现相分离的设计哲学 扩展功能降低耦合一个类可以继承一个父类,可以实现多个接口接口是另一种定义数据类型的方式,它和类非常相似的。接口中只包含常量,抽象方法 接口是另一种定义数据类型的...

赵雅智_Java JDK 5.0 内省

为什么要学内省? 开发框架时,经常需要使用java对象的属性来封装程序的数据,每次都使用反射技术完成此类操作过于麻烦 所以sun公司开发了一套API,专门用于操作java对象的属性。 什么是Ja...

赵雅智_java 一维数组

数组:引用数据类型,一组相同类型的数据的有序集合。适用于集中管理类型相同、用途相近的多个数据。 相同的数据类型:所有数组元素,可以是基本也可意是引用; 数组的长度不可改变:一旦数组的初始化完成,...

赵雅智_java 数据库编程(1)

JDBC简介 JDBC是数据库驱动SUN公司为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC。JDBC全称为:Java Data Base Connectivit...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:赵雅智_java运算符与表达式
举报原因:
原因补充:

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