java运算规则与运算符

java运算规则与运算符

1、基本类型的类型转换

float a=123.45;//错误,右边的double,左边是float类型,类型不一致
int b=1234L;//错误,右边是long类型,左边是int类型,类型不一致
long c=1234;//对,右边是int类型,左边是long类型,类型不一致
double d=123.45f;//对,右边是float类型,左边是double类型,类型不一致
//都是类型不一致,有的对,有的错

问题:为什么有的两边类型不一致是对的,而有的两边不一致是错的?
当变量类型和变量值的类型不匹配时,就需要进行类型转换操作,而这种转换分为两种:

1.1、小到大/隐式转换

从小类型到大类型可以自动完成转换,我们不需要动手操作。
在这里插入图片描述

byte a1=10;
int b1=a1;//a1是byte类型,b1是int类型 ,小转大,自动转换了
int a2=10,b2=20;
long c2=a2+b2;//int类型转long类型,小转大,可以自动转换的
char a3='中';//a3其实就是一个整数
System.out.println(a3);
int b3=a3;//char类型转int类型,小转大,自动转换了
System.out.println(b3);//20013
double c3=a3;//char转double,小转大
System.out.println(c3);

1.2、大到小/显示转换/强制转换

需要强制类型转换

long x=1024L;
int y=(int)x;//long转int,是大转小,需要强制转换
System.out.println(y);//1024,输出的结果的没有任何问题
long i=1024L*1024*1024*4;
System.out.println(i);//4294967296
int j=(int)i;
System.out.println(j);//0,整数溢出了,i的数值超过了int所能表达的范围
double h=3.141592653589793;
System.out.println(h);//3.141592653589793,double类型的精度15位小数
float m=(float)h;
System.out.println(m);//3.1415927,float类型小数位只有7位,精度丢失

提示: 大类型转小类型可能会造成溢出和精度丢失问题!
在这里插入图片描述

2、运算规则

2.1、规则1:不同类型的数据进行运算,运算结果的类型会自动向较大类型转换

//规则1:不同类型的数据进行运算,运算结果的类型会自动向较大类型转换
int x=10;
long y=3L;
//long z=x+y;//13 int+long 结果会自动向较大的类型long转
int z=(int)(x+y);
System.out.println(z);
System.out.println(10+3.0);
System.out.println(10-3.0);
System.out.println(10*3.0);
System.out.println(10/3.0);
System.out.println(10/3);//int/int=int,虽然计算结果是小数,但是最终转换为int,所以直接去掉小数

2.2、规则2:byte,short,char三种比int小的整数,运算时会先自动转换成int

//规则2:byte,short,char三种比int小的整数,运算时会先自动转换成int
byte a1=3,a2=4;
//byte a3=a1+a2;//a1+a2运算结果最终结果是int,赋值个给byte,是大转小
byte a3=(byte)(a1+a2);
//byte a3=(byte)a1+(byte)a2;是错误的,一点效果都没有
byte b1=10;
short b2=20;
short b3=(short)(b1+b2);
char c1='中';//20013
char c2=(char)(c1+5);//20013+5=20018
System.out.println(c2);//串

2.3、规则3:整数运算溢出

整数运算,类似于一个钟表,转到最大时,再转会回到最小。
在这里插入图片描述

//规则3:整数运算溢出
byte d1 = Byte.MAX_VALUE;
System.out.println(d1);//127
byte d2=(byte)(d1+1);//实际计算127+1=128,但是byte没有128
System.out.println(d2);//-128,直接由最大值,变成最小值
int d3=Integer.MIN_VALUE;
System.out.println(d3);//-2147483648
int d4=d3-1;
System.out.println(d4);//2147483647

2.4、规则4:浮点数运算不精确

我们平常使用的编程语言大多都有一个问题——浮点型精度运算会不准确。比如

//浮点数运算
double num=0.1+0.1+0.1;
System.out.println(num);//0.30000000000000004
double num1=0.65-0.6;
System.out.println(num1);//0.050000000000000044

我们的计算机在存储小数时肯定是有长度限制的,所以会进行截取部分小数进行存储,从而导致计算机存储的数值只能是个大概的值,而不是精确的值

2.5、规则5:浮点数的特殊值

package cn.tedu.luoji;
//测试赴浮点数的特殊值
public class FuDianShu {

	public static void main(String[] args) {
		//1、正无穷大	Infinity
		System.out.println(3.14/0);//	Infinity
		//2、负无穷大	-Infinity
		System.out.println(-3.14/0);//  -Infinity
		//3、非数值	NaN
		System.out.println(0.0/0);//	NaN
		System.out.println(0/0.0);//	NaN
	}

}

