Java教程

韩顺平Java03(运算符)

本文主要是介绍韩顺平Java03(运算符),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 

运算符

1.算术运算符 arithmetic:算术

  • 除法 / 的使用

看一段代码:



System.out.println(10 / 4); //输出为2 因为是两个整数相除,所以结果默认用整数来接收

System.out.println(10.0 / 4);//输出为2.5

double d = 10 / 4;
System.out.println("d=" + d);//d=2.0

 

这里相当于两个整数相除,所以结果默认用整数来接收,然后将2这个int类型的数赋值给了double类型所以是2.0

 

  • 模运算(取余)——结果正负与被取模数保持一致

System.out.println(10 % 3);//1

System.out.println(10 % -3);//1 商-3余1

System.out.println(-10 % 3);//-1 商3余-1

System.out.println(-10 % -3);//-1 商-3余-1

 

  • 自增/自减运算 :

int j = 8;

int k = ++j;//等价于 j=j+1; k=j

int k = j++ //等价于 k=j; j=j+1

 

其他以此类推

++在作为一条独立语句的时候++i和i++是绝对等价的,但作为赋值语句的时候则遵循上述规则

一道经典面试题:



int i = 1;
i =  i++;
System.out.println(i);//1
//这里因为是给自身赋值会使用到一个临时变量
//(1)temp = i
   (2)i = i + 1
   (3)i = temp

int i = 1;
i =  ++i;
System.out.println(i);//2
  (1)i = i + 1
   (2)temp = i
   (3)i = temp  

 

例子:



int i1 = 10;
int i2 = 20;
int i = i1++;
System.out.println("i="+i);//i=10
System.out.println("i2="+i2);//i2=20
i = --i2;//这里虽然是赋值但是i2已经进行了自减运算所以i2变成了19
System.out.println("i="+i);//i=19
System.out.println("i2="+i2);//i2=19

 

当自增赋值给自身时如i=i++,i的结果并不会改变,但是当赋值给其他变量时,自增的变量(在赋值的时候)就会发生改变 int j = i++ 这个时候i已经+1了



int x = 5;
System.out.println(x++==6); //false 这里先比较后自增 
System.out.println(x); //6

 

 

练习



int day = 21456;
System.out.println("还有"+ (day/7) + "个星期零" + day % 7 + "天放假");
double degree = 1234.6;
System.out.println("华氏温度" + degree + "是摄氏温度" + (degree-100)*5/9);

 

(degree-100)5/9也可以写成 5.0/9(degree-100)但是不能写成 5/9*(degree-100),结果会是0.0 ,因为5/9的结果是0

2.关系运算符

  • 关系运算的结果都是boolean类型的值,关系运算表达式经常用在if结构或者循环结构的条件中

  • 相等是==,一个=是赋值

 

 

3.逻辑运算符

  • 用于连接多个条件(表达式),最终结果也是一个boolean类型的值

  • 实际运算中基本使用短路操作(&&和||)

 

 

 

 

 

 

 

  • 短路与(&&)和逻辑与(&)

对短路与(&&)而言,如果第一个条件判断为false则不再判断第二个条件,效率较高。而逻辑与即使第一个条件判断为false也会继续判断第二个。



int a = 5;
int b = 15;
if(a < 1 && ++b >10){
//虽然判断a<1为假但是依然执行++b,如果a的条件是真的++b还是会执行的
    System.out.println("666");
}
System.out.println("a = " + a + "b = " + b); //a = 5 b = 15
​
if(a < 1 & ++b >10){
    System.out.println("666");
}
System.out.println("a = " + a + "b = " + b);//a = 5 b = 16

 

  • 短路或(||)和逻辑或(|)

短路或(||):如果第一个条件为真则不再判断第二个条件。

逻辑或(|):如果第一个条件为真则也会判断第二个条件。

int a = 5;
int b = 15;
if(a < 10 || ++b >10){
    System.out.println("666");
}
System.out.println("a = " + a + "b = " + b); //666 a = 5 b = 15
​
​
if(a < 10 | ++b >10){
    System.out.println("666");
}
System.out.println("a = " + a + "b = " + b);//666 a = 5 b = 16

 

  • 逻辑非(!)和逻辑异或(^) inverse:相反

boolean flag = true;
boolean flag2 = !flag;
System.out.println(flag ^ flag2); //true

 

逻辑异或(^):两个条件不一样为真,否则为假

  • 练习



boolean x = true;
boolean y = false;
short z = 46;
if ((z++==46) && (y = true)) z++;
if ((x=false) || (++z==49)) z++; //这里x=false为假
System.out.println("z=" + z); //z=50
System.out.println("x=" + x + " " + "y=" + y); //x=false y=true

 

if语句里x赋值为真就为真,赋值为假就为假,注意赋值和判等

4.赋值运算符

  • 普通赋值:

(1) 运算顺序从左往右 int num = a + b + c

(2)赋值运算符的左边只能是变量,右边可以是变量、表达式、常量值。

  • 复合赋值运算符:

a+=1 等价于 a = a + 1 其他符号以此类推

复合赋值运算符(和自增运算)会进行强制类型转换

byte b = 127;
b+=1;
System.out.println(b);//128
byte b = 2;
b+=1;
b++;

 

我们之前说过byte、short和char进行运算时会自动转换为int类型,但是在这里:

b+=1; 等价于 b = (byte)(b + 1)

b++; 等价于 b = (byte)(b + 1 )

如果讲述上表达式改为:

byte b = 2;
b=b+1;

 

则会报错:从int转换到byte可能会有损失

5.三元运算符(Ternary operator)

 

 



int a = 10, b = 20;
int result = a > b ? a++ : b--;
 System.out.println(result); //20
 System.out.println(a); //10
 System.out.println(b); //19

 

这里 a > b 判断结果为假 ,所以执行第二个表达式 b--,b--赋值给result的时候是先赋值再-1,所以result的输出是20,而因为没执行第一个表达式所以a的值保持不变。

  • 注意事项:两个表达式的类型要和接收变量的类型保持一致,如果不一致也要是可以进行自动类型转换的(小单位赋值给大单位),或者手动加上强制类型转换



int a = 10, b = 20;
int c = a > b ? 1.2 : 1.5; //x 错误写法
double c = a > b ? 1.2 : 1.5; // √

int c = a > b ? (int)1.2 : (int)1.5; // √

 

  • 练习:找出三个数的最大值

int a = 10, b = 20, c = 6;
int max1 = a > b ? a : b;
int max2 = max1 > c ? max1 : c;
System.out.println("最大值为:" + max2); //20

 

这篇关于韩顺平Java03(运算符)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!