【原】Java学习笔记004 - 运算符

 1 package cn.temptation;
 2 
 3 public class Sample01 {
 4     public static void main(String[] args) {
 5         // 运算符:对常量 或是 变量进行操作的符号
 6         // 分为:算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符
 7         
 8         // 1、算术运算符:+、-、*、/、%、++、--
 9         int i = 7;
10         int j = 2;
11         
12         System.out.println(i + j);        // 9
13         System.out.println(i - j);        // 5
14         System.out.println(i * j);        // 14
15         // int类型的变量 和 int类型的变量做除法,得到的结果是int类型
16         System.out.println(i / j);        // 3
17         
18         // 要求:就想得到3.5的结果,怎么办?
19         // 下面的写法不会得到3.5的结果,只会得到3.0的结果,因为只是声明了一个double类型的变量来接收int类型变量和int类型变量相除的结果
20         // 对于相除的结果没有内容上的影响
21         double result = i / j;
22         System.out.println(result);                // 3.0
23         System.out.println((double)(i / j));    // 3.0
24         
25         // 做一个尝试:使用double类型的字面量常量 和 int类型的字面量常量做除法,会得到double类型的字面量常量
26         //                 即int类型的字面量常量在做除法时进行了类型提升
27         System.out.println(7.0 / 2);            // 3.5
28         
29         // 类型的提升:把int类型的变量先和double类型的字面量常量1.0做乘法,让结果为double类型,再除以int类型的变量,得到的是double类型的结果
30         System.out.println(i * 1.0 / j);        // 3.5
31         
32         System.out.println(i % j);                // 1
33     }
34 }
 1 package cn.temptation;
 2 
 3 public class Sample02 {
 4     public static void main(String[] args) {
 5         // 减号 - 还可以做负号
 6         byte i = 1;
 7         // Type mismatch: cannot convert from int to byte
 8         // byte j = -i;
 9         byte j = (byte) -i;
10         System.out.println(i);
11         System.out.println(j);
12         
13         byte x = -128;
14         byte y = (byte) -x;
15         System.out.println(x);        //    -128
16         System.out.println(y);        //  -128
17         
18         /*
19          * x:        -128(没有超出byte范围)
20          * -x:        128(int类型):0000 0000 0000 0000 0000 0000 1000 0000
21          * 因为强制类型转换为byte类型的变量y,所以要做截取
22          * 
23          * 补码:    1000 0000        符号位的1表明是负数
24          * 反码:    1111 1111
25          * 原码:    1000 0000
26          */
27         
28         // 产生异常:java.lang.ArithmeticException: / by zero
29 //        int k = 123 / 0;
30 //        System.out.println(k);
31         
32         // 产生异常:java.lang.ArithmeticException: / by zero
33 //        int k = 0 / 0;
34 //        System.out.println(k);
35         
36 //        double k = 123.45 / 2;
37 //        System.out.println(k);        // 61.725
38 //        
39 //        double m = 123.45 / 0;
40 //        System.out.println(m);        // Infinity(正无穷大)
41 //        
42 //        double n = -123.45 / 0;
43 //        System.out.println(n);        // -Infinity(负无穷大)
44 //        
45 //        double result1 = 0.0 / 0;
46 //        System.out.println(result1);        // NaN(Not a Number  不是一个数)
47 //        
48 //        double result2 = -0.0 / 0;
49 //        System.out.println(result2);        // NaN(Not a Number  不是一个数)
50         
51 //        float k = 123.45F / 2;
52 //        System.out.println(k);        // 61.725
53 //        
54 //        float m = 123.45F / 0;
55 //        System.out.println(m);        // Infinity(正无穷大)
56 //        
57 //        float n = -123.45F / 0;
58 //        System.out.println(n);        // -Infinity(负无穷大)
59 //        
60 //        float result1 = 0.0F / 0;
61 //        System.out.println(result1);        // NaN(Not a Number  不是一个数)
62 //        
63 //        float result2 = -0.0F / 0;
64 //        System.out.println(result2);        // NaN(Not a Number  不是一个数)
65         
66         int result1 = 11 % 4;
67         System.out.println(result1);        // 3
68         
69         double result2 = 11.0 % 3;
70         System.out.println(result2);        // 2.0
71         
72         double result3 = 11.0 % 3.5;
73         System.out.println(result3);        // 0.5
74         
75         // 产生异常:java.lang.ArithmeticException: / by zero
76 //        int result4 = 11 % 0;
77 //        System.out.println(result4);
78         
79         double result5 = 11.0 % 0;
80         System.out.println(result5);        // NaN(Not a Number  不是一个数)
81     }
82 }
 1 package cn.temptation;
 2 
 3 public class Sample03 {
 4     public static void main(String[] args) {
 5         // ++ 自增运算符                  -- 自减运算符
 6         int i = 2;
 7         System.out.println(i);        // 2
 8         
 9         // 1、单独使用自增运算符:不论++放在需要自增的变量的后面还是前面,都会在操作后让变量的值自增1
10         // 自增运算符放在需要自增的变量的后面
11         // i++;
12         // 自增运算符放在需要自增的变量的前面
13 //        ++i;
14         
15 //        System.out.println(i);        // 3
16         
17         // 2、非单独使用自增运算符
18         // 下句语句一上来先把i的值赋值给j,然后i自己做自增(先赋值再自增)
19 //        int j = i++;        // j = 2, i = 3
20         // 下句语句一上来先i自己做自增,然后把i的值(自增后的值)赋值给j(先自增再赋值)
21         int j = ++i;        // j = 3, i = 3
22         
23         System.out.println("j的值为:" + j);
24         System.out.println("i的值为:" + i);
25     }
26 }
 1 package cn.temptation;
 2 
 3 public class Sample04 {
 4     public static void main(String[] args) {
 5         // 关于自增的一道题
 6         int i = 2;
 7         int j = 3;
 8         
 9         j = i++;
10         
11         System.out.println("i的值为:" + i);    // 3
12         System.out.println("j的值为:" + j); // 2
13         
14 //        j = i++ + ++i+i*4;
15         // 上句等价于
16         j = (i++) + (++i) + (i * 4);
17         /*
18          * 计算过程:
19          * i++这个表达式,此时i为3,首先是赋值,再让i自增,所以这个表达式(i++)的结果为3,i操作后的值为4
20          * ++i这个表达式,此时i为4,首先让i自增,再赋值,所以i操作后的值为5,这个表达式(++i)的结果为5
21          * i * 4这个表达式,此时i为5,进行乘法,所以这个表达式(i*4)的结果为20
22          * 
23          * 最后三个表达式的结果相加:3 + 5 + 20 = 28
24          */
25         
26         System.out.println(j);
27     }
28 }
 1 package cn.temptation;
 2 
 3 public class Sample05 {
 4     public static void main(String[] args) {
 5         // 加号 + 的用法:
 6         /*
 7          * 1、作为算术运算符的加号
 8          * 2、作为正数的符号 +
 9          * 3、作为字符串的连接符号
10          */
11         int result = 1 + 2;
12         System.out.println(result);
13         
14         int x = +99;
15         System.out.println(x);
16         
17         System.out.println("北京" + 2008);
18     }
19 }
 1 package cn.temptation;
 2 
 3 public class Sample06 {
 4     public static void main(String[] args) {
 5         // 2、赋值运算符:=、+=、-=、*=、/=、%=
 6         
 7         // Java中的一个等号 = 表示的是将等号(赋值号)右侧的内容赋值给等号(赋值号)左侧的变量,习惯上称之为赋值号
 8         
 9         int i = 2;
10         // 完整描述:把整型的字面量常量2 赋值给 整型类型的变量i
11         // 赋值号左侧的部分称为声明
12         // 赋值号右侧的部分称为赋值
13         System.out.println(i);
14         
15         // 一行语句中声明多个变量
16         int x, y;
17         
18         // 下句语句先把123赋值给变量y,再将y赋值给x,所以最后x和y的值均为123
19         x = y = 123;
20         
21         System.out.println(x);
22         System.out.println(y);
23         
24         // 以+=为例,表示的是将赋值号(+=)左侧的变量 和 右侧的内容按照=之前的运算符进行相应的运算,操作后的结果再赋值给左侧的变量
25         int j = 3;
26         System.out.println(j);        // 3
27         // j += 4;
28         // 上句等价于
29         j = j + 4;
30         System.out.println(j);        // 7
31         
32 //        byte k = 5;
33 //        // Type mismatch: cannot convert from int to byte
34 //        k = k + 3;
35 //        System.out.println(k);
36         
37         // 对于非默认数据类型的数据,使用带有算术运算符的赋值运算符时,会自动进行强制类型转换
38         byte k = 5;
39 //        k += 3;
40         // 上句等价于
41         k = (byte) (k + 3);
42         System.out.println(k);
43     }
44 }
 1 package cn.temptation;
 2 
 3 public class Sample07 {
 4     public static void main(String[] args) {
 5         // 3、比较运算符:==、!=、>、<、>=、<=
 6         
 7         // Java中使用 == 表示相等(内容相等)
 8         // 比较的结果必然是一个boolean类型的值
 9         int i = 2;
10         int j = 3;
11         int k = 2;
12         
13 //        System.out.println(i == j);        // false
14 //        System.out.println(i == k);        // true
15 //        System.out.println(i + j == j + k);            // true
16         // 上句等价于
17 //        System.out.println((i + j) == (j + k));        // true
18         
19         System.out.println(i != j);        // true
20         System.out.println(i != k);        // false
21         
22         System.out.println(i > j);        // false
23         System.out.println(i < j);        // true
24         System.out.println(i >= j);        // false
25         System.out.println(i <= j);        // true
26         
27         System.out.println(k <= k);        // true
28     }
29 }
 1 package cn.temptation;
 2 
 3 public class Sample08 {
 4     public static void main(String[] args) {
 5         // 逻辑运算符:&、|、!、^、&&、||
 6         // 参与运算的变量或表达式的值均为boolean类型
 7         
 8         /*
 9          * &:逻辑与,有一个是false得到的结果就是false
10          * |:逻辑或,有一个是true得到的结果就是true
11          * !:逻辑非,颠倒黑白
12          * ^:逻辑异或,类似吸铁石
13          */
14 //        System.out.println(true & true);        // true
15 //        System.out.println(true & false);        // false
16 //        System.out.println(false & true);        // false
17 //        System.out.println(false & false);        // false
18         
19 //        System.out.println(true | true);        // true
20 //        System.out.println(true | false);        // true
21 //        System.out.println(false | true);        // true
22 //        System.out.println(false | false);        // false
23         
24 //        System.out.println(!true);                // false
25 //        System.out.println(!false);            // true
26         
27 //        System.out.println(true ^ true);        // false
28 //        System.out.println(true ^ false);        // true
29 //        System.out.println(false ^ true);        // true
30 //        System.out.println(false ^ false);        // false
31         
32         /*
33          * &&:逻辑与(聪明与/短路与)如果参与运算的第一个变量或表达式为false,得到的结果就是false,其他的变量或表达式就不去执行;如果多个逻辑与参与运算,以此类推
34          * ||:逻辑或(聪明或/短路或)如果参与运算的第一个变量或表达式为true,得到的结果就是true,其他的变量或表达式就不去执行;如果多个逻辑或参与运算,以此类推
35          */
36 //        System.out.println(true && true);        // true
37 //        System.out.println(true && false);        // false
38 //        // eclipse会显示警告:Dead code(位于后一个变量或表达式上)
39 //        System.out.println(false && true);        // false
40 //        // eclipse会显示警告:Dead code(位于后一个变量或表达式上)
41 //        System.out.println(false && false);    // false
42         
43         // eclipse会显示警告:Dead code(位于后一个变量或表达式上)
44         System.out.println(true || true);        // true
45         // eclipse会显示警告:Dead code(位于后一个变量或表达式上)
46         System.out.println(true || false);        // true
47         System.out.println(false || true);        // true
48         System.out.println(false || false);    // false
49         
50         // 在实际的开发中,常用的是:!、^、&&、||
51     }
52 }
 1 package cn.temptation;
 2 
 3 public class Sample09 {
 4     public static void main(String[] args) {
 5         // 结合自增 和 逻辑运算符的一道题
 6         int i = 2;
 7         int j = 3;
 8         
 9         System.out.println((++i == 2) && (j++ == 3));        // false
10         // 因为++i先自增再赋值,表达式++i的结果为3,所以++i == 2这个表达式的结果为false
11         // 又因为使用聪明与,第一个表达式为false,后续的表达式不会执行,所以i = 3, j = 3
12         
13         // 问:最终显示i和j的值为多少?
14         System.out.println(i);            // 3
15         System.out.println(j);            // 3
16     }
17 }
 1 package cn.temptation;
 2 
 3 public class Sample10 {
 4     public static void main(String[] args) {
 5         // 位运算符:&、|、~、^、>>、>>>、<<
 6         /*
 7          * 规则:(在二进制中)操作的是补码
 8          * &:位与,进行操作的两个数的同一位上,有一个是0,该位运算的结果就是0
 9          * |:位或,进行操作的两个数的同一位上,有一个是1,该位运算的结果就是1
10          * ~:位非,进行操作的数按位取反
11          * ^:位异或,进行操作的两个数的同一位上,两个相同为0,两个不同为1
12          */
13 //        System.out.println(2 & 3);        // 2
14 //        System.out.println(2 | 3);        // 3
15 //        System.out.println(~2);            // -3
16 //        System.out.println(2 ^ 3);        // 1
17         /*
18          * 2:0000 0010
19          * 3:0000 0011
20          * 
21          * 2
22          * 原码:0000 0000 0000 0000 0000 0000 0000 0010
23          * 反码:0000 0000 0000 0000 0000 0000 0000 0010
24          * 补码:0000 0000 0000 0000 0000 0000 0000 0010
25          * 
26          * ~2:(操作补码)
27          * 补码:1111 1111 1111 1111 1111 1111 1111 1101
28          * 反码:1111 1111 1111 1111 1111 1111 1111 1100
29          * 原码:1000 0000 0000 0000 0000 0000 0000 0011
30          */
31         
32         // 位异或^的用法:
33         // 规律:一个数连续两次和另一个数做位异或运算,得到其本身的值
34         // 可以应用在简单的加密解密中,连续两次进行位异或的那个数可以设置为密钥
35         System.out.println(2 ^ 3 ^ 3);        // 2
36         
37         /*
38          * <<:左移,左边的高位删除,右边的低位补0
39          * >>:右移,因为左侧的最高位是符号位,所以要区分是0还是1:左侧的最高位是0,左侧补0;左侧的最高位是1,左侧补1
40          * >>>:无符号右移,不论左侧的最高位是0还是1,左侧补0
41          */
42         System.out.println(2<<1);            // 4
43         System.out.println(2>>1);            // 1
44         System.out.println(-2>>1);            // -1
45         System.out.println(-2>>>1);            // 2147483647
46         /*
47          * -2:
48          * 原码:1000 0000 0000 0000 0000 0000 0000 0010
49          * 反码:1111 1111 1111 1111 1111 1111 1111 1101
50          * 补码:1111 1111 1111 1111 1111 1111 1111 1110
51          * 
52          * 右移1位操作(操作补码)
53          * 补码:1111 1111 1111 1111 1111 1111 1111 1111
54          * 反码:1111 1111 1111 1111 1111 1111 1111 1110
55          * 原码:1000 0000 0000 0000 0000 0000 0000 0001
56          * 
57          * 无符号右移1位操作(操作补码)
58          * 补码:0111 1111 1111 1111 1111 1111 1111 1111
59          * 反码:0111 1111 1111 1111 1111 1111 1111 1111
60          * 原码:0111 1111 1111 1111 1111 1111 1111 1111
61          */
62     }
63 }
 1 package cn.temptation;
 2 
 3 public class Sample11 {
 4     public static void main(String[] args) {
 5         // 依据参与运算的元素个数分类:
 6         // 1、一元运算符:!、~
 7         // 2、二元运算符:+、-、*、/、%、&、|、&&、||、^等等
 8         // 3、三元运算符:由两个符号组成的复合运算符       ? :
 9         
10         // 三元运算符:只有一个
11         // 格式:(比较表达式) ? (比较表达式为真值时,执行的内容) : (比较表达式为假值时,执行的内容);
12         
13         int i = 2;
14         int j = 3;
15         int result = ((i > j) ? i : j);
16         System.out.println(result);
17     }
18 }
 1 package cn.temptation;
 2 
 3 public class Sample12 {
 4     public static void main(String[] args) {
 5         // 需求:取得给定的两个数字中较大的一个(使用三元运算符来做)
 6 //        int x = 28;
 7 //        int y = 17;
 8 //        int max = (x > y) ? x : y;
 9 //        System.out.println(max);
10         
11         // 需求:取得给定的三个数字中最大的一个(使用三元运算来做)
12         /*
13          * 思路:
14          * 1、要获取三个数字中最大的,先拿出两个数字比一比,先找出这两个数字中较大的一个
15          * 2、拿着比较出来的较大的那个数字再和剩下的那个数字做比较,如果剩下的那个数字比它大,那么剩下的那个数字就是最大的
16          *         否则,比较出来的较大的那个数字就是最大的
17          */
18         int a = 5;
19         int b = 4;
20         int c = 6;
21         
22         // 分步操作
23 //        // 1、要获取三个数字中最大的,先拿出两个数字比一比,先找出这两个数字中较大的一个
24 //        int temp = (a > b) ? a : b;
25 //        // 2、拿着比较出来的较大的那个数字再和剩下的那个数字做比较
26 //        int max = (temp > c) ? temp : c;
27 //        System.out.println("最大的数字为:" + max);
28         
29         // 如果就要在一行语句中写,如何实现?需要使用三元运算符的嵌套
30         // 如下写法,在实际开发中不要这样写,可读性很差,纯炫技耳!
31         int max = (a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c);
32         System.out.println("最大的数字为:" + max);
33     }
34 }
 1 package cn.temptation;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Sample13 {
 6     public static void main(String[] args) {
 7         // 需求:通过键盘的录入,把输入的数据赋值给变量(交互操作的需求)
 8 
 9         // 创建一个扫描器对象
10         Scanner input = new Scanner(System.in);
11         System.out.println("输入一个数字:");
12         // 接收用户的键盘的录入,并赋值给声明的变量
13         int i = input.nextInt();
14         // 扫描器对象使用完毕后,关闭
15         input.close();
16         
17         System.out.println("用户通过键盘录入的数字为:" + i);
18     }
19 }
 1 package cn.temptation;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Sample14 {
 6     public static void main(String[] args) {
 7         // 需求:通过键盘录入三个数字,比较获取其中最大的一个
 8 
 9         // 声明三个变量来接收键盘录入的三个数字
10         Scanner input = new Scanner(System.in);
11         System.out.println("输入第一个数字:");
12         int i = input.nextInt();
13         System.out.println("输入第二个数字:");
14         int j = input.nextInt();
15         System.out.println("输入第三个数字:");
16         int k = input.nextInt();
17         input.close();
18 
19         // 分步操作
20         int temp = (i > j) ? i : j;
21         int max = (temp > k) ? temp : k;
22         System.out.println("输入的数字:" + i + "," + j + "," + k + "中,最大的数字为:" + max);
23     }
24 }

 

posted @ 2017-02-25 22:49  {name:"代码屠夫"}  阅读(335)  评论(0编辑  收藏  举报