java编程思想--4控制执行流程

就像有直觉的生物一样,程序必须在执行过程中控制他的世界,并做出选择。在java中你要使用执行控制语句来做出选择。
     在java中,涉及的关键字包括if-else,while,do-while,for,return,break以及选择语言switch。java并不支持goto语句,但是仍然可以进行类似goto那样的跳转,比起典型的goto,有了很多限制。
1.true和false
      所有条件语句都利用条件表达式的真或假来决定执行流程。注意:Java不允许我们将一个数字作为布尔值使用,虽然这在C和C++里是允许的。(与C和C++区别)
    如果使用数字作为判断条件会报:Type mismatch: cannot convert from int to boolean
2.if-else
基本形式:
if(boolean-expression)
     statement

if(boolean-expression)
    statement
else
    statement
3.迭代
      while、do-while和for用来控制循环。有时将它们划分为迭代语句。
      while循环的格式:
      while(boolean-expression)
           statement
 
     do-while的格式:
     do
          statement
     while(boolean-expression)
 
     while 和do-while唯一的区别就是do-while中的语句至少会执行一次,即便表达式第一次就被计算为false。
 
        for格式:
      for(init;boolean-expression;step)
           statement
4.Foreach语法
     java SE5引入了一种新的更加简洁的for语法用于数组和容器,即foreach语法。
public class ForEach{
     public static void main(String[] args){
     Random rand=new Random(47);
     float f[]=new float[10];
     for(int i=0;i<10;i++)
          f[i]=rand.nextFloat();
     foreach(float x:f)
          System.out.println(x);
}
}
      注意:在foreach循环的时候,集合里面的值是不能改变的,否则会报错。
5.return
       return关键词有两方面用途:一方面指定一个方法返回什么值,另一方面它会导致当前方法退出,并返回那个值。
     如果在返回void的方法中没有return语句,那么在该方法的结尾处会有一个隐式的return。
6.break和continue
      break用于强行退出循环,不执行循环中剩余的语句。而continue则停止执行当前的迭代,然后退回循环起始处,开始下一次的迭代。

7.臭名昭著的goto
       尽管goto仍是java中的一个保留字,但是在语言中并未使用它;java没有goto。但是java也可以实现一些类似的跳转,这与break和continue有关。
      
label1:
outer-iteration{
     inner-iteration{
     break;//(1)
     continue;//(2)
     continue label1;//(3)
     break label1;//(4)
     }
}

       在(1)中,break中断内部迭代,回到外部迭代。在(2)中,continue是执行点移回内部迭代的起始处。在(3)中,continue label1同时终端内部迭代以及外部迭代,直接转到label1处,随后,它实际上是继续迭代过程,但却从外部迭代开始。在(4)中,break label1也会中断所有迭代,并回到label1处,但是并不重新进入迭代,也就是说完全中止了2个迭代。
8.switch
switch格式:
switch(integral-selector){
      case integral-value1:statement;break;
      case integral-value2:statement;break;
      //.....
     default:statement;
}
其中integral-selector(整数选择因子),必须是一个int或者char那样的整数值。


一 用控制语句求素数的算法
public class Test {
public static void main(String[] args) {
int f,k,i,j;
for(int n=1;n<100;n++){
f=0;
k=(int)Math.sqrt(n);
i=2;
while(f==0 && i<=k){
if(n%i==0){
f=1;
}
else{
i++;
}
}
if(f==0){
System.out.println(n);
}
}
}
}
二 Foreach 语法
for(int x : a)
这条语句定义了一个 int 类型的变量 x ,继而将数组 a 中每一个元素赋值给 x ;
例:
int a[]=new int[10];
for(int i=0;i<10;i++){
a[i]=i;
}
for(int x : a){
System.out.println(x);
}
三 标签
标签是后面跟有冒号的标识符,如 label:
java中,标签起作用的唯一的地方是刚好放在迭代语句之前,一般跟break或continue一起使用在两次循环中,规则如下
1 一般的continue使执行点移回内部循环的起始处,并继续执行
2 带 标签的continue会同时中断两层循环并到达标签的位置,并重新进入紧接在那个标签后面的循环
3 一般的break会中断内部循环回到外部循环
4 带标签的break会中断并跳出循环,但不进入标签紧接的循环
例:
label1:
outer-iteration{
inner-iteration{
continue;
break;
continue label1;
break label1;
}
}
四 switch语句
switch(c){
case value1:statement;break;
case value2:statement;break;
default:statement;
}
五 吸血鬼数字算法
吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。以两个0结尾的数字是不允许的,例如,下列数字都是“吸血鬼”数字:
  1260 = 21 * 60
  1827 = 21 * 87
  2187 = 27 * 81
public class Test {
static int a(int i) {
return i/1000;
}
static int b(int i) {
return (i00)/100;
}
static int c(int i) {
return ((i00)0)/10;
}
static int d(int i) {
return ((i00)0);
}
static int com(int i, int j) {
return (i * 10) + j;
}
static void productTest (int i,int m, int n) {
if(m * n == i) System.out.println(i + ' = ' + m + ' * ' + n);
}
public static void main(String[] args) {
for(int i = 1001; i < 9999; i++) {
productTest(i, com(a(i), b(i)), com(c(i), d(i)));
productTest(i, com(a(i), b(i)), com(d(i), c(i)));
productTest(i, com(a(i), c(i)), com(b(i), d(i)));
productTest(i, com(a(i), c(i)), com(d(i), b(i)));
productTest(i, com(a(i), d(i)), com(b(i), c(i)));
productTest(i, com(a(i), d(i)), com(c(i), b(i)));
productTest(i, com(b(i), a(i)), com(c(i), d(i)));
productTest(i, com(b(i), a(i)), com(d(i), c(i)));
productTest(i, com(b(i), c(i)), com(d(i), a(i)));
productTest(i, com(b(i), d(i)), com(c(i), a(i)));
productTest(i, com(c(i), a(i)), com(d(i), b(i)));
productTest(i, com(c(i), b(i)), com(d(i), a(i)));
}
}
}
六 Match.random() 产生[0,1)的随机数


Java的控制语句中,涉及的关键字包括:if-else,while,do-while,for,return,break,switch.java没有goto语句,但有类似功能的语句。
4.1true 和false
所有条件语句都利用条件表达式的真或假来决定执行路径。例如,if(a){},其中a必须是布尔值或是能产生布尔值的表达式。
4.2 if-else
if(布尔表达式){                                      //布尔表达式必须产生一个布尔结果
执行语句;                                    //简单或复合语句
}
或者:
if(布尔表达式){
执行语句;
}else{
}
4.3 迭代:while,do-while,for用来控制循环.
while(boolean-expression){                   //在循环刚开始时,会计算一次布尔表达式的值,在下一次迭代开始前会再计算一次 ,直到值为“假”才停止   
statement;
}
4.3.1do-while:
do
statement;                                    //与while唯一区别:至少执行一次
while(boolean-expression);
4.3.2 for(初始化;布尔表达式;步进表达式){                         //每次迭代前都会检查布尔表达式
}                                                                      //初始化和步进表达式都可以通过逗号操作符定义多个变量,但必须具有相同的类型
例如:for(int i=1,j=i+1;i<5;i++,j=i*2)
4.4 Foreach 语法
import java.util.Random;

