免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2463 | 回复: 0
打印 上一主题 下一主题

JAVA运算符及流程控制语句---上课了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-06-12 09:59 |只看该作者 |倒序浏览

运算符:运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。

  算数运算符

        加(+)、减法(-)、乘(*)、除(/)、 取余(%)

  整数相除,只能取整数部分,小数部分被舍弃。

  整数运算时,0不能做除数;浮点运算时,0.0可以,但结果是无穷。


     +  -  + - * / % ++ -- +

注意:1) /:   int i = 12;  i = i / 5;

          2) %:最后的符号只跟被模数相同

          3)前++:先+1,后运算     后++:先运算,后+1

          4)+:String字符串与其他数据类型只能做连接运算,且结果为String类型。

                sysout('*' + '\t' + '*'); vs  sysout("*" + '\t' + '*');



  关系运算符: >(大于),<(小于),>=(大于等于),<=(小于等于),==(等于),!=(不等于)。

        所有的关系运算符结果就是 布尔类型,真或假。


  注意: = 叫赋值运算,== 是判断是否相等。


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

   自增/自减运算符只能用于变量,常数不可以。

   自增和自减用法是完全一样,所以只讲自增。

   自增++就是让变量自增1,自减--就是让变量自减1.

   自增运算符的用法有两种,前++(++i)和后++(i++)。效果都会让i自增1,但++i会用自增以后的数进行运算;而i++会用自增以前的数进行运算。

    int a = 5;

    System.out.println(i++);//5 i是6

    System.out.println(++i);//7 i是7


  经验:

   1 同一个语句中,++最好只一次。

   2 i=i++; 或 i=++i 都没有意义,用了++就不要再赋值了。


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

   与 (&/&&  并且,两个条件都为真,结果才真;否则结果为假

   或 (|/||)  或者,两个条件有一个为真,结果为真;只有都不成立才为假。

   非 (!)   不是,取反

   逻辑运算符的优化:当前面表达式决定了整个逻辑运算的值时,后面的条件不需要再判断。叫短路。短路与(&&/短路或(||)/逻辑非(!)。

   具体说,就是 与运算 时,如果前面的条件为假时,后面就不判断了;

    或运算 时,如果前面的条件为真时,后面就不判断了。



  三目/条件运算符

   (条件)?结果1:结果2

  如果条件成立,返回结果1;否则返回结果2。

  (a>b)?a:b; // 计算a和b的最大值

  三目运算符的功能更多使用if/else语句实现。

(条件表达式)? 表达式1 : 表达式2;

1)既然是运算符,一定会返回一个结果,并且结果的数据类型与表达式1,2的类型一致

2)表达式1与表达式2 的数据类型一致。

3)使用三元运算符的,一定可以转换为if-else。反之不一定成立。




  赋值运算符

   就是=, a=b; 把右边的值赋给左边的变量。

    a = (b+c); //对,把b+c的值 赋给了a

    (a+b) = c; //错,不能把c的值赋给了a+b,a+b不是变量。

    10 = a; //错,不能把a赋给10,10不是变量,常数

   赋值运算符可以和其它运算符结合,形成复合赋值运算符。

   a+=5  ->  a = a+5

   a-=5  ->  a = a-5

   a+=5 和 a=a+5的区别:

    += 是赋值运算;a=a+5是先加运算,后赋值运算。


=    +=   -=  *=    /=   %=

int i= 12;

i  = i * 5;

i *= 5;//与上一行代码同样的意思

【特别地】

short s = 10;

s = s + 5;//报编译的异常

s = (short)(s + 5);

