韩顺平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

 

 

 

  •  运算符优先级(从高到低依次降低)

 

 

 

 标识符

 

 

 

  •  关键字和保留字

 

 

 

 

 

 

 

 

 

 

键盘输入

Scanner sc = new Scanner(System.in);
System.out.println("please enter name:");
String name = sc.nextLine();
System.out.println("your name is :"+ name);
System.out.println("please enter r:"); 
double r = sc.nextDouble(); //其他类型同理  
System.
out.println("s = " + 3.14*r*r);

 

 char gender = sc.next().charAt(0); //接收字符的方法

 

 进制

  • 二进制(binary)
  • 八进制(octal)
  • 十进制(decimal)
  • 十六进制(hexadecimal)

 

 

 

  • 2 -> 10(其他转10以此类推)

 

 

 

 

 

 

 

  • 10 - > 2(10转其他以此类推)

 

 

 

  •  2 - >8

 

 

 

  • 2 -> 16

 

 

 

  • 8 - >2

 

 

 

  • 16 -> 2

 

 

  • 原码、反码和补码

 

 

 补码使得负数和整数能够一同运算

  • 位运算符

 

 

 

 

System.out.println(2 & 3);
/*2是一个int型变量 并且是正整数 占四个字节 三码合一
原码:0000 0000 0000 0010
反码:0000 0000 0000 0010
补码:0000 0000 0000 0010
3同理
原码:0000 0000 0000 0011
反码:0000 0000 0000 0011
补码:0000 0000 0000 0011
在运算是是两数的补码进行运算
     0000 0000 0000 0010
     0000 0000 0000 0011
得到:0000 0000 0000 0010
符号位是0所以是一个正整数 三码合一 所以转换成十进制是2
*/

 

System.out.println(~ 2);
/*2是一个int型变量 并且是正整数 占四个字节 三码合一
原码:0000 0000 0000 0010
反码:0000 0000 0000 0010
补码:0000 0000 0000 0010
进行按位取反
得到:1111 1111 1111 1101
符号位是1所以是一个负整数,输出时需要将补码转换成原码
 反码是补码-1,码转换时注意符号位不变
反码:1111 1111 1111 1100
原码:1000 0000 0000 0011
所以转换成十进制是-3
 */

其他以此类推

 

 

 正整数右移一位相当于/2,左移一位相当于*2

而负数在计算机中采用补码表示

 

System.out.println( -5 >> 2); // -2
        /**
         * -5
         * 原码:1000 0000 0000 0101
         * 反码:1111 1111 1111 1010
         * 补码:1111 1111 1111 1011
         * 右移一位(高位用符号位1来补全)
         *      1111 1111 1111 1101
         * 右移两位
         *      1111 1111 1111 1110
         * 结果的反码:
         *      1111 1111 1111 1101
         * 结果的原码:
         *      1000 0000 0000 0010
         * 转换为10进制是-2
         */

 

posted @ 2021-12-04 05:53  紫英626  阅读(37)  评论(0编辑  收藏  举报

紫英