一、基本概念
1、运算符:用于标记对数据执行某种运算的特定符号。
2、操作数:参加运算的数据称为运算对象(操作数)。
3、表达式:若干操作数(operand)和运算符(operator)按照约定规则构成的一个序列。
4、分类:算术运算符,关系运算符,逻辑运算符,位运算符,赋值运算符,条件运算术运算符
二、算术运算符(分为:单目运算符[只有一个操作数]、双目运算符[两个操作数],参与算术运算的操作数可以是整型或浮点类型算符)
功能及用法
类型 | 运算符 | 功能 | 用法距离 |
双目运算符 | + | 加 | a+b |
- | 减 | a-b | |
* | 乘 | a*b | |
/ | 除 | a/b | |
% | 取余 | a%b | |
单目运算符 | + | 正值 | +a |
- | 负值 | -a | |
++ | 自增 | ++a或a++ | |
-- | 自减 | --a或a-- |
注意:
1、+可以用来连接两个字符串。
2、既可对整数取模,也可以对小数取模。
3、char类型的数据可以进行算术运算,而boolean类型的数据不能进行算术运算,char类型自动转换成整形型或浮点型,boolean不能与任何其他数据类型转换。
4、两个整数相除结果取其整数部分。如果有一个数为小数,结果为小数。
5、++(--)运算符的操作数必须是变量,不能是常量或表达式,可以放在变量前,也可以放在变量后,功能是变量增1或减1,在前时,先自加或减1,在参与运算,在后时,先参与运算,在自加或减1。
例3.1 自增(自减)运算符的使用。
代码:
public classTestlncrement
{
public static void main(String[]args)
{
int i=9;
int j;
j=++i;//等价于:i=i+1;j=i;
System.out.println("i="+i+"\tj="+j);
j=i++;//等价于:j=i;i=i+1;
System.out.println("i="+i+"\tj="+j);
}
}效果:
三、关系运算符
关系运算符用于判断两个操作数的等价性和大小关系,得到的结果为布尔类型,取值为true或false。常用于逻辑判断(if语句或循环)。
运算符及含义:
运算符 | 含义 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
== | 等于 |
!= | 不等 |
例3.2 关系运算符的使用。
代码:
public class TestComparison
{
publicstatic void main(String[]args)
{
inta=4;
intb=6;
if(a==b)
System.out.println("a等于b");
if(a!=b)
System.out.println("a不等于b");
if(a>b)
System.out.println("a小于b");
if(a<b)
System.out.println("a大于b");
if(a>=b)
System.out.println("a大于等于b");
if(a<=b)
System.out.println("a小于等于b");
}
}
效果:
四、逻辑运算符
逻辑运算符可以对boolean类型数据进行逻辑上的“与”、“或”、“非”、“异或”等运算,结果仍为boolean类型,通常用于程序的流程控制。
逻辑运算符表:
a | b | !a | a&b | a|b | a^b | a&&b | a||b |
true | true | false | true | true | false | true | true |
true | false | false | false | true | true | false | true |
false | true | true | false | true | true | false | true |
false | false | true | false | false | false | false | false |
注意:
运算符(&、|)和运算符(&&、||)的区别。
用&、|作运算时,运算符左右两边的表达式都会被执行,最后两表达式的结果再进行与、或运算;
而用&&、||作逻辑运算时,如果只计算运算符左边的表达式即可确定与、或的结果,则右边的表达式将不会执行。
例3.3 逻辑运算符的使用。
代码:
效果:
五、位运算符
位运算符用来对整型(byte、short、int、long)或字符型(char)数据二进制位进行操作,结果为一个整数。
~(按位取反)
格式:~a
功能:将操作数a中的二进制位由1变0,由0变1。
例如:intx=2; ~x=?
&(按位相与)
格式:a & b
功能:两个操作数的相应位都为1,则该位为1,否则为0。例如, int x=2,y=7; x & y = ?
|(按位相或)
格式:a | b
功能:两个操作数的相应位中有一个为1,则该位的结果为1。例如,int x=5,y=8; x | y = ?
^(按位相异或)
格式:a ^ b
功能:两个操作数的相应位相异,则该位的结果为1,否则为0。例如,int x=5,y=8; x ^ y = ?
例3.4 位运算的使用。
注意:运算符&、|、^什么时候实施的是逻辑运算?什么时候实施的是位运算?
>>(按位右移)
格式:a >>b
功能:将a右移b位,右端的低位被舍弃,左端高位补原来的符号位。例如,byte x=-6;x >>2 = ?
<<(按位左移)
格式:a <<b
功能:将a左移b位,右端的低位补0,左端的高位被舍弃。例如,bytex=-6;x << 2 = ?
>>>(无符号右移)
格式:a>>> b
功能:将a右移b位,右端的低位被舍弃,左端的高位补0。例如,byte x=-6;x >>> 2 = ?
注意:移位运算时真正的移位位数不一定是指定的b位。当a为int型(或byte、short、char型)时,系统会先将b对32取模,得到的结果才是真正移位的位数,而当a为long型时,系统先将b对64取模,得到的结果作为真正的移位位数。
例3.5 位运算的综合应用。
分析:方法getOneBit()可以返回参数num的第n-1位。
public int getOneBit(int num,int n){
int i=1 << (n-1);
int nb = num & i;
return nb >> (n-1);
}
赋值运算符
格式:变量=表达式
double d = 7.8f; //合法
int a = 78L; //非法
int a = (int)78L; //合法
复合的赋值运算符
+= -= *= /= %= &= |= ^= >>= <<= >>>=
当赋值运算符两侧的类型不一致时,如果左侧变量的数据类型的表示范围更大,则把右侧的数据自动转换为与左侧相同的数据类型,然后赋给左侧变量,否则,需要使用强制类型转换运算符。
条件运算符
格式:表达式1?表达式2:表达式3
需注意:表达式1应是boolean类型的表达式;表达式2和表达式3的类型要一致。
例3.6 条件运算符的使用。
分析:
弹出输入对话框,接收用户输入: JOptionPane.showInputDialog(s)
将数字的字符串表示形式转换为整数:Integer.parseInt(s)
result =(score>=60) ? "及格" : "不及格"
System.out.println(result);
表达式
表达式(expression)是由若干操作数(operand)和运算符(operator)按照约定规则构成的一个序列。
运算符标明对操作数进行何种操作;
操作数可以是变量、常量或有返回值的方法调用等其他的表达式。
(a-b)/c+4 5>=a a>3 && a<10 10*max(a,b) a=10 100
如何正确计算表达式的值?
运算符的优先级
运算符的结合性
表达式中的数据类型转换
自动类型转换
当不同类型的常量和变量在表达式中混合使用时,它们最终将被转换为同一类型,然后进行运算。为了保证精度,转换从表示数的范围较小的数据类型到表示数的范围较大的数据类型。
(byte或short)和intàint
(byte或short或int)和longàlong
(byte或short或int或long)和floatàfloat
(byte或short或int或long或float)和doubleàdouble
char和intàint
注意:箭头左边表示参与运算的数据类型,操作可以是算术运算、赋值运算等,箭头右边表示转换后进行运行的数据类型
例如:longlongVar = 12345; double doubleVar = 1.2f;
float f = 23456434563L;
doubleVar = doubleVar * (12 +longVar);
int a=doubleVar/100; //错,需使用强制类型转换
注意:布尔类型不能与任何其它数据类型转换。
强制类型转换
格式:(目标数据类型)变量或表达式
例如,(float)5 /9 * (f - 32)
注意:强制类型转换时,由于目标数据类型的取值范围小于待转换数据类型的取值范围,在转换过程中会出现截断,导致高位数据丢失或精度下降。
例3.8将32位整数65366强制转换为byte型后,整数的高位被截掉,只剩下低8位,字节数据为86,导致数据丢失。
例3.9 数值的类型转换。
流程控制
三种基本的流程控制结构
顺序结构
分支结构:if-else语句、switch语句
循环结构:while语句、do-while语句、for语句、break语句、continue语句、return语句语句:
Break:格式:break;或break标号;定义在程序中循环语句前面的标识符,后跟一个冒号,标志要跳出的循环层次
功能:带标号的break语句从多重循环体的内部跳出到标号所标志的那层循环,并从标号标志的那层循环后面的语句继续执行。
例子:
for (int i = 0 ; i < 5 ; i++ ){
for (int j = 0; j < 3 ; j++){
。。。
if (j == 1){
//跳出outer标签所标识的循环。
break outer;
}
}
}
注意:在多重循环中,不带标号的break语句将只退出它所在的内循环。
continue语句
格式:continue; 或 continue标号;
功能:带标号的continue语句可从多重循环的内层循环跳到外层循环,执行标号所标识的循环的下一轮。
例子:
for (int i = 0 ; i < 3 ; i++ ){
for (int j = 0; j < 3 ; j++ ){
。。。
if (j == 1){
continue outer;
}
}}
return语句
return关键字并不是专门用于跳出循环的,而是结束一个方法。一旦在循环体内执行到一个return语句,该方法将会结束,循环自然也随之结束。
例子:
for (int i = 0; i < 3 ; i++ ){
System.out.println("i的值是" + i);
if (i == 1){
return;
}
System.out.println(“return后的输出语句");
}
用户在程序运行过程中从外界传递数据到程序中(此为输入数据),并将处理结果传递到程序外部,如显示到屏幕上或写出到文件中(此为输出数据)。
控制台
“控制台”(Console)就是由操作系统提供的一个字符界面窗口,用于实现系统与用户的交互——接收用户输入的数据并显示输出结果。
在控制台中运行的程序被称为控制台应用程序,也称字符界面应用程序。
读取控制台输入
java.util.Scanner类的功能并不仅限于控制台输入数据的读取,它的对象还可以关联到字符串、文件或其他的数据源。
构造方法
public Scanner(InputStream source)
public Stingnext()
读取下一个单词,以空格符或换行符作为分隔单词的标记。例如,String name=sc.next();
public intnextInt()
读取一个整数,如果输入的下一个单词不能解析为有效的整数(例如包含汉字等非数值字符),则出错。
public doublenextDouble()
读取一个双精度浮点数,如果输入的下一个单词不能解析为有效的浮点数,则出错。
public BooleannextBoolean()
读取一个布尔值,如果输入的下一个单词不能解析为有效的boolean值(true或false),则出错。
import语句:导入java.util包中定义的Scanner类。
String name =s.nextLine(); int age = s.nextInt();
double salary =s.nextDouble();