Java(运算符+循环)万字超详细介绍 (囊括了按位,异或,for,while等基础和疑难知识)

【本节目标1】熟练掌握运算符

【本章目标2】熟练掌握循环

万字讲解,十分详细,有大量(简单)代码帮助理解和大量的(简单)举例与总结。

1.运算符

1.什么是运算符

计算机最基本的用途之一就是执行数学运算,比如:

int a = 10;

int b = 20;


a+b;

a<b;

上述+和<等就是运算符,即:对操作数进行操作时的符号,不同运算符操作的含义不同。
作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。Java中运算符可分为以下:算术运算符(+*/)、关系运算符(< >==)、逻辑运算符、位运算符、移位运算符以及条件运算符等。

2.算术运算符

1.基本四则运算符:加减乘除模(+ - * / %)

int a = 20;

int b = 10;


 

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);

注意:

1.都是二元运算符,使用时必须要有左右两个操作数

2.int/int 结果还是int,而且会向下取整

Int a = 3;

int b = 2;

System.out.println(a/b);  //在数学中应该是1.5,但是在java中是1,会向下取整,取小数点之后的整数


double d = a*1.0/b;  //这样可以得到数学中的答案

System.out.println(b);

3.做除法和取模时,右操作数不能为0

int a = 1;

int b = 0;

System.out.println(a/b);  //报错

4.%不仅可以对整型取模,也可以对double类型取模,但是没有意义,一般都是对整型取模

System.out.println(11.5%2.0);

1.5

5.两侧操作类型不一致时,向类型大的提升

System.out.println(1+0.2);  // +的左侧是int,右侧double,在加之前hi被提升为double

输出1.2

6.增量运算符

该种运算符操作完成后,会将操纵的结果赋值给左操作数。

int a = 1;

a+=2;  //相当于a=a+2

System.out.println(a);  //输出3


a-=1;  //相当于a=a-1;

System.out.println(a);    //输出2


a*=3;    //相当于a*=3

System.out.println(a);    //输出6


a/=3;   //相当于a=a/3;

System.out.println(a);    //输出2


a%3=3;   //相当于a=a%2

System.out.println(a);   //输出2 

注意:只有变量才可以使用该运算符,常量不可以,因为常量不可以改变

7.自增/自减运算符++ --

++是给变量的值+1,--是给变量的值-1.

int a =1;

a++;  //后置++,表示给a的值+1,此时a的值为2(因为直接;结束,所以在这里前置和后置没区别)

System.out.println(a++);   //注意:后置++是先使用再加 ,因此在这里打印2

System.out.println(a);    // 在这里打印3


++a;   //前置++,表示给a的值+1

System.out.println(++a);  // 注意:前置++是先给变量+1,再进行使用,因此这里打印5

System.out.println(a);     //输出5

//--操作符给操作-1,与++含义类似

注意:
1.如果单独使用,[前置++]和[后置++]没有任何区别
2.如果混合使用[前置++]先+1,然后使用变量+1之后的值,[后置++] 先使用变量原来的值,表达式,结束时给变量+1
3.只有变量才能使用自增/自减运算符,常量不能使用,因为常量不允许被修改

3.关系运算符

关系运算符主要与六个  :== ,!=,<,>,<=,>=,其计算结果是true或者false

int 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

注意:当需要多次判断时,不能连着写,比如:3<a<5,Java程序与数学不一样

4.逻辑运算符号(重点)

逻辑运算符号主要有3个:&&  ||  !运算结果都是boolean类型

1.逻辑与&&

语法规则: 表达式1&&表达式2,左右表达式必须是boolean类型的结果相当于现实生活中的且,比如: 如果是学生,并且 带有学生证 才可以享受半票两个表达式都为真,结果才是真,只要有一个是假,结果就是假。

Inr a =1;

int b =2;


System.out.println(a==1 && b==2);     //左为真 且 右为真 则结果为真

System.out.println(a==1 && b>100);   //左为真 但 右为假 则结果为假

System.out.println(a>100 && b==2);   //左为假 右边直接不看 结果为假

System.out.println(a>100 && b>100);  // 左为假 右边直接不看 结果为假

注意:一个为假,则为假

2.逻辑或||

