Write once,Runanywhere.
前面几篇文章都是可以帮助C语言学习者快速熟悉Java的语法,如果你是没有学习过C语言而直接来观看的这个JavaSE语法系列的专栏,那你可以先去看看我C语言的相关专栏,便于你快速掌握JavaSE的语法。
这篇文章着重讲解Java运算符与C语言里运算符的细微区别,两者之间并没有太大的区别。
如果你觉得我的文章有帮助到你,请您点赞评论收藏并转发给你身边的朋友,得到你们支持就是我最大的动力!!!
新的知识开始喽
像 =、-、+、<、>等等,这样对操作数执行数学运算的符号称为运算符。
Java中运算符可以分为:算术运算符(+ - * /)、关系运算符(<> ==)、逻辑运算符、移位运算符以及条件运算符等等。
表达式:运算符和操作数的结合。
以下这些式子都称作为表达式:
int a = 10;
int b = 20;
a + b;
a>b;
还是说明一下,这里的模(%)运算就是数学当中求除法的余数。
直接上代码:
int a = 10;
int b = 20;
System.out.println(a+b);//30
System.out.println(a-b);//-10
System.out.println(a*b);//200
System.out.println(a/b);//0
System.out.println(a%b);//10
这里重点看下面两块代码:
请你写出下面代码执行后的结果
public static void main(String[] args) {
System.out.println(5/2);
System.out.println(5.0/2);
System.out.println(5/2.0);
System.out.println((float)(5/2));
}
答案是2、2.5、2.5、2.0。
看代码后的注释分析:
public static void main(String[] args) {
System.out.println(5/2);// 整型/整型 == 整型 5/2 == 2
System.out.println(5.0/2);// 小数默认double型 double/int == double , int 提升为double型
System.out.println(5/2.0);// 小数默认double型 int/double == double , int 提升为double型
System.out.println((float)(5/2));// int/int == int 5/2 == 2 ,(float)强转为float型 -->2.0
}
还是一样请你写出一下代码的运行结果。
public static void main(String[] args) {
System.out.println(10%3);
System.out.println(10%-3);
System.out.println(-10%3);
System.out.println(-10%3);
System.out.println(11.5%2);
}
答案以及分析看下面代码的注解:
public static void main(String[] args) {
System.out.println(10%3);// 10/3 ==3......1
System.out.println(10%-3);// 10/-3 ==-3......1
System.out.println(-10%3);// -10/3 ==-3......-1
System.out.println(-10%-3);// -10/-3 ==3......-1
System.out.println(11.5%2);// 11.5/2 == 5......1.5
}
这里的模运算与Java里的区别: 1.可以对浮点类型的数字进行取模运算 2.取模运算的结果可以是浮点数
在数学当中,除数也就是分母是不能为0的
,Java程序当中也一样。
看代码:
程序会出现异常,异常指的是:在程序运行的时候,出现了不正常的行为。
看代码:
public static void main(String[] args) {
int a = 4;
a += 1;
System.out.println(a);//a = a+1; 5
a -= 1;
System.out.println(a);//a = a-1; 4
a *= 5;
System.out.println(a);//a = a*5; 20
a /= 2;
System.out.println(a);//a = a/2; 20/2==10
a %= 2;
System.out.println(a);//a = a%2; 20%2 ==0
}
但是在Java里面,增量运算符可以自动帮我们进行类型转换
,看代码:
注意:只有变量才能使用该增量运算符,常量不能使用。
作用与效果跟C语言相同,直接看代码1:
int a = 1;
++a;
System.out.println(a);//2
int a = 1;
a++;
System.out.println(a);//2
这里不管是前置++和后置++都打印1。
代码2:
int a = 1;
a++;//++后置 先使用后++
System.out.println(a++);//2 a++---》3
System.out.println(a);//3
int a = 1;
++a;// 2 ++前置 先++后使用
System.out.println(++a);//3
System.out.println(a);//3
关系运算符主要有6个:== != < > <= >=,其计算结果是true或者false。
需要注意的点就是要判断范围时:3
逻辑运算符主要有三个:&& || !,运算结果都是Boolean类型。
public static void main9(String[] args) {
System.out.println(true && true);//true
System.out.println(true && false);//false
System.out.println(false && true);//false
System.out.println(false && false);//false
}
下图这个语句会报警告,因为19/0
不是布尔表达式。
将19/0
改写成布尔表达式(19/0)==0
:
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println((a>b)&&(19/0)==0);//false
}
int a = 1;
int b = 2;
System.out.printin((a>b) && (19/0 ==0));
public static void main(String[] args) {
System.out.println(true||true);//true
System.out.println(true||false);//true
System.out.println(false||true);//true
System.out.println(false||false);//false
}
语法规则:!布尔表达式
int a = 1;
System.out.println(!(a==1));//false
位运算符操作的对象是二进制的比特位,位运算符的操作对象主要有四个:&、|、^、~
。
与C语言相同:
按位与&:如果两个二进制位都为1,则结果为1,否者为0。
按位或|:如果两个二进制位都为0,则结果为0,否则为1。
注意:当&和|的操作数为整数(int、short、byte、long)的时候,表示按位运算,当操作数为Boolean表达式时,表示逻辑运算。
按位异或:如果两个二进制位相同则为0,相异则为1。
按位取反~:如果该二进制位为0则转化为1,如果该二进制位为1则转化为0。
因为前面C语言的专栏有讲到过,所以这里只讲解一下按位取反:
int a = 0xf;
System.out.printf("%x\n",~a);//fffffff0
System.out.println(~a);//-16
//0xf ==> 正数补码: 00000000 00000000 00000000 00001111
//~a ==> 取反后补码:11111111 11111111 11111111 11110000
// f f f f f f f 0
// a取反后变成了负数:11111111 11111111 11111111 11110000
// 补码-1:11111111 11111111 11111111 11101111
// 取反得到原码:10000000 00000000 00000000 00010000==》-16
注意:
0x
为前缀的数字为十六进制
数字,一个十六进制
数字对应4个二进制位
。0xf
表示十进制的15,也就是二进制的1111。printf
能够格式化的输出内容,%x
表示按照十六进
制输出.\n
表示换行。<< 左移:最左侧位不要了,最右侧补0
>>右移:最右侧位不要了,最左侧补0
>>> 无符号左移: 最右侧位不要了,最左侧补0
int a = 10;
//只看后8位 00001010
//a<<1 00010100 //20
System.out.println(a<<1);//20
注意:左移丢弃的是符号位,因此正数左移可能会变成负数。
最右侧不要了,最左侧补符号位(正数补0,负数补1)
int b = 11;
System.out.println(b>>1);//5
// 00001011-->10
//>>1 00000101-->5
System.out.println(b>>2);//2
System.out.println(b>>3);//1
规律小结:
左移1位相当于对原来的数字*2
右移1位对于正数相当于原来的数字/2,对于负数相当于对于原来的数字/2再减1
对于正数:
int a = 10;
//只看后8位 00001010
//a<<1 00010100 //20
System.out.println(a<<1);//20
System.out.println(a<<2);
int b = 11;
System.out.println(b>>1);//5
System.out.println(b>>2);//2
System.out.println(b>>3);//1
对于负数:
int a = -10;
//只看后8位 00001010
//a<<1 00010100 //20
System.out.println(a<<1);//-20
System.out.println(a<<2);//-40
int b = -11;
System.out.println(b>>1);//-6 -11/2==-5 -5-1==-6
System.out.println(b>>2);//-3
System.out.println(b>>3);//-2
最右侧位不要了,最左侧位补0
int c = 1;
// 00000001
//>>>1 00000000--->0
System.out.println(c>>>1);//0
注意:
条件运算符只有一个,同时也是Java中唯一的一个三目运算符:布尔表达式1?表达式2:表达式3
布尔表示1
为true
时,整个表达式的值为表达式2
的值布尔表示1
为false
时,整个表达式的值为表达式3
的值//求两个整数的最大值
int a = 10;
int b = 20;
int max = a>b?a:b;
System.out.println(max);//20
复杂的条件运算符:
boolean flg = false ? false : true == true ? true : false;
// 表达式1 表达式2 表达式3 表达式4
// 表达式1错误执行表达式3
// 表达式3正确 执行表达式4
System.out.println(flg);//true
注意:
System.out.println(true?1:2.0);//1.0 表达式2 int类型隐式提升为double类型
今天的你看懂这里又学到了很多东西吧
下次见喽