算术运算符主要有:+,-,*,/,%,++,–
+: 在java中,+号除了可以当做运算符进行加法计算外,还可以当做正号和进行字符串连接的操作符。当进行运算的时候要注意,如果两个操作数中有一个是字符串类型的,+号就会被当做连接符使用,出现结果异常的问题; /和%的区别: 数据做除法操作的时候,/取得是商,%取得是余数 ++和–的用法: 他们的作用是自增或者自减; 单独使用时,它们放在前后的结果是一样的;而当参与操作时,放在前面就是先自增或自减,放在后面就是后自增或自减。 例如:
int a = 10; int b = ++a; //这时b的值就是11,因为++放在了前面就对a先进行了自增,然后再赋值 int c = 10; int d = c++; //这时的d依旧是10,因为是先赋值,后++赋值运算符有:=,+=,-=,*=,/=,%=等
= 叫做赋值运算符,也是最基本的赋值运算符。 例如:
int a = 100; //这里就是将100的值赋给int整形变量a剩下的几种运算符属于扩展运算符,它们中包含了强制转换。 如
byte a = 12; a = a + 1; byte b = 12; b += 1;上面的代码中,在赋值操作的时候,a变量没有进行强制转换,因为byte,short,char做运算时会默认提升数据类型为int,所以没有强制转换可能造成精度丢失,编译器就会报错。 而下面的b变量进行了扩展赋值运算符,由于扩展运算符中隐含了强制转换,就不会出问题;
比较运算符有:==,!=,>,>=,<,<= 无论运算符两端简单还是复杂最终结果是boolean类型。而在比较时也要注意不要把 == 写成 =;
逻辑运算符有:&,|,^,!,&&,|| 逻辑运算符用于连接boolean类型的式子; &: 有false则false |: 有true则true ^: 相同则false,不同则true。 !: 非true则false,非false则true &&: 结果和&是一样的,只不过有短路效果。左边是false,右边不执行。 ||: 结果和|是一样的,只不过有短路效果。左边是true,右边不执行。
^ 如果相对应位值相同,则结果为0,否则为1。 〜 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 << 按位左移运算符。左操作数按位左移右操作数指定的位数。 >> 按位右移运算符。左操作数按位右移右操作数指定的位数。 >>> 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 上面的位运算符运算的时候都是对数据的二进制下进行运算的,所以用二进制数据运算能更好理解上面的位运算符的用处。
^的特殊用法:一个数据针对另一个数据位异或两次,该数不变
格式:比较表达式 ? 表达式1 : 表达式2 执行流程: 首先计算比较表达式的值,看是true还是false。 如果是true,表达式1就是结果。 如果是false,表达式2就是结果。 例如:
//求两个数最大值例子 int a = 22; //定义比较变量a int b = 25; //定义比较变量b int max = a > b ? a : b; //比较a是否大于b,如果a大于b,就将冒号前面的a变量的值赋给max,否则就将冒号后的b变量值赋给max;在实际开发中,很多数据都是可变的,为了方便我们我们的程序开发,提高灵活性,Java就提供了键盘录入功能。 使用范例:
//首先要导入键盘录入对象的包,是jdk里默认提供的,如果有eclipse类的开发工具可以在写出类后直接快捷键导包 import java.util.Scanner //通过import语句导入util包下的Scanner类 public class ScannerDemo{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); //创建键盘录入对象,其中System.in本质是标准输入流的一个对象,在io流里会详细解释 int x = sc.nextInt(); //通过Scanner对象的nextInt方法获取控制台输入的数据,这里这个方法只能接收int类型数据 System.out.println(x); //从控制台输出从键盘录入的数据 } }流程语句分为3种结构。
顺序结构:从上往下,依次执行。选择结构:按照不同的选择,执行不同的代码/循环结构:做一些重复的代码if语句是一种判断语句,有三种格式。
格式1: if(比较表达式){ 语句体; } /* 执行流程是:判断比较表达式中的值,是true还是false,如果是true就执行大括号内的语句体,执行完语句体后会继续向下执行 如果是false,就直接向下执行,不会执行大括号里面的语句体 */ 格式2: if(比较表达式){ 语句体1; }else{ 语句体2; } 语句3; /* 执行流程是:判断比较表达式中的值,是true还是false,如果是true就执行语句体1,执行完语句体1后会向下执行语句3; 如果是false,就向下执行else里面的语句体2,执行完语句体2后继续向下执行语句3; */ 格式3: if(比较表达式1){ 语句体1; }else if(比较表达式2){ 语句体2; } ... else{ 语句体n+1; } 语句n+2; /* 执行流程是:判断比较表达式中的值,是true还是false,如果是true就执行语句体1,执行完语句体1后会向下执行语句n+2; 如果是false,就继续判断比较表达式2的值是true或false,是true就执行比较表达式2后的语句体2,是false就继续向下在做比较表达式n的判断,直到所有else if里面的比较表达式值都是false,就执行else后的语句体 */注意事项: A:比较表达式无论简单还是复杂,结果是boolean类型; B:if语句控制的语句体如果是一条语句,是可以省略大括号的;如果是多条,不能省略。 C:一般来说,有左大括号,就没有分号,有分号,就没有左大括号。 D:else后面如果没有if,是不会出现比较表达式的。 E:三种if语句其实都是一个语句,只要有一个执行,其他的就不再执行。
三元运算符和if语句第二种格式的关系: 所有的三元运算符能够实现的,if语句的第二种格式都能实现。 反之不成立。
再来些if语句的代码练习:
//比较两个数是否相等,代码可直接复制到类中的main方法中执行,为了方便我就不再写了 int a = 20; int b = 21; if(a == b){ System.out.println("两个数相等"); //如果a和b相等,就输出这句话 }else{ System.out.println("两个数不相等"); //显然结果是这个 } //获取两个数中的最大值 int max = 0; //定义最大值存储变量 int a = 30; int b = 40; if(a>b){ max = a; }else{ max = b; } System.out.println("最大值是:"+max); //显然结果是40,大家可以在控制台看结果 //获取三个数中的最大值(if语句的嵌套) int max = 0; //定义最大值存储变量 int a = 30; int b = 40; int c = 50; if(a>b){ if(a>c){ max = a; //如果a>b且又>c说明a是3个数中最大的,则把a赋值给max }esle{ max = c; //否则的话a>b但是比c小说明c是最大的 } }else { if(b>c){ max = b; //由于前面的a>b不成立所以b>a,这里在比较b和c谁大,如果b>c显然b是最大值 }else{ max = b; } } System.out.println("最大值是:"+max); //上面的三个数最大值练习用三目运算符改 int a = 30; int b = 40; int c = 50; int max = (a > b ? a : b) > c ? (a > b ? a : b) : c; //编译运行后控制台输出的是50,效果和上面的if语句效果一样,a > b ? a : b这个是求出a和b中的最大值,然后再和c比较出最大值。可以看到,用三目运算符比上面的if嵌套要简洁的多。