语法规则: 表达式1  ||  表达式2,左右表达式必须是boolean类型的结果相当于现实生活中的或,比如:买房子交钱时,全款 或者按揭都可以,如果全款或者按揭,房子都是你的否则站一边去。

int a = 1;

int b = 2;

System.out.println(a==1 || b==2);     //左为真 且 右为真 则结果为真

System.out.println(a==1 || b>100);   //左为真 但 右为假 则结果为真

System.out.println(a>100 || b==2);   //左为假 看右边,为真 结果为真

System.out.println(a>100 || b>100);  // 左为假 右为假 结果为假

注意:左右表达式中至少与一个位置,则结果为真

3 逻辑非!

语法规则:!表达式

真变假,假变真

int a =1;

System.out.println(!(a==1));   //a==1为true,取个非就是false

System.out.println(a != 1);     //a !=1为false,取非就是true

4. 短路求值

&& 和 || 遵守短路求值规则

System.out.println(10>20 && 10/0==0);    //打印false

System.out.println(10<20 || 10/0==0);        //打印true

我们都知道,计算10/0计算机会报异常,但是上面的代码却能正常运行,说明10/0并没有被求值

1.对于 &&,如果左侧表达式值为 false,则表达式结果一定是 false,无需计算右侧表达式

2.对于||,如果左侧表达式值为 true,则表达式结果一定是true,无需计算右侧表达式

3.&和|如果表达式结果为 boolean 时,也表示逻辑运算但与&&相比它们不支持短路求值.

System.out.println(10>20 && 10/0==0);    //异常

System.out.println(10<20 || 10/0==0);        //异常

5.位运算符

java 中数据存储的最小单位是字节,而数据操作的最小单位是比特位,字节是最小的存储单位,每个字节是由8个进制比特位组成的,多个字节组合在一起可以表示各种不同的数据位运算符主要有四个:&,|,~,^ 是一元算符外,其余都是二元运算符
位操作表示 按二进制位运算计算机中都是使用二进制来表示数据的(01构成的序列),按位运算就是在按照二进制位的每一位依次进行计算.

1.按位与&:如果两个二进制位都是1,则结果为1,否则为0

2.按位或 | :如果两个二进制位都是0,则结果为0,否则为1

注意:当&和|的操作数为整数的int,short,long,byte的时候,表示按位运算,当操作数为boolean的时候,表示逻辑运算。

3.按位取反~:如果该位为0则转为1,如果该位为1,则转为0

注意:
1.0x前缀的数字为十六进制数字十六进制可以看成是二进制的简化表示方式一个十六进制数字对应4个二进制位.
2.0xf 表示10 进制的 15也就是二进制的 1111
3. printf 能够格式化输出内容x 表示按照十六进制输出

4.\n表示换行符

5.如果两个数相同,则异或为0

6.移位运算

移位运算符有三个:<<, >> ,>>>,都是二元运算符号,且都是按照二进制比特位来运算的。

1.左移<<:最左侧位不要了,最右侧补0.

Int a = 0x10;

System.out.printf("%x\n",a<<1);   //运算结果是按照十六进制打印的    20

注意:像左移位时,丢弃的是符号位,因此正数左移可能会编程负数。

2.右移>>:最右侧位不要了,最左侧位符号位(正数补0,负数补1)

int a =0x10;

System.out.printfln("%x\n",a>>1);  //运行结果是按照十六进制打印的   8


int b = 0xffff0000;

System.out.printfln("%x\n",b>>1);  // 执行结果按照十六进制打印   ffff8000

3.无符号右移>>>:最右侧位不要了,最左侧补0

Int a = 0xffffffff;

