目录一. 运算符1.1 运算符介绍1.2 算术运算符1.2.1 基本四则运算符加减乘除模 - * / %1.2.2 增量运算符 - * / %1.2.3 自增自减运算符 --1.3 关系运算符1.4 逻辑运算符重点1.4.1 逻辑与1.4.2 逻辑或||1.4.3 逻辑非!1.4.4 短路求值1.5 位运算符1.6 移位运算符了解1.7 条件运算符三目运算符1.8 运算符的优先级二. 程序逻辑控制2.1 顺序结构2.2 分支结构2.2.1 if语句2.2.2 switch 语句2.3 循环结构2.3.1 while循环2.3.2 for循环2.3.3 do-while循环2.3.4 循环控制关键字三. 总结一. 运算符1.1 运算符介绍计算机最基本的用途就是进行数学运算如aba-b等这些-*/之类就叫运算符不同运算符的操作含义不同。作为一门计算机语言Java提供了一套丰富的运算符用来操作变量。Java中运算符主要可分为以下算术运算符-*/关系运算符逻辑运算符位运算符移位运算符以及条件运算符。1.2 算术运算符1.2.1 基本四则运算符加减乘除模 - * / %模运算就是数学中除法的余数如10 / 3 商3余1那么10 % 3 1。这几个运算符不多介绍。注意这些运算符都是二元运算符使用时必须要有左右两个操作数int / int 结果仍是int且结果向下取整舍弃小数部分做除法和取模时右操作数不能为00不能做被除数%不仅能对整数取模也可以对小数取模但没有意义一般都是对整数二元运算符两侧操作类型不一致时向类型大的提升上节的类型提升1.2.2 增量运算符 - * / %这种运算符操作完成后会将结果赋值给左操作数int a 1; int b 3; int c a b; //c的值为4 // a b 相当于 a a b其余几个也同理。需要注意的是增量运算符在计算时可以不进行强制类型转换double a 3.14; int b 2; b a; //不会报错 b b a; //编译报错,等号右边被提升为double类型1.2.3 自增自减运算符 --是给变量值1--是给变量值-1但前置与后置有一定区别建议少用这个运算符public class HelloWorld { public static void main(String[] args) { int a 1; a; // 后置 表示给a的值加1此时a的值为2 System.out.println(a); // 注意后置是先使用变量原来值表达式结束时给变量1因此输出2 System.out.println(a); // 输出3 a; // 前置 表示给a的值加1 System.out.println(a); // 注意前置是先给变量1然后使用变量中的值因此输出5 System.out.println(a); // 输出5 // --操作符给操作-1与含义类似 } }注意若单独使用【前置】与【后置】没有任何区别若混合使用【前置】先1再使用变量1之后的值【后置】先使用变量原来的值表达式结束时给变量1只有变量才能使用自增/自减操作符常量不能用因为常量不允许修改。1.3 关系运算符关系运算符是用来做判断的比较两个变量之间关系主要有六个 ! 其计算结果为 true 或 falseint a 10; int b 20; // 注意在Java中 表示赋值要与数学中的含义区分 // 在Java中 表示相等 System.out.println(a b); // false System.out.println(a ! b); // true System.out.println(a b); // true System.out.println(a b); // false System.out.println(a b); // true System.out.println(a b); // false注意Java中需要多次判断时不能连着写如3 a 5要与数学作区分1.4 逻辑运算符重点逻辑运算符主要用来表示多个表达式之间的关系同时也是写判断逻辑的核心主要有三个 || !运算结果都是boolean类型1.4.1 逻辑与语法规则表达式1 表达式2左右表达式必须是boolean类型的结果。特点为一假则假即两个表达式都为真结果才为真只要有一个假结果就是假。表达式1表达式2结果真真真真假假假真假假假假System.out.println(a 100 b 100); // 左为假 且 右为假 则结果为假1.4.2 逻辑或||语法规则表达式1 || 表达式2左右表达式必须是boolean类型的结果。特点为一真则真。表达式1表达式2结果真真真真假真假真真假假假1.4.3 逻辑非!语法规则! 表达式特点为真变假假变真表达式结果真假假真1.4.4 短路求值和||都遵守短路求值的规则System.out.println(10 20 10 / 0 0); // 打印 false System.out.println(10 20 || 10 / 0 0); // 打印 true正常情况下10 / 0 会导致程序抛出异常但上面代码是能正常执行的说明10/0并没有被真正执行到。注意对于 , 如果左侧表达式值为 false, 则表达式结果一定是 false, 无需计算右侧表达式.对于 ||, 如果左侧表达式值为 true, 则表达式结果一定是 true, 无需计算右侧表达式.Java中不仅有||还有和|这两个位运算符马上就会说到 和 | 如果表达式结果为 boolean 时, 也表示逻辑运算. 但与 || 相比, 它们不支持短路求值。也就是说不管左边表达式是否能判断出结果右边表达式都会执行1.5 位运算符Java 中数据存储的最小单位是字节而数据操作的最小单位是比特位. 字节是最小的存储单位1字节等于8bit位多个字节组合在一起可以表示各种不同的数据。位运算符主要有四个: | ~ ^ 除 ~ 是一元运算符外其余都是二元运算符。位操作表示 按二进制位运算. 计算机中都是使用二进制来表示数据的(01构成的序列), 按位运算就是在按照二进制位的每一位依次进行计算。如何理解位运算呢以上面int类型为例int类型大小为固定的4字节4字节又相当于32bit位我们写的这些数字在计算机中都是以2进制形式存储的比如int a 1; 这里的1如果要以2进制位的形式来表示就是0000 0000 0000 0000 0000 0000 0000 0001 (int对应32位)我们下面通过例子来说明位运算符按位与如果两个二进制位都是1则结果为1否则结果为0.int a 10; int b 20; System.out.println(a b);为了方便我们这里写二进制位只写后八位实际上肯定是以32为存储的但是前面24位不影响结果进行按位运算首先要把10和20转成2进制分别为1010和10100进制转换这里可以参考其他网上资料简单来说二进制就是满2进1十进制满10进1其他没啥区别0000 1010 //10的二进制0001 0100 //20的二进制0000 0000 //按位与后得到0的二进制按位或|如果两个二进制位有一个为1结果为1否则结果为0int a 10; int b 20; System.out.println(a | b);0000 1010 //10的二进制0001 0100 //20的二进制0001 1110 //按位或后得到30的二进制注意: 当 和 | 的操作数为整数(int, short, long, byte) 的时候, 表示按位运算, 当操作数为 boolean 的时候, 表示逻辑运算.按位取反 ~: 如果该位为 0 则转为 1, 如果该位为 1 则转为 0int a 0xf; System.out.printf(%x\n, ~a)0x 前缀的数字为 十六进制 数字. 十六进制可以看成是二进制的简化表示方式. 一个十六进制数字对应 4 个二进制位.0xf 表示 10 进制的 15, 也就是二进制的 1111printf 能够格式化输出内容, %x 表示按照十六进制输出.\n 表示换行符按位异或 ^: 如果两个数字的二进制位相同, 则结果为 0, 相异则结果为 1int a 0x1; int b 0x2; System.out.printf(%x\n, a ^ b);注意如果两个数相同则异或的结果为01.6 移位运算符了解移位运算符有三个: 都是二元运算符且都是按照二进制比特位来运算的。左移 最左侧位不要了最右侧补0int a 0x10; System.out.printf(%x\n, a 1); // 运行结果(注意, 是按十六进制打印的) 200001 0000 //10的十六进制 (对应十进制为16)0010 0000 //左移一位后十进制为32对应十六进制为20以16进制打印结果为20注意向左移位时丢弃的是符号位因此正数左移可能会变成负数。右移 算术右移最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)int a 0x10; System.out.printf(%x\n, a 1); // 运行结果(注意, 是按十六进制打印的) 8 int b 0xffff0000; System.out.printf(%x\n, b 1); // 运行结果(注意, 是按十六进制打印的) ffff80000001 0000 //10的十六进制 (对应十进制为16)0000 1000 //右移1位后十进制为8对应16进制为8以16进制打印还是8下面的也同理无符号右移 逻辑右移最右侧位不要了, 最左侧补 0.int a 0xffffffff; System.out.printf(%x\n, a 1); // 运行结果(注意, 是按十六进制打印的) 7fffffff注意左移 1 位, 相当于原数字 * 2. 左移 N 位, 相当于原数字 * 2 的N次方. 【针对正数而言】右移 1 位, 相当于原数字 / 2. 右移 N 位, 相当于原数字 / 2 的N次方. 【针对正数而言】由于计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的N次方的时候可以用移位运算代替. 【针对正数而言】移动负数位或者移位位数过大都没有意义.有兴趣的话也可以了解下负数进行左移右移时如何计算结果这里不过多展开1.7 条件运算符三目运算符条件运算符只有一个表达式1 ? 表达式2 : 表达式3当 表达式1 的值为 true 时, 整个表达式的值为 表达式2 的值;当 表达式1 的值为 false 时, 整个表达式的值为 表达式3 的值.这是Java中唯一一个三目运算符更是条件判断语句的简化写法.// 求两个整数的最大值 int a 10; int b 20; int max a b ? a : b;注意表达式2和表达式3的结果要是同类型的除非能发生类型隐式类型转换表达式不能单独存在其产生的结果必须要被使用。int a 10; int b 20; a b? a : b; // 报错Error:(15, 14) java: 不是语句1.8 运算符的优先级一条表达式中各个运算符可以混合起来用但运算符优先级不同如* / 优先级高于 -// 求a和b的平均值 int a 10; int b 20; int c a (b - a) 1; System.out.println(c);此时由于的优先级高于因此会先计算左侧内容整体为20再进行右移最终结果c10注意运算符之间是有优先级的. 具体的规则我们不必记忆. 在可能存在歧义的代码中加上括号即可int c a ((b - a) 1);了解实际上基本不会用到直接加表示最高优先级即可二. 程序逻辑控制2.1 顺序结构顺序结构就是按代码书写顺序一行一行从上到下执行调整代码顺序执行顺序也会变化。此处不多赘述2.2 分支结构2.2.1 if语句if语句有三种写法ifif-else if-else基本语法格式为if (布尔表达式) { // 语句 } //若布尔表达式结果为true执行if中语句否则不执行if (布尔表达式) { //语句1 } else { //语句2 } //if中布尔表达式成立执行语句1不成立执行语句2if (布尔表达式1) { //语句1 } else if (布尔表达式2) { //语句2 } else { //语句3 } //若布尔表达式1成立执行语句1 //若布尔表达式2成立执行语句2 //若上述条件都不成立执行语句3常见的就以上三种写法下面给出一个案例/* 例如 分数在 [90, 100] 之间的为优秀 分数在 [80, 90) 之前的为良好 分数在 [70, 80) 之间的为中等 分数在 [60, 70) 之间的为及格 分数在 [ 0, 60) 之间的为不及格 错误数据 */ public class HelloWorld { public static void main(String[] args) { //这里看不懂没关系后面会说到此时score的值为用户在键盘中输入的值 Scanner sc new Scanner(System.in); int score sc.nextInt(); if(score 90){ System.out.println(优秀); }else if(score 80){ System.out.println(良好); }else if(score 70){ System.out.println(中等); }else if(score 60){ System.out.println(及格); }else if(score 0){ System.out.println(不及格); }else{ System.out.println(错误数据); } } }关于上述语句第二个if(score 80)隐藏的前提条件就是if(score 90) 即后一个条件是在前一个条件不满足的基础上成立的看到这里就可以去写一个简单练习了比如判断一个年份是否是闰年这种只需要简单的条件判断就可以达成//判断闰年的标准 //1. 如果一个年份能被4整除但不能被100整除则是闰年 //2. 如果一个年份能被400整除也是闰年 public class HelloWorld { public static void main(String[] args) { int year 2000; if (year % 100 0) { // 判定世纪闰年 if (year % 400 0) { System.out.println(是闰年); } else { System.out.println(不是闰年); } } else { // 普通闰年 if (year % 4 0) { System.out.println(是闰年); } else { System.out.println(不是闰年); } } } }如果上面写法比较熟练了也可以采用下面写法public class HelloWorld { public static void main(String[] args) { Scanner sc new Scanner(System.in); int year sc.nextInt(); if ((year % 4 0 year % 100 ! 0) || (year % 400 0)) { System.out.println(是闰年); }else { System.out.println(不是闰年); } } }这两种写法本质上是一样的只不过后者可读性可能更好。if语句需要注意的两个问题1. 分号问题int x 20; if (x 10) ; { System.out.println(hehe); } // 运行结果 hehe此处if后面多写了个分号导致分号成为了 if 语句的语句体, 而 { } 中的代码已经成为了和一个 if 无关的代码块.2. 悬垂else问题int x 10; int y 10; if (x 10) if (y 10) System.out.println(aaa); else System.out.println(bbb);if /else 语句中可以不加大括号但是也可以写语句此时只能写一条语句. 此时else是和最接近if相匹配但实际开发中不建议这么写因为可读性太差最好加上大括号。2.2.2 switch 语句基本语法switch(表达式){ case 常量值1:{ 语句1; [break;] } case 常量值2:{ 语句2; [break;] } ... default:{ 内容都不满足时执行语句; [break;] } }执行流程先计算表达式的值和case依次比较一旦有相应的匹配就执行该项下的语句直到遇到break时结束当表达式的值没有与所列项匹配时执行default代码示例//根据day的值输出日期 public class HelloWorld { public static void main(String[] args) { int day 1; switch (day) { case 1: System.out.println(星期一); break; case 2: System.out.println(星期二); break; case 3: System.out.println(星期三); break; case 4: System.out.println(星期四); break; case 5: System.out.println(星期五); break; case 6: System.out.println(星期六); break; case 7: System.out.println(星期日); break; default: System.out.println(输入有误); break; } } }注意事项多个case后的常量值不可以重复switch的括号内只能是以下类型的表达式基本类型byte、char、short、int注意不能是long类型引用类型String常量串、枚举类型break 不要遗漏, 否则会失去 多分支选择 的效果int day 1; switch(day) { case 1: System.out.println(星期一); // break; case 2: System.out.println(星期二); break; } //运行结果: 星期一 星期二switch 不能表达复杂的条件// 例如: 如果 num 的值在 10 到 20 之间, 就打印 hehe // 这样的代码使用 if 很容易表达, 但是使用 switch 就无法表示. if (num 10 num 20) { System.out.println(hehe); }switch 虽然支持嵌套, 但是很丑一般不推荐~综上笔者建议尽量少用switchswitch能解决的if-else也都能解决2.3 循环结构2.3.1 while循环while循环适合不知循环次数先判断再执行语法格式while(循环条件) { 循环语句; }循环条件为true则执行循环语句否则结束循环。2.3.2 for循环for循环是一般情况下最常用最清晰的循环了适合已知循环次数语法for(表达式1;布尔表达式2;表达式3){ 表达式4; }表达式1: 用于初始化循环变量初始值设置在循环最开始时执行且只执行一次表达式2: 循环条件满则循环继续否则循环结束表达式3: 循环变量更新方式示例打印1-10for(int i 1;i10;i) { System.out.println(i); }若其中表达式2缺失表示该循环为死循环2.3.3 do-while循环语法do{ 循环语句; }while(循环条件);特点是至少跑一次的循环实际很少用2.3.4 循环控制关键字break关键字break 的功能是让循环提前结束在某些情况下提前打破循环continue关键字continue 的功能是跳过这次循环, 立即进入下次循环.三. 总结Java前面内容基本都是介绍一些基本概念都是一些基础中的基础便于后续的学习。