目录
一、运算符
在编程中,为了完成一些操作,常借助运算符。常见的运算符有算数运算符、赋值运算符、关系运算符、逻辑运算符和位运算符。运算时考虑优先级,例如,同一优先级的运算符,其运算次序由结合方向决定,不同优先级的运算符,优先级高的先运算。如果不能准确的把握优先级,直接利用最高优先级的运算符( )来限制运算次序。
例如:在计算3+4-5时,运算符的优先级相同,算数运算符的结合方向是左结合,所以相当于(3+4)-5; 在计算3+4*5时,*的优先级高于+,所以相当于3+(4*5);对于第二个运算,如果不能确定优先级,直接写成3+(4*5)形式即可,保证运算的正确性。
1、算数运算符
运算符:+、-、*、/、% 、++、--
在算数运算过程中,有两种形式,单目运算和双目运算,单目运算就是仅有一个操作数(参与运算的数),双目运算就是有两个操作数参与运算过程。
这里主要对单目运算符进行梳理:单目算数运算符有“++”和“- -”两种,又称为自增运算符和自减运算符,它的位置可以出现在操作数前和操作数后,如下所示:
int i =10 ; i++; ++i; i- -; - -i; |
(以自增为例)两种写法(i++和 - -i)的主要区别在于他们的运算次序是不同的 ,便于记忆的方式就是
①运算符在操作数前边就是先对该操作数进行+1的运算,再使用该操作数
②运算符在操作数后边则是指先使用当前操作数,再对该操作数进行+1的计算
举个栗子:
public class test3 {
public static void main(String[] args) {
int a=10;
System.out.println("a进行a++后的值="+(a++));//此处的输出值为10,因为会先使用该变量然后在进行运算
//但是a++在使用输出后,进行了+1;
System.out.println(a); //经过输出之后,可以看到a的值是11;
a=10; //重新设定一个值,为了便于观察
System.out.println("a进行++a后的值="+(++a));
//和上边的a++相比,这里会先进行+1的算数,然后再使用,完成输出,所以输出值为11;
System.out.print(a);//再对a的值进行输出,可以看出来数值没有发生变化了
}
}
输出如下所示:
a++=10
11
++a=11
11
2、关系运算符
运算符:>、>= 、< 、<= 、== 、!=
该种运算符参与的运算的运算结果是boolean类型的数据,只有两种结果,就是true和false;
该运算符的作用原理:注意,每个变量其实都有一个地址,但是这些运算符比较的不是地址,而是变量中保存的值之间的关系,对于这个关系判断是真是假。
举个栗子:
package test;
public class test04 {
public static void main(String[] args) {
int a=3;
int b=4;
System.out.println(a>b);//false
System.out.println(a<b);//true
System.out.println(a>=b);//flase
System.out.println(a<=b);//true
System.out.println(a==b);//false
System.out.println(a!=b);//true
char c='a';
char d='b';
System.out.println(c>b);
}
}
运行结果
false
true
false
true
false
true
true
3、逻辑运算符
运算符:(且、或、非、异或)
运算符要求:两侧的操作数都是boolean类型的数据
结果:boolean类型(true或者false)
其中逻辑与“&”又称为按位与,逻辑或“|”又称为按位或,可以用于逻辑的运算,也可以用于二进制的运算,逻辑非和逻辑异或也是既可以用于真假的逻辑运算,也可以用于对二进制进行运算。
当两侧操作数都是逻辑表达式时,对于与类型的运算符(按位与和短路与),当两侧的操作数都是true时,整体逻辑表达式的值才为真。对于或类型的运算符(按位或和短路或),当两侧的操作数都为false时,整体逻辑表达式的值才为假。
当两侧操作数为某个具体的值时,按位与指的是各二进制位对应进行与操作(1&1=1,1&0=0,0&0=0),按位或指的是各二进制位对应进行或操作(1|1=1,1|0=1,0|0=0)。
举个栗子:
package test;
public class test04 {
public static void main(String[] args) {
int a=2,b=3,c=4;
System.out.println(a<b&b<c);//输出:true
System.out.println(a&b);//输出int值
}
}
System.out.println(a&b)的运算过程:
操作数 | 二进制 |
a | 0000 0010=2 |
b | 0000 0011=3 |
a&b | 0000 0010=2 |
输出结果:
true
2
那么两种与和两种或的区别是什么呢?
注意按位与和短路与以及按位或和短路或的区别,他们结果本质相同,但是计算的过程不同,短路与和短路或存在短路问题(即当逻辑表达式的结果已经十分明确了,就没必要再进行接下来的运算了),适当的短路方式更实用,具有更高的效率,但是在某些情况下,短路与无法满足需求,就需要位与的存在,它并不是完全没用的 。
举个栗子:
package test;
public class test04 {
public static void main(String[] args) {
int a=2,b=3,c=4;
//且一定要保证两个操作数都为真才为真,或一定要保证两个操作数都为假才为假
//巧计:且都真才真,或都假才假
System.out.println(a>b&b<c);//false
//上式运算符为按位与,虽然a>b为假,但是还是会继续进行后边的判断,就是会将两个表达式都运算后才会出结果
System.out.println(a>b&&b<c);//false
//上式运算符为短路与,a>b为假,这就表示,无论后边的表达式为真为假,此式肯定为假,所以不必要进行运算了,就短路,计算更加的高效
System.out.println(a<b||b<c);//true
//上式运算符为短路或,a<b为真,这就表示,无论后边的表达式为真为假,此式肯定为真,所以不必要进行运算了,就短路了,计算更加的高效
System.out.println(a<b|b<c);//true
//上式运算符为按位或,虽然a<b为真,此式我们已经知道肯定为真,但是还是会继续进行后边的判断,就是会将两个表达式都运算后才会出结果
}
}
输出结果:
false
false
true
true
虽然短路能够更加高效,但是有时候还是需要两个表达式都进行运算的,根据需要进行运算符的选择。
4、位运算符
5、赋值运算符(基本赋值运算和拓展赋值运算)
运算符:=,+=(追加运算符:可用于求和和累计),- =(删减运算符),/=,%=
以"+="运算符为例,a+=b相当于a=a+b;但是并不完全相等,下文进行论证。
举个栗子:
package test;
public class test04 {
public static void main(String[] args) {
int x=5;
x+=5;
System.out.print(x);//10,其实就是x=x+5;
}
}
输出结果:
10
再举个栗子:
package test;
public class test04 {
public static void main(String[] args) {
byte x=5; //sun公司给了一个特例,如果赋值的数据在byte类型的范围呢,
// 就电脑自动进行强制转换,可以进行赋值。
x+=5; //但是由于java默认数值型字面值为整形数值,
// 所以在运算时,x+5,最终的运算结果是int型的,赋值给byte型变量x,
// 本来根据所学的知识会有编译错误,但是经过运行是可以正常编译和运行的
System.out.print(x);
}
}
输出结果:
10
为什么第二个例子可以正常运行呢,是因为 byte a其实a+=b并不完全等同于a=a+b,而是相当于a=(byte)(a+b),已经在运算过程中加入了强制类型转换。
综上所述:拓展类的赋值运算符,并不改变运算后的最终值的数据类型,而是默认带了强制类型转换。
举一反三,其他的拓展类赋值运算符也是这个道理,具有相同的特性。
6、字符串连接运算符
运算符:+
运算符使用规则:当两侧操作数都是数值时,进行的是数值的运算。但是如果有一侧是字符串,那么进行的就是字符串的连接操作。
举个栗子:
package test;
public class test04 {
public static void main(String[] args) {
int a=5,b=5;
String s="string";
System.out.println(a+b);
System.out.println(s+a+b);
}
}
输出结果:
10
string55
实现动态输出:
package test;
public class test04 {
public static void main(String[] args) {
int a=5,b=5,c;
System.out.println("5+5=10");
System.out.println(a+"+"+b+"="+(a+b));
}
}
输出结果:
5+5=10
5+5=10 //可以根据a和b的不同值,展现不同的结果
——>但是注意,虽然计算的时候,如果存在字符串会按照字符串连接的形式进行计算,但是并不代表着其他类型的值可以类型转换为引用类型String,二者并不相关
7、三目运算符
运算符:C= □ ?A:B;
运行原理:判断“□”处的表达式是否为真,如果为真,那么C=A;如果为假,那么C=B;
注意事项:注意接收对象C的类型和A、B对象的类型的相同性或者兼容性,才能正确的进行运算
举个栗子:
package test;
public class test04 {
public static void main(String[] args) {
int a=5,b=5,c;
c=a>=b?a:b;
System.out.println(c);
}
}
输出结果:
5
再举个栗子:
package test;
public class test04 {
public static void main(String[] args) {
int a=5,b=5;
String c;
c=a>=b?a:b; //这边类型不兼容,a和b为int性的数据,
//不能赋值给String类型的C变量
System.out.println(c);
}
}
输出结果:会报错
java: 不兼容的类型: int无法转换为java.lang.String
再举个栗子:
package test;
public class test04 {
public static void main(String[] args) {
boolean bool=true;
char c;
c=bool?"男":'女';
System.out.print(c);
}
}
输出结果报错:
因为虽然‘女’是char型,但是”男“是字符串类型,这样也会存在类型的不兼容现象
java: 不兼容的类型: 条件表达式中的类型错误 java.lang.String无法转换为char
那么为了避免这个问题,有一种输出方法,就因为print方法有很多不同的参数,具有多种重载的函数,所以它的形参可以接收多种类型的实参。
package test;
public class test04 {
public static void main(String[] args) {
boolean bool=true;
char c;
//c=bool?"男":'女';
System.out.print(bool?"男":'女');
}
}
输出结果:
男
进程已结束,退出代码为 0
二、表达式和语句
1、表达式的构成:
由常量、变量或是其他操作数与运算符所组合而成的,有些表达式不能算单独的java语句。例如:a+b,3.141592653,C等。
主要有:算数表达式、赋值表达式、条件表达式和逻辑表达式 四种类型 ,其中条件表达式和逻辑表达式可以用于构成布尔类型表达式。
【原文指路】
Java表达式、语句、块_雨易辰木的博客-CSDN博客_java表达式与语句的区别
2、语句
在Java中,Java语句是最小的组成单位,一般可分为几种类型,分别是:1、空语句;2、表达式语句;3、复合语句 4、方法调用语句,需要注意的是每个语句必须使用分号作为结束符。
3、表达式和语句的区别:
Java中的表达式和语句是有区别的。
一个表达式会产生一个值或者代表一个值,它可以放在任何需要一个值的地方,比如,作为一个函数调用的参数.下面的每行代码都是一个表达式:
myvar
3 + x
myfunc("a", "b")
语句可以理解成一个行为。循环语句和if语句就是典型的语句.
一个程序是由一系列语句组成的。Java中某些需要语句的地方,你可以使用一个表达式来代替.这样的语句称之为表达式语句。但反过来不可以:你不能在一个需要表达式的地方放一个语句。比如,一个if语句不能作为一个函数的参数。
单独的表达式是不能完成一项操作的,语句是完成一个java操作的
4、注意:
c语言中是可以以任意表达式做一个语句的,编译不报错,但是java是有条件的,只有部分表达式可以,例如:赋值,自增自减,方法调用,对象实例化等。