System.out.printf("%x\n:,a>>>1);   //运行结果是按照十六进制打印   7fffffff

注意
1.左移1位相当于原数字*2左N位相当于原数字*2的N次方
2.右移1位相当于原数字/2右N位相当于原数字/2的N次方

3.由于计算机计算移位效率高于计算乘除,当某个代码正好乘除 2 的N次方的时候可以用移位运算代替.

4.移动负数位或者移位位数过大都没有意义

7.条件运算符

条件运算符只有一个
表达式1?表达式2:表达式3
当表达式1的值为true时,整个表达式的值为表达式2的值当表达式1的值为false时,整个表达式的值为表达式3的值也是Java 中唯一的一个三目运算符,是条件判断语句的简化写法

//求两个整数的最大值

int a  = 10;

int b  = 20;

int max = a>b? a : b;

注意:

1.表达式2和表达式3的结果要是不同类型的时候,除非能发生类型隐式转换

int a = 10;

int b = 20;

int c = a>b?1:2.0;

2.表达式不能单独存在,其参生结果必须要被使用。

int a = 10;

int b = 20;

a>b?a:b;   //报错:不是语句

8.运算符的优先级

在一条表达式中,各个运算符可以混合起来运算,但是运算符的优先级不同,比如:*和/的优先级

要高于+和-,有些情况下稍不注意,可能会造成很大的麻烦。

//求a和b的平均值

int a = 10;

int b = 20;

int c = a+(b-a)>>1;

System.out.printfln(c);

上述表达式中,由于+的优先级高于>>,因此a先和b-a的结果做加法,整体为20,最后再进行右移,因此结果为10.

注意:运算符的优先级我们不必记忆,可能存在歧义的代码中加上括号即可。

2. 循环

1.概述

我的曾经:
早上8:00起床--->洗漱--->吃早饭--->上课--吃午饭--->上课--->运动--->吃完饭--->玩手机--->睡觉每天的生活貌似都是这么规律,顺序的做着每件事,前途一片渺茫~~~直到有一天
我幡然醒悟,不好好学习可能要卖红薯,奋发图强可能离梦想会更近,于是我选择来到手撕代码看博客,从此:早上6:00起床--->看书敲代码--.>上课+看编程书籍--->吃午饭--->刷题-->上课+看书--->吃晚饭--->总结-->看科技新闻--->睡觉
就这样日复一日的努力着,感觉每天都很充实,生活看到了希望~~~再后来
秋招来了,我用自己所学,一次次刷新着手中ofer的记录,那一刻,我被自己感动了

2.顺序结构

顺序结构比较简单,按照代码写的顺序一行一行的执行。

System.out.println("aaa");

System.out.println("bbb");

System.out.println("ccc");

//执行结果

aaa

bbb

ccc

如果调整代码的书写顺序,则执行顺序也发生变化

System.out.println("bbb");

System.out.println("aaa");

System.out.println("ccc");

//执行顺序

bbb

aaa

ccc

3.分支结构

3.1 if语句

1.语法格式

if(布尔表达式){

//语句

}

如果布尔表达式结果为true,执行if中的语句,否则不执行

比如:小明,如果这次考试有考到90分以上,奖励一个15promax

int score =92;

if(score>90){

System.out.println("15promax");

}

2.语法格式

if(布尔表达式){

//语句1;

}else{

//语句2;

}

如果布尔表达式结果为true,则执行if中语句,如果不是则执行else中的雨具

比如:小明,如果这次考到90分以上,奖励15promax,如果没考到,给我一个15promax

int score = 0 ;

if(score>90){

System.out.println("15promax")

}

else{

System.out.println("给我一个promax");

}

3.语法格式+习题

if(布尔表达式){

//语句1、

}

else if{

//语句2

}

else{

//语句3

}

表达式1成立,执行语句1,否则表达式2成立,执行语句2,否则执行语句3比如:考虑到学生自尊,不公开分数排名,因此:
分数在[90,100]之间的,为优秀
分数在[80,90)之前的,为良好
分数在[7080)之间的,为中等
分数在[60,70)之间的,为及格
分数在[0,60)之间的,为不及格
错误数据

按照上述办法通知学生成绩:

if(score>=90){
    System.out.println("优秀");
}
else if (score>=80 && score <= 90){
    System.out.println("良好");
}
else if (score>=70 && score <= 80){
    System.out.println("中等");
}
else if (score>=60 && score <= 70){
    System.out.println("及格");
}
else if (score<60){
    System.out.println("不及格");
}
else{
    System.out.println("错误输入");
}

【小练习】

判断一个数是奇数偶数

int num = 10;

if(num%2==0){

System.out.println("num是偶数);

}

else

{

System.out.println("是奇数"):

}

【小练习】

判断一个数字是正数,负数,还是零

int num = 0;

if(num>0){

System.out.println("正数“);

}

else if(num<0){

System.out.println("负数“);

}

else{

System.out.println("零“);

}

【小练习】

判断一个数是否为闰年

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("不是闰年“);

}

}

【注意事项】

1.代码风格

//风格1  推荐

int x = 10;

if(x == 10){

//语句1;

}

else{

//语句2

}

//风格2

nt x = 10;

if(x == 10)

{

//语句1;

}

else

{

//语句2

}

虽然两种方式都是合法的,但是java中更推荐风格1       {放在同一行显得很紧凑

2.分号问题

int x = 20;

if(x == 10);

{

System.out.printfln("hehe");

}

//运行结果

hehe

此外多写了一个分号,导致分号成为了if语句的语句体,而{ }中的代码已经和if无关的代码块。

3.悬垂else问题

int x = 10;

int y = 10;

if(x == 10)

if( y == 10)

System.out.printnln("aaa");

else

System.out.printnln("bbb");

if/else 语句中可以不加大括号,但是也可以写语句(只能写一条语句)。此时else与最近的if结合,但是不建议这样用。

3.2 switch语句

基本语法

switch(表达式){

case常量值1:{

语句1;

break;

}

case常量值2:{

语句2;

break;

}

...

default:{

内容都卜满足执行语句:

break;

}

}

执行流程:

1.先计算表达式的值

2.和case依次比较,一旦响应的匹配就执行该项下的语句,直到遇到break时结束

3.当表达式的值没有与所列项匹配时,执行default

代码示例:

根据day的值输出星期

int day = 1;

switch(day){

case 1:

System.out.printnln("星期一");

break;

}

case 2:

System.out.printnln("星期二");

break;

}

case 3:

System.out.printnln("星期三");

break;

}

case 4:

System.out.printnln("星期四");

break;

}

case 5:

System.out.printnln("星期五");

break;

}

case 6:

System.out.printnln("星期六");

break;

}

