JavaSE基础 第五章 运算符
文章目录
1. 运算符概述
运算符 | |
---|---|
算术运算符 | +、-、*、/、%(取模)、++(自加 1【单目】)、–(自减 1【单目】) |
关系运算符 | >、>=、<、<=、==、!= |
逻辑运算符 | &(逻辑与) 竖杠(逻辑或)、!(逻辑非)、&&(短路与)、双竖杠(短路或) |
赋值运算符 | =、+=、-=、*=、/=、%=、^=、&=、竖杠=、<<=、>>= |
位运算符 | &(按位与)、竖杠(按位或)、^(按位异或)、~(按位取反【单目】)、<<(左移)、>>(带符号右移)、>>> (无符号右移) |
条件运算符 | 布尔表达式?表达式 1:表达式 2 (三目) |
字符串连接运算符 | + |
其它运算符 | instanceof、new |
2. 运算符详解
算术运算符
+
-
*
/
% 取余数
++ 自增1
可以出现在变量前, 也可以出现在变量后面,
不管是前是后, 执行结束后, 变量的值一定会自增1.
-- 自减1
跟++一个道理
public class OperatorTest01{
public static void main(String[] args){
int a = 10;
int b = 3;
System.out.println(a + b); // 13
System.out.println(a - b); // 7
System.out.println(a * b); // 30
System.out.println(a / b); // 3
System.out.println(a % b); // 1
int i = 1;
System.out.println(i);
++i;
System.out.println(i);
// 语法: 当++出现在变量后, 会先赋值运算, 再自增1.
// 前, 先自增1, 再赋值运算.
int m = 10;
//int n = m++; // n = 10
int n = ++m; // n = 11
System.out.println(n);
System.out.println(m); // m = 11
// 题目:
int c = 90;
System.out.println(c++); // 90
System.out.println(c); // 91
int d = 80;
System.out.println(++d); // 81
System.out.println(d); // 81
int e = 70;
System.out.println(e--); // 70
System.out.println(e); // 69
int f = 60;
System.out.println(--f); // 59
System.out.println(f); // 59
}
}
关系运算符
>
>=
<
<=
==
!=
-
一定要记住一个规则:
所有关系运算符的结果都是布尔型, 不是true就是false -
在Java中:
= : 赋值运算符
== : 关系运算符, 判断是否相等
public class OperatorTest02{
public static void main(String[] args){
int a = 10;
int b = 10;
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); // true
System.out.println(a != b); // false
}
}
逻辑运算符
& 逻辑与 ( 并且 )
| 逻辑或 ( 或者 )
! 逻辑非 ( 取反 )
&& 短路与
|| 短路或
-
特点:
逻辑运算符两边要求都是布尔类型, 并且最终的结果也是布尔类型. -
短路与和逻辑与的区别:
运算结果没有任何区别, 完全相同,
只不过短路与会发生短路现象. -
短路现象:
右边表达式不执行叫做短路 -
何时使用逻辑与, 何时使用短路与:
从效率方面来说, &&比&效率高一点, &的第二个表达式一定会执行, &&不一定
开发过程中, &&和&是同时并存的, 大部分情况下使用&&.
public class OperatorTest03{
public static void main(String[] args){
// 逻辑与&: 全真为真, 遇假则假
System.out.println(true & true); // true
System.out.println(true & false); // false
System.out.println(false & false); // false
// 逻辑或|: 全假为假, 遇真为真
int a = 100;
int b = 101;
int c = 99;
System.out.println(a < b | c > b); // true
System.out.println(true | false); // true
System.out.println(false | false); // false
System.out.println(true | true); // true
// 逻辑非!: 取反
System.out.println(!false); // true
System.out.println(!true); // false
// 这里需要加一个小括号, 运算符有优先级
System.out.println(!(a > b));
// 短路与&&
System.out.println(true & true); // true
System.out.println(true & false); // false
System.out.println(false & false); // false
// 结果相同
System.out.println(true && true); // true
System.out.println(true && false); // false
System.out.println(false && false); // false
int x = 10;
int y = 11;
// 逻辑与全真为真, 左边x > y结果已经是false了, 整个表达式的结果已经确认为false了,
// 按道理来说右边的表达式不应该执行.
System.out.println(x > y & x > y++);
// 通过测试得出: 表达式x > y++执行了.
System.out.println(y); // 12
int m = 10;
int n = 11;
// 使用短路与时, 当左边的表达式为false时, 右边的表达式不执行, 称为短路.
System.out.println(m > n && m > n++);
// 通过测试, m > n++未执行.
System.out.println(n); // 11
// 短路或||
// 左边表达式结果为true时, 右边表达式不需要执行, 此时短路.
int i = 1;
int j = 2;
System.out.println(i < j || i > j--);
System.out.println(j); // 2
}
}
赋值运算符
- 包括基本赋值运算符和扩展赋值运算符
- 基本运算符:
= - 扩展赋值运算符:
+=
-=
*=
/=
%=
注意: 两个符号之间不能有空格 - 语法:
使用扩展运算符时, 永远都不会改变运算结果类型
byte x = 100;
x += 1;
x自诞生以来是byte类型, x以后也永远是byte, 不管后面是多大的数字.
public class OperatorTest04{
public static void main(String[] args){
int k = 10;
k += 20; // k变量追加20
System.out.println(k); // 30
int i = 10;
i = i + 10; // 类似于+=运算符
System.out.println(i); // 20
// i += 10; 和 i = i + 10;
// 这两个类似, 但是本质上不一样.
byte x = 100;
System.out.println(x);
// 错误: 不兼容的类型: 从int转换到byte可能会有损失
// x = x + 1;
// 可以通过
x += 1; // 等同于(byte)(x = x + 1);
x += 199; // 等同于(byte)(x = x + 199);
System.out.println(x); // 44 , 强转后会损失精度
int a = 100;
a += 100;
System.out.println(a); // 200
a -= 100;
System.out.println(a); // 100
a *= 10;
System.out.println(a); // 1000
a /= 30;
System.out.println(a); // 33
a %= 2;
System.out.println(a); // 1
}
}
条件运算符( 三目运算符 )
- 语法格式:
布尔表达式 ? 表达式1 : 表达式2 - 执行原理:
布尔表达式的结果为true时, 执行表达式1, 否则执行表达式2
public class OperatorTest05{
public static void main(String[] args){
// 错误: 不是语句
//100;
// 错误: 不是语句
// '男';
boolean sex = true;
// 错误: 不是语句
// sex ? '男' : '女'; 返回'男', 但是'男'不是语句, 所以报错.
char c = sex ? '男' : '女';
System.out.println(c); // 男
}
}
字符串连接运算符
-
+
的作用:
求和
字符串拼接 -
何时使用:
当 + 两边都是数字类型时, 求和.
当 + 两边的任意一遍为字符串类型时, 会进行字符串拼接操作. -
字符串拼接之后的结果还是一个字符串.
-
当一个表达式中有多个加号时:
遵循自左向右的顺序依次执行( 除非添加小括号 ).
public class OperatorTest06{
public static void main(String[] args){
int a = 100;
int b = 200;
// 求和
int sum = a + b;
// 字符串拼接
System.out.println("sum = " + sum); // sum = 30
int nianLing = 20;
// 字符串拼接
System.out.println("年龄 = " + nianLing); // 年龄 = 20
// 先求和再拼接
System.out.println(a + b + "110"); // 300110
// 先拼接再拼接
System.out.println(a + (b + "110")); // 100200110
// 在控制台上输出"100 + 200 = 300", 要求只能使用变量a(100)和b(200)和符号
System.out.println(a + " + " + b + " = " + (a + b));
// 在控制台输出"登录成功欢迎**回来", 要求**使用变量来表示
String name = "stephen";
System.out.println("登录成功欢迎" + name + "回来");
}
}
3. 本章练习
第一题:判断以下程序的输出结果。
int x = 10;
int a = x+ x++;
System.out.println("a =" + a);
System.out.println("x =" + x);
int b = x + ++x;
System.out.println("b =" + b);
System.out.println("x =" + x);
int c = x + x--;
System.out.println("c =" + c);
System.out.println("x =" + x);
int d = x + --x;
System.out.println("d =" + d);
System.out.println("x =" + x);
第二题:判断以下程序的输出结果。
int a = 15;
int b = 2;
double c = 2;
System.out.println(a + "/" + b + "=" + (a / b));
System.out.println(a + "%" + b + "=" + (a % b));
System.out.println(a + "/" + c + "=" + (a / c));
System.out.println(a + "%" + c + "=" + (a % c));
第三题:判断以下程序的输出结果。
boolean x, y, z;
int a = 15;
int b = 2;
x = a > b; // true;
y = a < b; // false;
z = a != b; // true;
System.out.println("x =" + x);
System.out.println("y =" + y);
System.out.println("z =" + z);
第四题:判断以下程序的输出结果。
int x;
double y;
x = (int) 22.5 + (int) 34.7;
y = (double) x;
System.out.println("x = " + x);
System.out.println("y = " + y);
第五题:判断以下程序的输出结果。
int i = 5;
int j = 5;
int m = 5;
int n = 5;
i++;
j = j + 1;
m--;
n = n - 1;
System.out.println(i);
System.out.println(i++);
System.out.println(++i);
System.out.println(i--);
System.out.println();
System.out.println(j);
System.out.println(j++);
System.out.println(j--);
System.out.println(--j);
System.out.println();
System.out.println(m);
System.out.println(n);
第六题:判断以下程序的输出结果。
int i = 0;
int j = 0;
System.out.println(i);
System.out.println(j);
i++;
++j;
System.out.println(i);
System.out.println(j);
System.out.println("--------------------------");
System.out.println(i++);
System.out.println(++j);
System.out.println("--------------------------");
System.out.println(i);
System.out.println(j);
4. 习题答案
// 第一题:判断以下程序的输出结果。
int x = 10;
int a = x + x++;
System.out.println("a = " + a); // a = 20
System.out.println("x = " + x); // x = 11
int b = x + ++x;
System.out.println("b = " + b); // b = 23
System.out.println("x = " + x); // x = 12
int c = x + x--;
System.out.println("c = " + c); // c = 24
System.out.println("x = " + x); // x = 11
int d = x + --x;
System.out.println("d = " + d); // d = 21
System.out.println("x = " + x); // x = 10
// 第二题:判断以下程序的输出结果。
int a = 15;
int b = 2;
double c = 2;
System.out.println(a + "/" + b + "=" + (a / b)); // 15/2=7
System.out.println(a + "%" + b + "=" + (a % b)); // 15%2=1
System.out.println(a + "/" + c + "=" + (a / c)); // 15/2.0=7.5
System.out.println(a + "%" + c + "=" + (a % c)); // 15%2.0=0
// 第三题:判断以下程序的输出结果。
boolean x, y, z;
int a = 15;
int b = 2;
x = a > b; // true
y = a < b; // false
z = a != b; // true
System.out.println("x = " + x); // x = true
System.out.println("y = " + y); // y = false
System.out.println("z = " + z); // z = true
// 第四题:判断以下程序的输出结果。
int x;
double y;
x = (int)22.5 + (int)34.7;
y = (double)x;
System.out.println("x = " + x); // x = 56
System.out.println("y = " + y); // y = 56.0
// 第五题:判断以下程序的输出结果。
int i = 5;
int j = 5;
int m = 5;
int n = 5;
i++; // 6
j = j + 1; // 6
m--; // 4
n = n - 1; // 4
System.out.println(i); // 6
System.out.println(i++); // 6
System.out.println(++i); // 8
System.out.println(i--); // 8
System.out.println(); // 空行
System.out.println(j); // 6
System.out.println(j++); // 6
System.out.println(j--); // 7
System.out.println(--j); // 5
System.out.println(); // 空行
System.out.println(m); // 4
System.out.println(n); // 4
// 第六题:判断以下程序的输出结果。
int i = 0;
int j = 0;
System.out.println(i); // 0
System.out.println(j); // 0
i++; // 1
++j; // 1
System.out.println(i); // 1
System.out.println(j); // 1
System.out.println("--------------------------");
System.out.println(i++);// 1
System.out.println(++j);// 2
System.out.println("--------------------------");
System.out.println(i); // 2
System.out.println(j); // 2
5. 补充 : 接受用户键盘输入
-
输出信息到控制台:
Ssytem.out.println(); -
接受键盘输入:
看不懂很正常, 因为这个代码时面向对象章节学习之后才能理解的.前提: java.util.Scanner s = new java.util.Scanner(System.in);
-
接受一个整数:
int num = s.nextInt(); -
接收一个字符串:
String str = s.next()
public class KeyInput{
public static void main(String[] args){
// 创建一个键盘扫描器对象
// s: 变量名, 可以修改, 其它不能修改
java.util.Scanner s = new java.util.Scanner(System.in);
// 接受一个int类型的数据
// 代码执行到此, 会暂停下来, 等待用户输入, 用户可以输入一个整数, 然后回车
// 回车之后i变量就有值了, 这个值就是用户输入的那个数.
int i = s.nextInt();
System.out.println("你输入的数为 : " + i);
System.out.print("请输入用户名: ");
String name = s.next();
System.out.println("欢迎" + name + "回来");
}
}