public class StringOperator {

public static void main(String[] args) {
Random rand=new Random(47);
float f[]=new float[10];     //不理解????????
for(int i=0;i<10;i++){
f[i]=rand.nextFloat();
}
for(float x:f){
System.out.println(x); //foreach用法,把f数组的每个值赋给x

<span style="font-family: Arial, Helvetica, sans-serif;">}</span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre"> </span>}</span>
<span style="font-family: Arial, Helvetica, sans-serif;">}</span>
4.5return 
指定一个方法返回什么值,同时导致当前的方法退出,并返回那个值。对于返回void的方法,结尾处有一个隐式的return。
4.6 break和continue ,都可控制循环的流程。
break:强制退出循环,不执行循环中的剩余部分;
continue:停止当前的迭代,退回到循环起始处,开始下一次迭代。
4.7 java没有“goto”
outer:                                   //标签,必须放在迭代之前,最好这之间不置入任何语句
for(){
      //外部迭代
for(){
      //内部迭代
break;
      //中断内部迭代,回到外部迭代
continue;
      //停止当前迭代,使执行点回到内部迭代开始处,进行下一次迭代
break outer;
      //中断所有迭代,回到标签处,但不重新进入迭代;如果没有这个语句,就不能从内部循环跳出外部循环
continue outer;   //同时中断内部迭代和外部迭代,直接转到标签处,从下一次外部迭代开始
}
}                                            //如果想在中断循环时退出,用一个return即可。
4.8 switch(整数选择因子){           //整数选择因子是一个能产生整数值的表达式,switch将这个结果与每个整数值比较
case 整数值1:statement;break;            //这个值必须是int或char那样的整数值,若是字符串或浮点数则switch不工作
.............................
    //在case语句中,只用单引号引起的字符也会产生用于比较的整数值
default:statemnet;
}
例如,switch(c){
case'a':
  case'b':
case'c':
case'd':print("结果"):break;                         //多重匹配,输出四个结果并退出
}

1.java中不允许一个数字当做布尔值来使用,而在C或者C++中可以
2.java中唯一用到逗号的地方就是for循环的控制表达式
3.for循环可以定义多个变量,但是这些变量必须要有相投的类型
4.要熟练使用for--each循环
5.break退出整个循环,continue退出当前循环
6.switch的case后面一定要跟上break'语句(有一次出bug就是因为粗心没有加上break)

1.true和false

Java不允许我们将一个数字作为布尔值使用,虽然这在C和C++里是允许的(在这些语句里,“真”是非零,“假”是零)。


2.Foreach语法

for(float x : f){

}
在数组f中遍历。
String类有一个方法toCharArray()返回一个char数组。
printb()方法打印出来的语句不会换行。


3.break和continue

break用于强行退出循环,不执行循环中剩余的语句,只能跳出一层循环。而continue则停止执行当前的迭代(不执行本次循环的后续代码),然后退回循环起始处,开始下一次迭代。


4.臭名昭著的goto
不提倡使用goto,会给程序带来毁灭性灾害。
break和continue配合标签使用,效果更佳。

一般continue会返回最内层循环的开头(顶部),并继续执行。
带标签的continue会达到标签的位置,并重新进入紧接在那个标签后面的循环。
一般break会中断并跳出当前循环。
带标签的break会中断并跳出标签所指的循环。
在Java里需要使用标签的唯一理由就是因为有循环嵌套存在,从而想从多层嵌套中break或continue。

5.switch
switch中的选择因子必须是int或者char那样的整数值。

Java不允许我们将一个数字作为布尔值使用。

Java里唯一用到逗号操作符的地方就是for循环的控制表达式。

foreach表示不必创建int变量去对由访问项构成的序列进行计数,foreach将自动产生每一项。该语法用于数组和容器。
点击(此处)折叠或打开
for (类型名 变量 : 原变量)

尽管goto任然是Java中的一个保留字,但在语言中并未使用它;Java没有goto语句。
在Java中,使用标签。标签起作用的唯一地方刚好是在迭代语句之前。“刚好之前”
下面讲述规则:
> 一般的continue语句退回最内层循环的开头,并继续执行;
> 带标签的continue会到达标签的位置,并重新进入紧接在那个标签后面的循环;
> 一般的break会中断并跳出当前循环;
> 带标签的break会中断并跳出标签所指示的循环。

大部分操作符只能操作基本类型(primitives),只有=、==和!=可以操作对象,另外String支持+和+=
2、在=两边,右值(rvalue)可以是常数、变量或表达式,左值(lvalue)必须是一个变量,即必须有物理空间来存储rvalue
3、对基本类型赋值,是将一个地方的内存复制到了另一个地方
[@more@]
1、大部分操作符只能操作基本类型(primitives),只有=、==和!=可以操作对象,另外String支持+和+=
2、在=两边,右值(rvalue)可以是常数、变量或表达式,左值(lvalue)必须是一个变量,即必须有物理空间来存储rvalue
3、对基本类型赋值,是将一个地方的内存复制到了另一个地方
4、为对象赋值时,只是将引用从一个地方复制到另一个地方,如对象a和b,使a=b,则a和b两个引用操作同一个对象,使用a.i改变对象中的i值后,打印b.i,可以看到也被改变了
5、向方法中传递一个对象做参数,实际传递的是对象的引用,所以方法中对对象所做的修改,在方法外仍然持续有效。
6、整数除法会直接去掉结果的小数位,不会进行四舍五入进位
7、用==和!=来比较引用时,指向同一对象的引用相等,否则不等
8、若要比较两个引用指向的两个对象内容是否相等,使用.equal()方法,自定义类型需要自行重载.equal()函数,否则.equal()函数默认比较引用,只有jdk自带类型的.equal()可以直接使用
9、逻辑与、逻辑或、逻辑非(&&、||、!)操作只可以应用于boolean值,不可用于比较非boolean值
10、boolean可以自动转成String
11、短路(short-circuiting)现象:一旦能够明确无误的确定整个表达式的值,程序就不再计算表达式余下的部分了,因此,一个逻辑表达式靠后的部分可能不会被运算。所以要注意是否在逻辑表达式中对变量值进行了修改操作,如果这一部分表达式没有运算,值也就没有被修改
12、位操作符(bitwise operator):按位与(&)、按位或(|)、按位非(~)、异或(^),位运算表达式不会短路
13、移位操作符(shift operator):左移位操作符(<<),低位补0;右移位操作符(>>),若符号为正,则高位补0,若符号为负,则高位补1,即始终维持符号不变;无符号右移位操作符(>>>),无论正负,高位都补0
14、boolean-exp ? value0 : value1,三元操作符,如果boolean表达式为true,则以value0为结果,否则以value1为结果
15、类型转换操作符(casting operator):就是强制转换,一般用于进行窄化转换(narrowing conversion)。java允许由低精度类型向高精度类型自动转换,如把int值赋给long,但反之则必须手工强制转换
16、boolean类型不能和除字符串外的任何类型相互转换。
17、表达式中出现的最大(所占位数最多,如double比int多,不是指数值最大)的数据类型决定了表达式最终结果的数据类型
18、Java中所有的数据类型在所有平台上的大小都是相同的,它被固定在语言中了
19、int(其它数值型也可以)数过大时可能产生溢出,但java无论是编译还是运行时,都不会报这个错误或异常,结果显然是错误的
20、控制程序流程时所用的判断必须是boolean,不允许使用普通数字,必须先转换成boolean,如if(a!=0)
21、迭代(iteration),也可以理解为循环
22、break强行退出循环,跳过循环语句,执行后面的代码,continue停止当次循环,开始下一次循环
23、无穷循环有两种形式:for(;;)或while(true),它们是等价的,使用时要小心,循环体内一定要有break或return之类的语句,且执行它们条件必须是可以满足的
24、可以为循环标上label,之后使用continue label或break label来控制程序流程,语法为在循环定义行前加上"label1:"
25、switch语句的条件和其中各个case都必须是int或char(直接用数字或单引号加字符,如'a'),每个case后别忘了break,否则无法退出来(当然某些特殊情况下你可能并不想退出来,而是想要一次执行多个case,default后就不需要break了,执行过default自然会退出,不过放一个break会使风格看起来更整齐)
26、Math.random()用于产生一个01之间的随机double数,严格的说,它的结果包括0,但不包括1






猜你喜欢

转载自zhyp29.iteye.com/blog/2306464
今日推荐