case 7:

System.out.printnln("星期日");

break;

}

default:

System.out.printnln("输入有误");

break;

}

[注意事项】

1.多个case后的常量值不可以重复

2.switch的括号内只能是以下类型的表达式

基本类型:byte,char,short,int,注意不能是long类型

引用类型:String常量字符串,枚举类型

double num = 1.0;

switch(num){

case 1.0:

System.out.println("hehe");

break;

case 2.0:

System.out.println("haha");

break;

}

//编译报错

不兼容类型,从double到int会有可能数据缺失

注意:break不要遗漏,否则会失去"多分支选择“的效果

int day = 1;

switch(day){

case 1:

System.out.println("星期一");

case 2:

System.out.println("星期二");

break;

}

//运行结果

星期一

星期二

注意:switch不能表达复杂的条件

//例如:如果num的值也在10到20之间,就打印hehe

//这样的代码使用if很容易表达出来,但是谁用switch就无法表达

if(num>10 && num<20){

System.out.println("hehe");

}

注意:switch虽然支持嵌套,但是很丑,一般不推荐

int x = 1;

int y = 1;

switch(x){

case 1:

switch(y){

case 1 :

System.out.println("hehe");

break;

}

break;

case 2:

System.out.println("haha");

break;

}

代码的美观程度也是一个重要的标准,毕竟这是一个看脸的时代

综上:我们发现,switch的使用局限比较大

4.循环结构

4.1 while循环

基本语法格式:

while(循环条件){

循环语句;

}

循环条件为true,则执行循环语句:否则结束循环

代码示例1:打印1-10 的数字

int a = 1;

while(a<1=0){

System.out.println(a);

a++;

}

代码示例2:计算1-100的和

int n = 1;

int result = 0;

while(n<=100){

result+=n;

n++;

}

System.out.println(m);

//执行结束:5050

代码示例3:计算5的阶乘

int m = 1;

int result = 1;

while(n<=5){

result *=n;

n++;

}

System.out.println(n);

//执行结果

120

代码示例4:计算1!+ 2! + 3! + 4! + 5!

int n = 1;

int count = 1;

int result = 0;

while(n<=5){

while( n--){

count*=n;

}

result+=count;

n++;

}

System.out.println(result);

这里我们发现,当一个代码中带有多重循环的时候,代码的复杂程度就大大提高了,因此比较复杂的代码容易出错。后面我们会想办法来解决这个问题

注意事项

1.和if 类似whie 下面的语句可以不写(),但是不写的时候只能支持一条语句.建议还是加上{ }

2.和if 类似while 后面的建议和 while 写在同一行.
3.和if 类似while 后面不要多写分号否则可能导致循环不能正确执行

int num = 1;

while(num <= 10);{

System.out.println(result);

num++;

}

//执行结果

无任何输出,程序死循环

此时:为了while的语句体(这是一个空语句),实际的()部分和循环无关,此时循环条件num<=10恒成立,导致代码死循环了。

4.2 break

break的功能是让循环提前结束

代码示例:

找到100-200中第一个3的倍数

int num = 100;

while(num <= 200){

if(num%3 == 0){

System.out.println("找到了3的倍数);

break;

}

num++;

}

//执行结果

找到了3的倍数为102

执行到break就会让循环结束。

4.3 continue

continue的功能是跳过这次循环,立即进入下次循环

代码示例:找到100-200中所以3的倍数

int num = 100;

while(num <= 200){

if(num % 3 !=0){

num++;   //这里的++不要忘记,否则会死循环

countine;

}

System.out.println("找到了,3的倍速为"+num);

num++;

}

执行到countinue语句的时候,就会立刻进入下次循环(判定循环条件),从而不会执行到下方的打印语句。

4.4 for循环

【基本语句】

for(表达式1;表达式2;表达式3){

表达式4;

}

表达式1:用于初始化循环变量设置,在循环最开始时执行,且执行一次

表达式2:循环条件,满则循环继续,否则循环结束

表达式3:循环变量更新方式

【执行过程】

1234--234--234--直到2为false,循环结束

【代码示例】

1.打印1-10的数字

for(int i = 1; i <= 10; i++){

System.out.println(i);

}

2.计算1-100的和

int sum = 0;

for(i = 1; i<=100; i++){
sum+=i;

}

System.out.println(sum);   // 执行结果5050

3.计算5的阶乘

int result = 1;

for(int = i; i<= 5; i++){

result *= i;

}

System.out.println(result);

4.计算1! + 2!+ 3! + 4!+ 5!

int sum = 0;

for(int i = 1; i <= 5; i++){

int tem p = 1;

for(int j =1; j <= i; j++){

tmp *= j;

}

sum += tmp;

}

System.out.println(sum); 

【注意事项】(和while循环相似)

1.和if 类似for 下面的语句可以不写,但是不写的时候只能支持一条语句,建议还是加上{}

2.和if 类似for 后面的建议和 while 写在同一行.
3.和if 类似for后面不要多写分号否则可能导致循环不能正确执行4.和while循环一样,结束单趟循环用continue,结束整个循环用break

4.5 do  while循环

【基本语法】

do{

循环语句:

}while9循环语句};

先执行循环语句,再判断循环条件,循环条件成立继续执行,否则循环结束

例如打印1-10

int num = 1;

do{

System.out.println(num);

num++;

}while(num <= 10);

【注意事项】

1.do while循环最后的分号不要忘记

2.一般do while很少用到,更推荐for和while

5.输入输出

5.1 输出到控制台

基本语法

System.out.println(maas);    //输出一个字符串带换行

System.out.print(sfd);            //输出一个字符串不带换行

System.out.printf(format,maf);       //格式化输出

总结:print;n输出的内容自带\n,print不带\n

printf的格式化输出方式和c语言的printf是基本一致

【代码示例】

System.out.println(“hello shousidaima”);

int x = 10;

System.out.printf("x=%d\n",x);

最后再给大家一些习题帮助大家掌握知识点和小结论:

【第一题】

long float double boolean 都不可以作为switch的参数

除了这些基本数据类型,后续说道的枚举,String也可以作为Switch的参数

故选择A D.

希望对刚接触的小白有所帮助,创作不易,给个免费的赞和关注,谢谢各位----------------------

猜你喜欢

转载自blog.csdn.net/cnjdd/article/details/132798006
今日推荐