黑马程序员——Java基础(二)运算符,控制语句

来源:互联网 发布:可牛软件下载 编辑:程序博客网 时间:2024/06/05 23:44
------- android培训、java培训、期待与您交流! ----------

运算符

运算符就是把变量或者常量进行连接的符号。一般是参与运算的符号。

 

算术运算符:+,-,++,--,/,*,%

整数相除,结果只能是整数。

如果想要小数,那么参与运算的数必须有小数类型(f)。

 

%运算,运算结果的符号跟左边一致,负数可以参与运算。

 

++使用的时候,分单独使用和参与运算使用。

 

加法是从左到右的顺序执行。(正号,加法运算,字符串连接符)

字符串和数字相加的情况,当数字在前是先进行数字的相加,数字在后面时是连接符。

 

Eg

int x = 4;

int y = (x++) +++x)+x*10);

    4         6         60   70

每次遇到参与运算的++时,就直接先把x的值输出到当前位置,再计算x++

s.o.p(x++);//先输出x的值,在++

 

int a = 10;

int b = a++;//++的优先级高于=,但是为什么b=10?

在底层包含了三个步骤:

Aint temp = a;//产生了一个临时变量,先存储下a原来的值。

Ba++;//然后a自增。

Cint b = temp;//把临时的值附给b

注意:当++在后面参与运算的时候,会产生一个临时变量参与运算。

赋值运算符:=,+=,-=,*=,/=,%=

注意:

short s = 5;

s = s + 2;//报错。

s +=2;//正确。+=这个赋值运算符其实隐含了强制类型转换功能。

//s =(short)(s + 2);

 

比较运算符:==,!=,>,<,<=,>=,

比较运算符的结果都是boolean型,要么true,要么false

 

逻辑运算符:&,&&,|,||,^,!

位运算符:<<,>>,>>>,&,|,^,~

位运算直接对二进制进行运算。

 

注意:&符号两边是布尔类型的数时是逻辑运算符。

 

向左或向右移动就是把数据增大或者缩小2的多少倍。(算术左移和逻辑左移)(如果限定在int范围内的话,如果左移32位,还是原来的数。)

位运算能够提高些效率。

 

char的范围:

 00000000 00000000

 11111111 11111111

100000000 00000000       -1

2^16-1

 

面试题:

1,以最高的效率计算2*8:2<<3

2,交换两个数的值。

A:开发用的,采用第三方变量temp。

B:使用^,一个数^另一个数两次还是这个数。

A = A^B

B = A^B;//A^B^B=A

A = A^B;//A^B^A=B

 

n=n+m;

m=n-m;//n

n=n-m;//m

如果n和m的值非常大时,容易超出类型范围

3,获取60的十六进制

Int num = 60;

Int n1=num & 15=12;//获取60的最低4位,

int temp = 60>>4;//获取下一组4位

int n2=temp & 15=3;//对temp的值获取最低4位

System.out.println((char)(n1-10+'A'));

//注意这里如果是负数的话用>>>

 

三元运算符:(条件表达式)?表达式1:表达式2

如果使用三元运算符对有强制类型转换的表达式进行判断时,会出现类型转换不了的问题。

如:

n1>9?(char) (n1-10+’A’):n2;//这时如果满足表达式1,则输出为int型。因为(char)(n1-10+'A')计算完是char类型,但是它又跟n2等值在做运算,所以类型又提升成int型了。

语句

if(a >5)

int x = 5;//报错缺少分号,

因为int x =5;在计算中会被认为是:int x;x=5;两条语句。

 

作业:

考试成绩分等级。

90-100        A等。

80-89        B等。

70-79        C等。

60-69        D等。

60以下        E等。

请根据给定成绩,输出对应的等级。

 

键盘录入:

Amain后面的String[] args接受参数。

BBufferedReader IO流里面。

CScanner JDK5以后键盘录入数据的方式。

 

使用Scanner的步骤:

A:导包:

import java.util.Scanner;

B:创建对象:

Scanner sc  = newScanner(System.in);

System.in:是标准的输入流,对应着键盘的录入。

C:调用方法获取int类型的数据

int number = sc.nextInt();

 

if语句和三元运算符的关系:(没有关系)

在某些条件下,条件语句可以被三元运算符替换。

如果条件语句中是输出语句,则不能被替换。因为运算符连接的必须是结果。

 

switch中能够传的值有byte,short,int,char类型,JDK5以后可以有枚举,JDK7以后有String类型。

switch注意事项:

Adefault可以省略,但是一般不省略,除非你非常明确。default一般用于处理非正常情况。

B:放在最后面的defaultbreak是可以省略的。

放在case语句中的break是可以省略的,但是可能结果有问题,所以一般不省略。

Cdefault可以不放到最后。但是一般都放在最后面。

Dswitch语句遇到break或者执行到switch语句的末尾。

 

Eg

int x = 4;

switch(x)

{

default:

S.o.p(d);

case 1:

s.o.p(a);

case 2:

s.o.p(b);

case 3:

s.o.p(c);

}

结果是dab,开始顺序匹配,发现没有匹配的,就执行default,输出d,发现没有break,会出现case穿透,直接进入case1,输出a,依次输出bc

正常情况下,default在最后执行。

 

应用场景:

如果是对范围做判断,用if语句。如果对几个固定值做判断用switch

循环语句:

循环语句:

循环体:要做的事。

初始化条件:从哪里开始。

判断条件:在什么情况下结束。

控制条件:控制台初始化条件的变化。

 

for循环:

 

eg:

for(sop(a);sop(b);sop(d))

sop(c);

//报错,因为sop(b)没有办法判断真假。

 

写程序定义变量的注意问题:

什么时候定义变量:有变化的内容的时候。

定义范围:首先在小范围定义,如果不行,大范围。

如果先在大范围内定义了,不能再在这个范围内的小范围内重复定义。

变量在那个{}内定义的,就在这个{}有效。

 

 

while循环:

如果用while(true);//死循环。相当于while(true){}

 

whilefor的区别:

变量仅仅只做控制作用,用for,因为for结束,变量结束(从内存中消失),效率更高。而while用到的控制变量还在内存中。

什么时候用forwhile

如果是控制范围,最好用for。如果范围不明确用while。比如,我吃小蜜橘,但是不数有几个,直到吃完。

 

do{}while()循环:

不关怎样都会执行一次。

 

转意字符

\t等。用"\t"'\t'都可以,和字符串连接使用时用""

 

break:结束当前循环。

continue:结束本次循环。

注意:他们一般在循环中的判断使用,直接在判断中用会出错。

在一个完整的操作中,一般位于最后。不然直接报其后的语句是废语句。

break可以用在switch中。

 

带标号的结束:

首先定义一个标号,使用break或者continue结束到此标号即可。如:标号:for(){break:标号;}

 

结束循环的方法有三种:breakreturnexit

 

breakcontinue单独存在时,下面可以有任何语句,因为执行不到。报错!!

例子1:

/**根据键盘录入的分数,求这个分数属于哪个等级。*/import java.util.Scanner;class TestDemo3 {public static void main(String[] args){//创建键盘录入对象Scanner sc = new Scanner(System.in);System.out.print("请输入分数(1~100之间的整数):");//必须输入整形,不然报错int sorce = sc.nextInt();String level;if(sorce>=90 && sorce <=100){level = "A等";}else if(sorce>=80 && sorce<90){level = "B等";}else if(sorce>=70 && sorce <80){level = "C等";}else if(sorce>=60 && sorce <70){level = "D等";}else if(sorce>=0 && sorce<60){level = "E等";}else{level = "输入有错";}System.out.println(sorce+"----"+level);}}

例2:

/*需求:键盘录入月份,程序输出x月份是x季节*/import java.util.Scanner;class TestDemo4 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.print("请输入月份(整数1~12):");int mouth = sc.nextInt();String JiJie;if(mouth == 3 || mouth == 4 || mouth == 5){JiJie = "春季";}else if(mouth == 6 || mouth == 7 || mouth == 8){JiJie = "夏季";}else if(mouth == 9 || mouth == 10 || mouth == 11){JiJie = "秋季";}else if(mouth == 12 || mouth == 1 || mouth == 2){JiJie = "冬季";}else{JiJie = "输入有误";}System.out.println(mouth+"是"+JiJie);}}