s += 5;//s = s + 5,但是结果不会改变s的数据类型。




  位运算符 - 按照二进制的位进行运算

   移位运算

    分为左移(<<,右移(>>,无符号右移(>>>

    左移后面补0,右移前面补符号位,无符号右移前面补0。

    如果移位超过32/64,会先取32/64的余数后再移位。int是32,long是64。

     7>>2 = ?    //0000 0111 -> 0000 0001    1

     7<<2 = ?    //0000 0111 -> 0001 1100    28

     7 >>> 2 = ? //0000 0111 -> 0000 0001    1

     -7 >>> 2 = ?//... 1111 1001 -> 0011 ... 1110 非常大的一个数

               0011 1111 1111 1111 1111 1111 1111 1110

          【例子】1.如何交换m = 12和n = 5的值

四种方案:

             2.将60转换为十六进制输出。



        位与/或/非运算

    位与(&就是按二进制位进行与运算,与1作 位与 相当于保持原有的值不变;与0作 位与 相当于清0。 与0xFF做位与的效果就是 取二进制的后8位。

    位或(|):与1作 位或 相当于置1,与0作 位或 维持 原有的值不变。

    位非(~):就是按位取反


  关于运算符有谁先算谁后算的问题,叫运算符的优先级。优先级有固定的顺序,但记住两点即可:

   1 括号()的优先级极高,不确定就用括号括一下,肯定先算了。

   2 赋值=的优先级极低,所以肯定最后算。


程序的执行次序包括三种:


   顺序结构/分支结构/循环结构。


   顺序结构 就是代码从上到下执行。最普通的代码执行次序。

   分支结构 也叫选择结构,就是代码到了这个位置,按照条件选择一个分支执行,也可以不选任何分支执行。

   循环结构 就是代码到了这个位置,可以多次反复执行。

   代码先天就是顺序结构,如果需要分支结构或者循环结构,使用特殊的代码--流程控制语句。


   流程控制语句之分支语句 (选择语句/条件语句/分支语句)

    Java中的分支语句: if/else语句、switch/case语句


   if/else的语法结构:


    if(条件1){   //如果  必须出现1次

      //满足条件1时执行的语句块

    }

    else if(条件2){ //或者  出现0-n次

      //满足条件2时执行的语句块

    }

    else{ //否则  出现0-1次

      //以上所有条件都不满足时执行的语句块

    }


    int a = 10;

    if(a>0){

      System.out.println("正数";

    }else if(a==0){

      System.out.println("零";

    }else{

      System.out.println("负数";

    }


  交换的算法:

  int a=3,b=2;

  int temp;

  temp=b;//a=3 b=2 temp=2

  b=a;//a=3 b=3 temp=2

  a=temp;//a=2 b=3


使用分支/循环语句时,注意临界点的判断。 分支语句或者循环语句中如果只有一个语句,{}可以省略不写。



  作业:

   1 ppt上的个税和出租车车费两个代码。

   2 输入年份和月份,输出该月有多少天

    1 3 5 7 8 10 12月 有31天

    4 6 9 11月 有30天

    2月 平年28天,闰年29天

    如何判断闰年:

    1 能被4整除并且不能被100整除的是闰年   或者

    2 能被400整除的是闰年




switch-case语句

if/else可以替换switch-case,但反之不行。

switch语句应用面极窄,只能判断有限个整数/整数表达式/枚举。浮点/字符串/类都不能判断。

语法:

  switch(整数/整数表达式/枚举){

    case 值1:

        语句块;

        break;

    ...

    default:

        语句块;

        break;

  }

注:  1 case后面只能放值,不能是表达式。case分支可以写多个。

                Java1.7switch开始可以支持String类型的内容,即 switch("zhangsan"  可以使用

         2 每个分支后面要用break退出,否则语法不报错,执行时逻辑出错。

         3 default一般放在最后,但其实可以放在前面和中间。


循环结构/循环语句 - 反复执行相同的代码块


       java的循环语句有三种: for循环/while循环/do while循环


       for循环和while循环是完全互通的,do while循环有所不同,先循环后判断。因此,for循环和while看条件执行,可能不执行;但do while循环至少执行一次。


       要求: 打印1-10的数字(循环语句搞定,执行相同的代码块)


  for循环的语法:

   for(循环变量的声明和初始化;循环条件;循环变量值的变化){

     //反复执行的代码块; 循环体

   }

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

     System.out.println(i);

   }

   执行次序: 1、int i=1 ; 2、i<11  3、println(i)  4、i++  5、i<11  6 ...

    i<11 不满足后退出


  练习:

   1 累加求和

     累加:1+2+...+10000=?

   2 水仙花数问题

     要求打印出所有的三位数的水仙花数。

     所谓“水仙花数”即一个整数满足其值等于各个数位的立方和。例如:

     153是一个水仙花数,因为153=1的3次方+5的三次方+3的三次方


  QQ聊天,也是一个循环,但循环次数不确定。次数不确定的循环:

   for(;;){

     ...;

     if(条件) break; // break可以退出switch语句或循环语句

     ...;

   }


   for(;;){ ...; }叫死循环,也叫无限循环。无限循环在程序员编程时是有可能被使用的,比如: 服务器等待客户端的连接就是无限循环。

   如果写错了,形成了死循环,按ctrl+C 可以退出。


  代码放在循环里还是循环外的标准:

   执行1次的放循环外,多次执行的放循环里。


多重循环 - 最常见的是二重循环

打印图形:

*

**

***

****

*****


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

  for(int j=0;j<i+1;j++){ // 内层循环的循环条件比较的困难,可以套公式

    System.out.print("*");

  }

  System.out.println();

}

内层循环条件的公式:

  j<m*i+n

  m就是每次循环的增量,如果递减取负数。

  n就是第一次循环的次数。

公式使用条件: i和j都要从零开始。   i和j都用++做循环变量的改变。


作业:

   1 猜数字的游戏,生成1-100的随机数,然后循环猜,输出猜大了,猜小了,猜对了,当猜对时退出。

   2 输入一个1-20的数字作开始,打印出该数字到100所有与7无关的数字。与7无关就是: 不能是7的倍数并且不能有数字7(个位数和十位数都不能是7)   

   3 打印图形如下:(行不变,列需要2个循环,分别打印空格和星星)

      *             0000*

     ***            000***

    *****           00*****

   *******          0*******

  *********         *********

   4 搬砖的问题。有36人,有36块砖。男人每人一次能搬4块,女人每人一次能搬3块,小孩每2人搬一块,正好一次搬完,每个人都搬了一次。求: 几男几女几小孩

    3,3,30

   5 打印2-200的所有质数。(难,可以商量)

   质数就是只能被1和它自身整除的数。 2 3 5 7 11 13 17 19 ....




打印2-200的所有质数。(难,可以商量)

  质数就是只能被1和它自身整除的数。 //不能直接做判断标准

  质数i不能被2到i-1 整除。 //判断标准

  一旦能被2到i-1整除,i肯定不是质数


while循环,与for循环基本一样,除了格式:

int i = 1;

while(i<11){

   System.out.println(i);

   i++;

}

while(true){ } //无限循环


do/while循环

  do循环和其它循环不一样,主要两点:

   1 do/while循环以分号;做结束,其它的循环以{ }做结束。

   2 do/while循环先执行再判断条件,因此至少执行一次。

  语法:

  do{

    //循环体;

  }while(条件);

  int i = 1;

  do{

    System.out.println(i);

    i++;

  }while(i<11);

  和前面的for/while循环相比,少了第一次的判断条件。


do/while循环使用次数较少,不是重点,但还是要搞定。


  break和continue

   continue语句用在循环体中,用于结束本次循环而开始下一次循环。

   break语句则是结束所在的整个循环。


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP