day04—运算符
1.Scanner
- 使用步骤
- 第一步:导入Scanner类 在有效代码的第一行,使用import导入Scanner类
java import java.util.Scanner;
- 第二步:实例化一个Scanner对象 方便后期调用Scanner的对象方法。
java Scanner input = new Scanner(System.in);
- 第三步:调用Scanner的对象方法,从而实现获取用户在DOS命名窗口输入的内容
java String name =input.nextLine();
- 知识点
- 执行Scanner的方法时,会阻塞代码的执行,直到用户输入内容并敲回车才会停止阻塞,并且把输入的内容赋值给等号左边的变量保存,继续执行后续代码!
以下方法获取的都是基本数据类型 nextByte()、nextShort()、nextInt()、nextLong() nextFloat()、nextDouble()、nextBoolean()
以下两个方法获取的都是字符串
next()、nextLine()
获取第一个空格之前的内容
next()、nextByte()、nextShort()、nextInt()、nextLong() nextFloat()、nextDouble()、nextBoolean()
获取一整行的内容 nextLine()
- 注意事项
- 输入的内容必须和调用input方法返回的数据类型相匹配,否则就会抛出异常。
- Scanner没有nextChar()这个方法,也就是说无法获取用户输入的字符。
如何手动实现获取用户输入的字符呢??? 先获取字符串,然后获取字符串中的第一个字符 思路:使用String类提供charAt(index)方法,输入一个 索引值则获取该索引对应的字符,索引从0开始! java String str = "hello"; char c = str.charAt(1);
-
- 执行以下代码,我们发现没有让用户输入姓名!
java int age = input.nextInt(); // 没有让用户输入姓名,直接返回结果:"" String name = input.nextLine();
原因:当执行nextInt()方法并敲回车,这时nextInt()获取第一个空格之前的内容,但是此时内存中还存在“空格及其之后的内容+换行”。 核心:获取第一个空格之前的内容的方法,都不会吃掉“换行”接着执行nextLine()方法时,会首先检查内存中是否存在“换行”,如果存在“换行”,则获取换行之前的内容,并吃掉内存中的“换行”。 如果不存在“换行”,则让用户在DOS命名窗口输入数据。 核心:先检查内存中是否存在换行,如果存在则直接获取换行之前的内容,并吃掉“换行”,而不让用户手动输入数据。java System.out.print("请输入年龄:"); int age = input.nextInt(); System.out.print("请输入姓名:"); // 解决方案:先执行一遍input.nextLine(),吃掉内存中的内容包含换行 input.nextLine(); String name = input.nextLine(); System.out.println("姓名:" + name + " 年龄:" + age);
2.算数运算符
- 二元运算符
+、-、、/、% +,可以做加法运算,还可以做连接符,表示正数。 -,可以做减法运算,表示负数 ,只能做乘法运算 /,只能做除法运算 %,取模运算或取余运算。(使用场合:判断m是否能被n整除!m % n 等于0,则证明m能被n整除 m % n 不等于0,则证明m不能被n整除)
注意事项:
- 1)两个整数做除法运算,返回的结果肯定是一个整数!
- 2)两个数做除法运算的时候,分母不能为0,否则抛出算数异常!
- 一元运算符
- ++,自增运算符
++num或num++,都等效于:num = num + 1; ++num和num++的区别(和别的操作数参与运算): ++num,先自增,后运算 num++,先运算,后自增
-
- --,自减运算符 --num或num--,都等效于:num = num - 1; --num和num--的区别(和别的操作数参与运算): --num,先自减,后运算 num--,先运算,后自减
- 随堂练习: 1)int a = 3, b = 4; 求a++ / 3 + --b * 2 - a-- % 6 + b++ * 3 - ++b的值。
java a: 3 b: 5 sum: 3/3 + 3*2 - 4%6 + 3*3 - 5 = 7 1 + 6 - 4 + 9 - 5
2)int num = 5; num = num++;请问代码执行后num的值为多少?
3.赋值运算符
- =
- 把等号右边表达式的结果赋值给等号左边的变量或final修饰的常量保存!
- 随堂练习:
1)交换两个变量的值,使用两种方式来实现!java // 方案一 int temp = num1; num1 = num2; num2 = temp; a)使用一个零时变量来实现 优点:好理解 缺点:需要额外声明一个变量,浪费内存空间!
java // 方案二 num1 = num1 + num2; // num1 = 8 num2 = num1 - num2; // num2 = 3 num1 = num1 - num2; // num1 = 5 b)不使用一个零时变量来实现 优点:无需定义零时变量,节省内存空间! 缺点:不好理解,建议边写边推算! 补充:先一加,后两减!
java c)通过位运算来实现 优点:运算效率特别高(执行的是二进制操作) 缺点:特别不好理解!
4.扩展赋值运算符
- 解释
属于“赋值运算符”和“算数运算符(二元运算符)”的综合体!java m += n, 等效于:m = (m的数据类型)(m + (n)); m -= n, 等效于:m = (m的数据类型)(m - (n)); m *= n, 等效于:m = (m的数据类型)(m * (n)); m /= n, 等效于:m = (m的数据类型)(m / (n)); m %= n, 等效于:m = (m的数据类型)(m % (n));
- 注意事项:
1)扩展赋值运算符是一个整体,中间不能加空格,错误演示:m % = n; - 常见面试题:
1)请问一下代码输出结果是什么????num = 20java int num = 4; num *= 2 + 3; // 等效于:num = num*(2 + 3)
2)short num = 11; num = num + 1; // 错误 和short num = 11; num += 1 + 2; // 正确 哪一个正确呢?java /* short num = 11; num += 1; // 等效于:num = (short)(num + (1)); System.out.println(num); */
3)int sum += 30; 请问这行语句语法是否正确???错误 错误,int sum += 30; 等效于:int sum; sum = sum + 30
5.关系运算符
- , <, >=, <=, ==, !=
> 关系运算符返回的结果肯定是boolean类型,条件成立则返回true,否则返回false > ==,判断两个数值是否相等!目前强调作用于基本数据类型 > !=,判断两个数值是否不相等!目前强调作用于基本数据类型 - 注意事项:
1)关系运算符是一个整体,不能中间添加空格。
2)== 判断两个数值(基本数据类型)是否相同,不能判断两个引用数据类型的内容是否相同。 例如:判断两个字符串的内容是否相同,那么就不能使用== 来实现了! 原因:==作用于引用数据类型,判断的是地址是否相同(面向对象学习) 解决:判断两个字符串内容是否相同???? 使用String类提供的equals()方法 例如:判断str1和str2这两个字符串内容是否相同,可以这么做 str1.equals(str2)java String str1 = input.nextLine(); String str2 = "hello"; // 判断字符串内容是否相同 System.out.println(str1.equals(str2)); // 正确 // System.out.println(str2 == str1); // 错误
3)请问以下代码输出结果为什么???"flag的值为true"java boolean flag = false; if(flag = true) { // 判断flag是否为true System.out.println("flag的值为true"); } else { System.out.println("flag的值为false"); }
老鸟建议:把常量放在“==”左边,变量放在“==”的右边!
6.逻辑运算符
- &, |, ^, &&, ||, !
参与逻辑运算的数据类型必须是boolean类型,并且返回的结果也是boolean类型 - &,与,二元运算符
- 结论:
只有两边都为true,那么结果才为true。 只要有一边为false,那么结果就是false。
辅助记忆:小明与小红来一趟办公室!
- |,或,二元运算符
- 结论:
只有两边都为false,那么结果才为false。 只要有一边为true,那么结果就是true。 辅助记忆:小明或小红来一趟办公室!
- ^,异或,二元运算符
- 结论:
两边相同,则返回false;两边不相同,则返回true。
- &&,短路与,二元运算符
- &和&&相同点:
结论一模一样,返回的结果一模一样!
-
- &和&&不同点:
核心:执行的过程不一样! 当左边表达式结果为false时,执行的过程不一样! &&:如果左侧表达式的结果为false,那么右侧表达式不会执行,直接返回左侧表达式的结果 &:如果左侧表达式的结果为false,那么右侧表达式依旧会执行,直接返回左侧表达式的结果 当左边表达式结果为true时,执行的过程没有区别! &&,&:如果左侧表达式的结果为true,那么右侧表达式肯定会执行,并且返回右侧表达式的结果! 补充:现实开发中,我们使用&&较多,因为效率高!
- ||,短路或,二元运算符
- |和||相同点:
结论一模一样,返回的结果一模一样!
-
- |和||不同点:
核心:执行的过程不一样! 当左边表达式结果为true时,执行的过程不一样! ||:如果左侧表达式的结果为true,那么右侧表达式不会执行,直接返回左侧表达式的结果 |:如果左侧表达式的结果为true,那么右侧表达式依旧会执行,直接返回左侧表达式的结果 当左边表达式结果为false时,执行的过程没有区别! ||,|:如果左侧表达式的结果为false,那么右侧表达式肯定会执行,并且返回右侧表达式的结果! 补充:现实开发中,我们使用||较多,因为效率高!
- !,非,一元运算符
- 结论:true取反的结果就是false。 false取反的结果就是true。