Java程序基础③Java运算符+逻辑控制+循环结构+输入输出
目录
1. Java运算符
运算符是什么呢?其实这个问题很简单,运算符在我们的生活中很常见,失去了它,数学基本报废了,像“+ , - ,* , /”都是我们最基本的运算符。即:对操作数进行操作时使用的符号,不同操作符的含义各不相同。
java作为一门优秀的程序设计语言,同样也提供有一整套丰富的运算符来操作变量。Java中的运算符分为:算术运算符(±*/),逻辑运算符(&&,||等),位运算符(& 、|等),关系操作符(><等),移位操作符和条件操作符等。
1.1 算术运算符
本四则运算符:+ - * /(也可以叫双目运算符)
代码示例:
int a = 10;
int b = 5;
System.out.println(a + b); // 加
System.out.println(a - b); // 减
System.out.println(a * b); // 乘
System.out.println(a / b); // 除
System.out.println(a % b); // 模,就是除法的余数
需要注意的是运算符使用的时候,要保证运算符两边是相同的类型变量,否则会发生隐式的类型提升,Java会自动将占用内存较小的变量类型提升为占用内存大的变量类型。
int i = d * a;
double d1 = d * a;
//两行代码均发生了隐式的类型提升
如代码,变量a被提升为double类型的,并且运算符计算出来的结果也是两个变量中占用内存最大的决定,如代码,a是int类型,d是double类型的,那么这两个变量经过算术运算符运算之后的结果必然是double类型的,代码1系统会报错。
算术运算符都是二元运算符,运算符必须要有左右两个操作数,int/int类型还是int型,这个不会改变,并且会先下取整。
int a = 3;
int b = 2;
System.out.println(a / b);
结果是1.5吗?当然不是1.5,在Java中整型的运算结果只会是整型,那也就是不可能会有浮点型出现,则最终结果是经过了向下取整得出来的结果,也就是1。
%不仅可以对整数取模,也可以对浮点数取模,但没什么意义,一般是对整型取模。两侧操作数类型不同时,类型小的向类型大的提升,运算结果也是类型大的决定。
1.2 增量运算符
增量运算符:+=、-=、*=、/=
int a = 1;
a += 1; // a = a + 1 2
a -= 1; // a = a - 1 1
a /= 1; // a = a / 1 1
a %= 1; // a = a % 1 0**
在增量运算符中会发生强制类型转换,运算符的右操作数和左操作数类型不同时,会将右操作数强转为左操作数的类型,从而将结果控制成原来的类型。
自增/自减运算符:++ --,就是自增1,自减1的操作。
int a = 10;
a++; // 后置++
++a; // 前置++
--a; // 前置--
a--; // 后置--
自增/自减运算符是单目运算符,只需要一个操作数即可。当自增/自减运算符单独使用的时候,后置和前置没用区别,都是一样的结果。
当自增/自减运算符和其他运算符混搭使用的时候,区别就体现出来了,前置++是先进行自增的操作了之后再运算其他的操作符,后置++是先运算其他的操作符后再进行自增的操作,–也是如此。
1.3 关系运算符
关系运算符主要有6个,分别是== 、!= 、> 、<、<=、>=,关系运算符的结果只能是boolean类型的,也就是true或者false。
int a = 10;
int b = 5;
System.out.println(a == b); // false
System.out.println(a != b); // true
System.out.println(a < b); // false
System.out.println(a > b); // true
System.out.println(a <= b); // false
System.out.println(a >= b); // true
在Java中,=是赋予,==是相等的意思,和实际的数学是有一定的区别的。
当代码写成10 > a > 1时,系统是无法运算的,因为系统会先执行判断10 > a是否为true还是false,判断得的结果不管是true还是false,此时都变成了booleana类型的和int类型的进行比较了,类型不同,如何比较?无法比较。
1.4 逻辑运算符
逻辑运算符主要有三个:与或非:&& 、|| 、 !,运算结果都是boolean类型的
1.4.1 逻辑与运算符
语法规则:表达式1 && 表达式2,并且左右两边的表达式的结果必须是Boolean类型的。相当于现实生活中的必须要有手机并且手机要有电才可以进行上网。
- 两个表达式如果有一个是假的,那么整个表达式都是假的
- 两个表达式必须要都是真的,整个表达式才是真的
- 两个表达式都是假的,整个表达式也是假的
int a = 10;
int b = 5;
System.out.println(a == b && a != b); // false
System.out.println(a != b && a > b); // true
System.out.println(a < b && a == b); // false
并且在逻辑与表达式中含有一个短路现象,意思就是如果表达式1为真,那么表达式2才会执行。如果表达式1是假的,那么表达式2是不会执行的,直接跳过执行表达式2直接得出结果。
1.4.2 逻辑或操作符
语法规则:表达式1 || 表达式2,并且左右两边的表达式的结果必须是Boolean类型的。相当于现实生活中的只要手机有电,不管手机有没有流量都可以玩游戏。
- 两个表达式,只要有一个是真的结果就是真的
- 两个表达式,有一个是假的,另外一个是真的,那结果就是真的
- 两个表达式,两个都是假的,那结果就是假的
int a = 10;
int b = 5;
System.out.println(a == b || a < b); // false
System.out.println(a != b || a > b); // true
System.out.println(a > b || a == b); // true
System.out.println(a == b || a > b); // true
逻辑或操作符也含有短路现象,但是逻辑或和逻辑与的短路现象不一样,当表达式1为真时,表达式2不在执行,当表达式1为假时,表达式2执行
1.4.3 逻辑非运算符
逻辑非很好理解,就是取反的意思,假的变成真的,真的变成假的,但是Java的逻辑非和C语言的逻辑非不太一样,Java的逻辑非的参数只能对结果是Boolean类型的,参数不可以是变量,但是C语言的可以。
int a = 10;
int b = 5;
System.out.println(!(a == 0)); // 原本为假,现在为真
System.out.println(!(a != 0)); // 原本为真,现在为假S
system.out.println(!a); // !变量,不符合语法,编译器报错
1.5 位运算符
Java中数据存储的最小单位是字节,数据操作的最小单位是比特位,字节是最小的存储单位,一个字节由8个比特位组成,多个字节组合在一起可以表示不同的数据类型。
位运算符主要有:& 、 | 、^、,除了是单目操作符以外,其他的都是双目操作符。位操作表示按二进制位运算,计算机的底层以及各种数据都是由一串一串的由0和1组成的二进制代码,按位运算就是按二进制的每一位进行运算。
按位与& 如果两个二进制位都是1,那结果就是1,否则为0;
按位或| 如果两个二进制位都是0的话,结果就为0,否则为1.
按位取反~ 如果二进制位是1,则转为0,如果二进制位是0则转为1
按位异或^ 如果两个数字的二进制位序列相同,那么结果位0,如果二进制位不同则结果位0.
1.6 移位操作符
移位操作符主要有两个:<< , >> , >>>,都是双目操作符,有都是按照二进制位来运算的。
左移操作符<< 二进制序列的最左位不要了,将右边的代码移动覆盖过去。
System.out.println(1 << 1) ; // 等于2
1 << 1的意思是将1的二进制代码向左移动1位,将左边的第一位丢弃,然后在最右边补0,以达到32个二进制位,无论左边抛弃的是1还是0,右边都是永恒不变的补0。
并且<<还有乘法的效果,1 << 1 相当于1 * 2
右移操作符>> 抛弃最右边的,在最左侧补符号位(正数补0 ,负数补1)
System.out.println(2 >> 1); // 等于1
System.out.println(-2 >> 1); // 等于-1
2 >> 1表示将2的二进制代码向右移动一位,在最右边补符号位,以达到32位二进制代码的条件,右移还有除法的效果,2 >> 1相当于2 / 2的效果
因为一个数字默认是int型的,int占用4个字节,也就是32个比特位,那就是说一个数字占用32个比特位,所以抛弃多少位就要补多少位。
无符号右移>>> 抛弃最右边的,在最左侧补0,和右移差不多,但是有本质上的区别,无符号右移,无论是移动正数还是负数,结果都只能是正数。
System.out.println(8 >>> 1); // 等于4
System.out.println(-1 >>> 1); // 等于2147483647
1.7(三目)条件操作符
语法格式:表达式1?表达式2:表达式3
- 表达式1为真,执行表达式2,表达式3不执行
- 表达式1为假,表达式2不执行,执行表达式3
int a = 10;
int b = 20;
int c = a > b ? a : b;
类似于如果那么否则。
并且条件运算符必须要进行接收,否则会报错,并且作为接收的变量必须适用于表达式2和表达式3的结果,否则有可能会发生隐式转换或者报错。
1.8 操作符优先级
在一条表达式中,各个运算符可以混合起来进行运算,但是运算符的优先级不同,比如:* 和 / 的优先级要高于 + 和 - ,有些情况下稍不注意,可能就会造成很大的麻烦。
// 求a和b的平均值
int a = 10;
int b = 20;
int c = a + (b - a) >> 1;
System.out.println(c);
上述表达式中,由于 + 的优先级要高于 >> , 因此a先和b-a的结果做加法,整体为20,最后再进行右移,因此结果 为10。
注意:运算符之间是有优先级的,具体的规则我们不必记忆,在可能存在歧义的代码中加上括号即可。
Java操作符总结:
- 左移1位,相当于原数字乘以2,左移N位,相当于原数字 * 2的N次方
- 右移1位,等效于原数字除以2,左移N位,相当于原数字 / 2的N次方
- 计算机计算移位效率高于计算乘除,所以建议当每个代码正好需要乘除2的N次方的时候可以使用移位运算来代替。
- 逻辑与:有假为假
- 逻辑或:有真为真
- 按位与:有0为0
- 按位或:有1为1
- 按位异或:相同为0,相异为1
- 左移:补0
- 右移:补符号位
- 无符号右移:补0
- +±-:注意是单独使用还是混合使用,单独使用无需考虑前置后置,混合使用需要考虑前置后置
2. Java逻辑控制
何为逻辑控制?逻辑控制是一种通过逻辑运算和决策来实现系统控制的方法。 它利用布尔代数的原理进行逻辑判断和计算,以决定所需操作和输出。 逻辑控制可以根据输入信号的状态和规则,执行相应的操作和行为,使得系统能够按照指定的要求完成任务。
2.1 顺序结构
序结构比较简单,就是按代码的顺序一行一行向下执行
int x = 1;
int y = 2;
System.out.println(x); // 输出1
System.out.println(y); // 输出2
int x = 1;
int y = 2;
System.out.println(y); // 输出2
System.out.println(x); // 输出1
代码顺序不同输出的结果就不同。
2.2 分支结构
2.2.1 if 语句
语法格式:
if(布尔表达式) {
//语句
}
- 如果布尔表达式的结果为true,那么执行语句,否则什么都不执行
- 如果布尔表达式的结果为false,那么什么都不执行
可以这样用:
if(x > y) {
System.out.println("x 大于 y");
}
if(x < y) {
System.out.println("x 小于 y");
}
但当我们加上else时,if 语句才真正完整,语法规则:
if(布尔表达式) {
//语句1
} else {
//语句2
}
- 此时不管布尔表达式的结果是true还是false,都会执行相应的语句
- 当布尔表达式的结果为true时,执行语句1
- 结果为false时,执行表达式2
if(x > y) {
System.out.println("x 大于 y");
} else {
System.out.println("x 不大于 y");
}
当然了,if语句也是支持嵌套使用,简单来说就是if语句里面还有if语句,从而达到了事情不一定只有两种结果的可能性,也就是说一件事情有几种结果,此时就可以通过嵌套使用if语句来解决。语法规则如下:
if(布尔表达式1) {
//语句1
} else if (布尔表达式2){
//语句2
} else {
//语句3
}
当布尔表达式1为false时,系统直接判断布尔表达式2的真假,是true就执行语句2,是false就执行语句2。
if(x < y) {
System.out.println("x 小于 y");
} else if (x == y){
System.out.println("x 等于 y");
} else {
System.out.println("x 大于 y");
}
一般情况下,即便是嵌套if语句,但结果也只能是只有一个。嵌套使用if语句的时候需要注意悬空if的情况,else之和最近的if进行匹配。悬空if问题只需要找到距离else最近的if就可以了。
2.2.2 switch语句
语法规则:
switch(表达式) {
case 常量值1:
语句1;
[break;]
case 常量值2:
语句2;
[break;]
case 常量值3:
语句3;
[break;]
case 常量值4:
语句4;
[break;]
default:
任何条件都不符合的语句;
[break;]
}
表达式可以是基本类型:int型,char型,byte型,short型,不可以是flout型,double型,long型,boolean型,也可以是引用类型:String常量串,枚举类型。
并且在使用switch的过程中必须要加上break,否则系统会把所以的case全部执行。
int n = 1;
switch(n) {
case 1:
System.out.println("哈哈");
case 2:
System.out.println("哈哈");
default:
System.out.println("不哈哈");
}
正常情况下应该是只单独输出一次“哈哈”,但是该处没有使用break,则最终结果是全部打印。只有加上break才可以得到我们想要的结果
int n = 1;
switch(n) {
case 1:
System.out.println("哈哈");
break;
case 2:
System.out.println("哈哈");
break;
default:
System.out.println("不哈哈");
break;
}
switch也支持循环嵌套,但是用起来很丑,不建议用。
int n = 1;
switch(n) {
case 1:
switch(n) {
case 1:
System.out.println("哈哈");
break;
default:
System.out.println("不哈哈");
break;
}
break;
case 2:
System.out.println("哈哈");
break;
default:
System.out.println("不哈哈");
break;
}
switch的表达式不可以使用太复杂的表达式,只能表示单一的条件,多条件的话,系统不知道使用那个case,此时系统就会报错。
3. 循环结构
3.1 while循环
语法规则:
while(循环条件) {
// 循环体
}
循环条件可以理解为布尔表达式
- 循环条件结果是true,则进入循环体。
- 循环条件结果是false,则无法进入循环。
- 如果循环条件是true,切该条件不会改变,则该循环是死循环,系统报错。
注意事项:
1、while下面的语句可以不写{},但是不写的话只能支持一条语句,建议还是加上{}
int n = 10;
while(n > 0)
System.out.println("哈哈");
n--;
此时没有加上{},则n–语句不属于while循环,此时循环体内无法改变循环变量n的值,则该循环是死循环。
2、while同一行后面不要加上“;”,否则后面的循环体就不属于循环了,加上“;”表示循环结束了。
3.2 for循环
语法规则:
for (表达式1; 布尔表达式2; 表达式3) {
// 循环体
}
- 表达式1:用于初始化循环遍历初始值,在循环最开始的时候执行,并且只执行一次。
- 表达式2:循环条件,满足则进行运行循环,不满足则退出循环
- 表达式3:更新循环变量的值,防止出现死循环。
注意事项:
- for下面的语句可以不写{},但是不写的话只能支持一条语句,建议还是加上{}
- for同一行后面不要加上“;”,否则后面的循环体就不属于循环了,加上“;”表示循环结束了。
- 在Java里面,因为Java是经过高度包装的计算机编程语言,提高了程序员编写程序的效率,在Java中,你只需要输入fori,再按回车键,for循环的整体结构就出来了,我们只需要在稍微修改即可使用。
3.3 do-while循环
语法规则:
do {
// 循环体
}while(循环变量);
do-while循环和其他的循环不太一样,while和for循环都是需要经过条件判断才可以执行循环体,但是do-while循环是不经过条件判断就可以执行一次循环体,也就是说无论条件是否有效,循环体都至少会执行一次。
do-while是先执行循环语句,再进行判断循环条件,循环条件成立则进行执行循环体,否则退出循环。
do-while循环最后的分号不要忘记,否则系统报错。
3.4 break和continue
break语句的作用是提前结束循环。
for (int n = 10; 1 < n; n--) {
System.out.println(n);
if(n == 3) {
break;
}
}
通常使用在循环里面,当有特殊需求时使用break提前结束循环。
continue的作用是跳过continue后面的语句,直接跳到判断循环条件的步骤。简单来说就是:跳出本次循环,进入下一次循环。
for (int n = 10; 1 < n; n--) {
if(n == 5) {
continue;
}
System.out.println(n);
}
当循环执行到continue的时候,直接跳出本次循环,后面的打印不执行,直接进入下一次循环的循环条件判断。
4. Java的输入输出
4.1 输出到控制台
System.out.println("哈哈"); // 输出哈哈,自动换行
System.out.print("哈哈"); // 输出哈哈,不换行
System.out.printf(format,msg); // 格式化输入
- println输出的内容自带\n,print不带有\n
- printf的格式化输出方式和C语言的输出方式基本一样。都是使用“%”+转换符。
- 只需要输入sout,系统就会自动生成输出代码了。
格式化字符串:
转换符 | 类型 | 示例 |
---|---|---|
%d | 十进制整数 | (%d, 100) -> 100 |
%x | 十六进制整数 | (%x, 100) -> 64 |
%o | 八进制整数 | (%o, 100) -> 144 |
%f | 定点浮点数 | (%f, 100f) -> 100.000000 |
%e | 指数浮点数 | (%e, 100f) -> 1.000000e+02 |
%g | 通用浮点数 | (%g, 100f) -> 100.000 |
%a | 十六进制浮点数 | (%a, 100) -> 0x1.9p6 |
%s | 字符串 | (%s, "hello") -> hello |
%c | 字符 | (%c, 'A') -> A |
%b | 布尔值 | (%b, 100) -> true |
%% | 百分号 | (%.2f%%, 2/7f) -> 0.29% |
格式化输出示例:
4.2 从键盘输入
- 需要使用到其他包的类。但系统会帮你导包。
- 需要使用Scanner类读取字符串/整数/浮点数
语法规则:
Scanner 类名 = new Scanner(System.in);
int 变量名 = 类名.nextInt();
但是需要注意的是使用“new 类名.nextString”输入字符串的时候,该输入必须要是第一个输入,否则会将上一次输入后按的回车给读走,从而导致无法正常读取字符串。
第三次输入字符时报错了。
有2种解决方式:
- 字符串输入放第一行,避免读取回车
- 多加一次字符串输入,把上一次输入的回车读取
字符串输入放第一行:
多加一次字符串输入,把上一次输入的回车读取:
本篇完。
下一篇学习Java方法函数的内容。
原文地址:https://blog.csdn.net/GRrtx/article/details/143642374
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!