3、引用数据类型

3.1、引用数据类型简介

    引用数据类型包括类、接口、数组类型

3.2、String类简介

    String 类,通过String类可以定义一个字符串。所谓的字符串就是指一连串的字符,即字符串是由若干个字符连接而成的串。字符串中可以包含任意个字符,无论是0个、1个还是多个字符,这些字符必须包含在一对双引号("")之内,例如:

package com.tedu.yusuan;
/**
 * 字符串入门
 * @author Administrator
 *
 */
public class StringDemo {

	/*
	 * String  首字母大写   java中的类   
	 * 底层是char数组
	 *   The value is used for character storage. 
     *   private final char value[];
	 *
	 */
	public static void main(String[] args) {
		//1.直接使用""括起来
		String name = "xgg";
		System.out.println(name);
		//2.使用new
		String name2 = new String( "java");
		System.out.println(name2);
	}
}

    字符串可以直接使用:

String name = "java";
System.out.println(name);

    也可以先声明再使用:

String name2 = new String( "java");
System.out.println(name2);

4、运算符

符号名称表示符号逻辑规则
算数运算符+  -  *  /基本运算
%模-取余数(5%2结果是1)
++  --自增  自减
比较运算符(结果是boolean)==相等比较 1==2 得到false
!=不等比较 1!=2 得到true
逻辑运算符(结果是boolean)&&  &逻辑与(短路与),两边同为真结果才为真
||  |逻辑或(短路或),两边只要有一个真结果就是真
+字符串连接
!boolean
三元运算符? :三项运算:1?2:3(1是真取2,1是假取3)
赋值运算符=赋值运算
+=  -=  *=  /=复合的赋值运算(a=a+2或者a+=2)

4.1、算数运算符

操作符描述例子
+加法 - 相加运算符两侧的值10 + 20 等于 30
-减法 - 左操作数减去右操作数10 – 20 等于 -10
*乘法 - 相乘操作符两侧的值10 * 20等于200
/除法 - 左操作数除以右操作数20 / 10等于2
%取余 - 左操作数除以右操作数的余数20%10等于0
		//1.算数运算符    +加  减-   *乘  /除  %求余数
		System.out.println(100 + 20);//120
		System.out.println(100 - 20);//80
		//java中乘号是*  X   int X = 10;  XX10
		System.out.println(100 * 20);//2000
		System.out.println(100 / 20);//5
		System.out.println(100 / 3);//33
		System.out.println(100 % 3);//1
%的用法: 
奇偶数的判定 
%2     0     偶数
%2     1     奇数
也可以用来判断是否能被n整除
%n==0

4.2、关系运算符

运算符描述例子
==如果两个操作数的值是否相等,如果相等则条件为真(10 == 20)为假
!=如果两个操作数的值是否相等,如果值不相等则条件为真(10 != 20) 为真
>检查左操作数的值是否大于右操作数的值,如果是那么条件为真(10> 20)为假
<检查左操作数的值是否小于右操作数的值,如果是那么条件为真(10 <20)为真
>=检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真(10> = 20)为假
<=检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真(10 <= 20)为真
		//2.关系运算符
		int a = 10;
		int b = 2;
		//   ==  等号  在java中=不是等号
		System.out.println(a * b == b * a);//乘法交换律   true
		//!=  不等
		System.out.println(a != b); //true
		// > 大于
		System.out.println(a > b); //true
		// >=  大于等于
		System.out.println(a >= b); //true
		// < 小于
		System.out.println(a < b); //false   10<2?
		System.out.println(a <= b); //false   10<=2?

4.3、逻辑运算符

操作符描述例子
&&称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真(A && B)为假
||称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真(A | | B)为真
!称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false!(A && B)为真
布尔表达式1 && 布尔表达式2 : 两边都是true,结果才是true,只要有一个是false,结果就是false
布尔表达式1 || 布尔表达式2 : 两边都是false,结果才是false,只要有一个是true,结果就是true
两者都有短路效果:
&&左边(表达式1)如果是false,右边不会执行
||左边(表达式1)如果是true,右边不会执行
&|&&||都是一样的,只不过后者(双个)具有短路能力
通常,我们用0表示false,用1表示true
与:表示并且的关系
单与&: 
       1 & 2  ,结果想要是true,要求1和2都必须是true
双与/短路与&&:
       1 && 2 ,当1是false时,2会被短路,提高程序的效率