例3:

/*需求:8848米的厚度,一张足够大的纸0.01米,折叠多少次可以成珠穆朗玛峰的高度?思路:1,循环次数不明确,用while。2,每次折叠,厚度是之前的2倍。所以每次乘以2.3,在while循环里面判断乘积是否大于等于8848*/float h = 0.01F;//纸的厚度int n = 0;//循环次数while(true){if(h >= 8848){System.out.println("折叠的次数为:"+n);break;}else{//统计次数n++;//厚度变化h *= 2;}}

例4:

/*需求:用do while做1-100偶数之和思路:1,1~99偶数之和,用d作为计数器,sumD作为接收结果的变量2,偶数%2的值为03,可以用do while*//*老师思路:1,求1-100之和,通过for循环就可以搞定2,求偶数的和,先要判断是偶数。如何判断?d%2 = 0是偶数;是1则为奇数。*/int d = 1;int sumD = 0;do{if(d%2 == 0)sumD += d;d++;}while(d<100);System.out.println("1-99的偶数和是:"+sumD);

例5:

/*需求:求100-999之间的水仙花数思路:1,水仙花数是指一个数的各个位的立方之和等于其本身。2,用for循环3,如何求各个位的数?153?个:153%10;十;(153/10)%10;百:(153/100)%10;*/for(int i=100;i<1000;i++){//求个位int g = i%10;//求十位int s = (i/10)%10;//求百位int b = (i/100)%10;if((g*g*g+s*s*s+b*b*b) == i)System.out.println(i);}

例6:

/*需求:正直角三角形思路:1,嵌套for循环2,y控制列数,y的值岁行的值而变*/for(int x=0;x<5;x++){for(int y=0;y<x+1;y++){System.out.print("*");}System.out.println();}

例7:

/*需求:打印倒直角三角形思路:1,列数随行数变化,随着行数增加列数减小2,设置一个变量控制行数,行数x<n,列数随着行数变化y=n-x*/int n = 5;for(int x=0;x<n;x++){for(int y=0;y<n-x;y++){System.out.print("*");}System.out.println();}

例8:

/*需求:打印菱形*   * *  * * * * * * *  * * *   * *    *思路:1,需要两个嵌套for循环。第一个打印正的三角形,第二个打印倒三角形。2,正三角:设正三角形的行数为m,(x从0开始)则第x行需要打印x+1个* ,第x行需要y=m-(x+1)个空格。3,倒三角:行数为(m-1),(x从0开始)第x行需要x+1个空格,第x行需要(m-1)-x个* 。*/int m = 8;for(int x=0;x<m;x++){//先打印空格for(int z=0;z<m-(x+1);z++){System.out.print(" ");}//打印*for(int y=0;y<x+1;y++){System.out.print("* ");}System.out.println();}for(int x=0;x<m-1;x++){//空格for(int z=0;z<x+1;z++){System.out.print(" ");}//*for(int y=(m-1)-x;y>0;y--){System.out.print("* ");}System.out.println();}System.out.println("---------------------------------");/*99乘法表很简单,但是注意用\t制表符。面试的概率很大。*/for(int x=1;x<10;x++){for(int y=1;y<=x;y++){System.out.print("x*y="+x*y+"\t");}System.out.println();}

例9:

/*需求:输出一个正三角形*   ***  ***** *******思路:1,用v表示要打印的行数,x控制行,y控制列2,发现:行和列的关系:y=2*x-1;空格z和行数的关系是z=v-x*/int v = 8;for(int x=1;x<=v;x++){//空格for(int z=0;z<v-x;z++){System.out.print(" ");}for(int y=0;y<2*x-1;y++){System.out.print("*");}System.out.println();}



0 0
原创粉丝点击