或:表示或者的关系
单或|:
       1 | 2,结果想要是true,要求1和2只要有一个为true就可以
双或/短路或||:
       1 || 2,当1是true时,2会被短路,提高程序效率
//3.逻辑运算符   a=10  b=2
		/**
		 * &&  逻辑与      双真为真,有假必假   
		 *  短路规则 若前面的表达式为假,后面的表达式没有判断真假的必要,结果必然为假
		 */
		System.out.println(a > b  && b > 0 );//true   前真后真为真
		System.out.println(a > b  && b < 0);//false  前真后假为假
		System.out.println(a < b  && b > 0);//false  前假后真为假
		System.out.println(a < b  && b < 0);//false  前假后假为假
		
		System.out.println("----||-----");
		/**
		 * || 逻辑或    有真为真,双假必假     
		 *  短路规则   若前面的表达式为真,后面的表达式没有判断真假的必要,结果必然为真
		 */
		System.out.println(a > b  || b > 0 );//true  前真后真为真
		System.out.println(a > b  || b < 0);//true   前真后假为真
		System.out.println(a < b  || b > 0);//true   前假后真为真
		System.out.println(a < b  || b < 0);//false  前假后假为假
		
		
		System.out.println("----!-----");
		/**
		 * ! 逻辑非(取反)   真假相反
		 */
		System.out.println(a > b); //true
		System.out.println(!(a > b)); //false

    短路的意思就是惰性运算,当符号左边的式子已经可以确认最后结果时,符号右边的式子就不进行计算了。

    短路与是Java语言中的一个逻辑运算符,记作&&,与编程语言中的与(&)相似,但是具有短路性质:在使用&进行运算时,不论左边为true或者false,右边的表达式都会进行运算,而如果使用&&进行运算,当左边为false时,右边的表达式不会进行运算,因此&&被称为短路与。

    短路或是Java语言中的一个逻辑运算符,记作||,与编程语言中的或(|)相似,但是具有短路性质:在使用|进行运算时,不论左边为true或者false,右边的表达式都会进行运算,而如果使用||进行运算,当左边为true时,右边的表达式不会进行运算,因此||被称为短路或。

package cn.tedu.luoji;

//测试短路与、短路或
public class DuanLuYu {
	public static void main(String[] args) {
		// 1、验证短路与
		Boolean res1 = A() && B();// A方法是true的时候,要执行B方法
		Boolean res2 = C() && D();// C方法是false的时候,不执行D方法
		System.out.println("---------------------------------------------");
		// 2、验证与
		Boolean res3 = A() & B();// A方法是true的时候,要执行B方法
		Boolean res4 = C() & D();// C方法是false的时候,要执行D方法
		System.out.println("---------------------------------------------");
		// 3、验证短路或
		Boolean res5 = A() || B();// A方法是true的时候,不执行B方法
		Boolean res6 = C() || D();// C方法是false的时候,要执行D方法
		System.out.println("---------------------------------------------");
		// 4、验证或
		Boolean res7 = A() | B();// A方法是true的时候,要执行B方法
		Boolean res8 = C() | D();// C方法是false的时候,要执行D方法

	}

	public static Boolean A() {
		System.out.println("我是A方法------");
		Boolean tBoolean = true;
		return tBoolean;
	}

	public static Boolean B() {
		System.out.println("我是B方法------");
		Boolean fBoolean = false;
		return fBoolean;
	}

	public static Boolean C() {
		System.out.println("我是C方法------");
		Boolean tBoolean = false;
		return tBoolean;
	}

	public static Boolean D() {
		System.out.println("我是D方法------");
		Boolean fBoolean = true;
		return fBoolean;
	}
}
4.3.1、平年闰年的判断
package cn.tedu.yunsuanfu;

import java.util.Scanner;
/*
 * 判断是否为闰年
 * 要满足为闰年的条件
 * 1、能被4整除,并且不能被100整除
 * 2、能被400整除
 */
public class RunNian {
	public static void main(String[] args) {
		// 方式一、普通写法(使用逻辑与&进行判断)
		// 1、输入年份,判断是否为闰年
		System.out.println("请输入年份?");
		int year = new Scanner(System.in).nextInt();
		// 2、设置默认值:假设每年都是平年
		String desc = "平年";// 修改默认值
 		// 3、判断,年号是否满足闰年的条件
		if (year % 4 == 0 & year % 100 != 0) {
			desc = "闰年";
			System.out.println(year + "为" + desc + "!!!");
		} else if (year % 400 == 0) {
			desc = "闰年";
			System.out.println(year + "为" + desc + "!!!");
		} else {
			System.out.println(year + "为" + desc + "!!!");
		}
	}
}
		// 方式二、短路与、短路或写法(使用&&、||进行判断)
		if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
			desc = "闰年";
			System.out.println(year + "为" + desc + "!!!");
		} else {
			System.out.println(year + "为" + desc + "!!!");
		}

4.4、自增自减运算符

操作符描述<例子/th>
++自增: 操作数的值增加120++ 或 ++20 等于 21
--自减: 操作数的值减少120-- 或 --20 等于 19
++: 在当前值的基础上自增1(加1int i = 5;
i++: 先使用(访问)i的值,再给i加1
++i: 先给i加1,再使用(访问i)的值
--: 在当前值的基础上自减1(减1)
i--: 和i++相同
--i:++i相同
		//4.1.自增   ++     看++的位置,++在前先加再使用 ;++在后先使用再加
		System.out.println("----++自增-----");
		int i = 5;
//		System.out.println(i++); //5  先使用当前值,用完加1
//		System.out.println(i);// 6
		
		System.out.println(++i); //6  先加1再使用
		System.out.println(i);// 6
		
		//自减  --   看--的位置,--在前先减再使用 ;--在后先使用再减
		i = 5;
		System.out.println(i--);//5  先使用当前值,用完减1
		System.out.println(i);// 4  此时i=4
		
		i = 5;
		System.out.println(--i);//4  先减1再使用
		System.out.println(i);// 4  此时i=4

在这里插入图片描述

4.5、三目运算符

格式:布尔表达式 ? 表达式1 : 表达式2
如果表达式结果是true,则返回值1,否则返回值2

package com.tedu.yusuan;

/**
 * 三目运算符(三元运算符)
 * @author Administrator
 *
 */
public class TestDemo2 {
	public static void main(String[] args) {
		//快速删除整行   ctrl+d
		int x = 7;
		int y = 9;
		/**
		 * 先判断表达式的结果   若为真结果为表达式1的值;否则结果为表达式2的值
		 */
		int z = x > y ? x : y;
		System.out.println(z);
		
		x = 10;
		y = 2;
		z = x > y ? x : y;
		System.out.println(z);
		
	}

}
4.5.1、两个数的最大值
package cn.tedu.yunsuanfu;
import java.util.Scanner;

//测试三元运算符
public class SanYuanYunSuan {
	public static void main(String[] args) {
		// 从键盘接收2个整数,获取最大值
		System.out.println("请输入数字1:");
		int a = new Scanner(System.in).nextInt();// a=5
		System.out.println("请输入数字2:");
		int b = new Scanner(System.in).nextInt();// b=3
		// 使用三元运算来判断2个数字中的最大值
		// 如果a>b为true就返回a,如果a>b为false就返回b
		int c = a > b ? a : b;
		System.out.println("大的数字是:" + c);// 大的数字是:5
	}
}

怎么比较三个数中的最大值呢?

// 先判断2个数中的最大值,在拿最大值去与第3个数进行比较
int d = a > b ? a : b;// d是a和b之间的最大值
int e = d > c ? d : c;
System.out.println("大的数字是:" + e);

4.6、复合赋值运算符

操作符描述例子
=简单的赋值运算符,将右操作数的值赋给左侧操作数C = A + B将把A + B得到的值赋给C
+=加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数C + = A等价于C = C + A
-=减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数C - = A等价于C = C - A
*=乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数C * = A等价于C = C * A
/=除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数C/=A,C与A同类型时等价于C=C/A
package com.tedu.yusuan;
/**
 * 复合赋值运算符
 * @author Administrator
 *
 */
public class YSFDemo {
	public static void main(String[] args) {
		int a1 = 12;
		/*
		 * a1 += 5
		 * a1 = a1 + 5
		 * 写1行注释1行是为使用a1初值12
		 */
//		System.out.println(a1 += 5);//17
//		System.out.println(a1 -= 5);//7
//		System.out.println(a1 *= 5);//60
//		System.out.println(a1 /= 5);//2
		System.out.println(a1 %= 5);//2
		
	}
}

4.7、加号(+)的使用

    加号可以做加法运算(要求两边都得是数值),也可以做为拼接符使用(只要两边有一个是字符串)

package com.tedu.yusuan;
/**
 * +   数值计算中是加号   字符串中是拼接操作
 * @author Administrator
 */
public class YSFDemo2 {
	public static void main(String[] args) {
		int a = 1 + 3; // +  加号   相加操作
		System.out.println(a);
		System.out.println(a + "abcd");//拼接操作
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值