编程思想——第三章控制流程

来源:互联网 发布:淘宝产品介绍文案 编辑:程序博客网 时间:2024/06/05 20:31

Java运算符:

所有运算符都能根据自己的运算对象生成一个值。除此以外,一个运算符可改变运算对象的值,这叫作“副作用”(Side Effect)。

运算符最常见的用途就是修改自己的运算对象,从而产生副作用。但要注意生成的值亦可由没有副作用的运算符生成。

几乎所有运算符都只能操作“主类型”(Primitives)。唯一的例外是“=”、“==”和“!=”,它们能操作所有对象(也是对象易令人混淆的一个地方)。除此以外,String 类支持“+”和“+=”。


优先级:

建议通过括号明确标记顺序


赋值:

赋值是用等号运算符(=)进行的。“取得右边的值,把它复制到左边”

右边的值可以是任何常数、变量或者表达式,只要能产生一个值就行

左边的值必须是一个明确的、已命名的变量。也就是说必须有个物理空间保存右边的的值 。

主类型:主类型容纳了实际的值,而且并非指向一个对象的句柄。在为其赋值的时候,可将来自一个地方的内容复制到另一个地方。

假设为主类型使用“A=B”,那么 B 处的内容就复制到 A。若接着又修改了 A,那么 B 根本不会受这种修改的影响。

对象类型:  对一个对象进行操作时,我们真正操作的是它的句柄。所以倘若“从一个对象到另一个对象”赋值,实际就是将句柄从一个地方复制到另一个地方。

这意味着假若为对象使用“C=D”,那么 C 和 D 最终都会指向最初只有 D 才指向的那个对象。

在赋值过程中,那个句柄实际已经丢失;它的对象会由“垃圾收集器”自动清除)。这种特殊的现象通常也叫作“别名”,是 Java 操作对象的一种基本方式。

以对象为参数是传递句柄,也相当于别名。


算术运算符:

运算符与其它语言类似。整数除法会直接砍掉小数,而不是进位。简写运算如:+=

为生成数字,程序首先会创建一个 Random(随机)对象。由于自变量是在创建过程中传递的,所以 Java 将当前时间作为一个“种子值”,由随机数生成器利用。通过 Random 对象,程序可生成许多不同类型的随机数字。做法很简单,只需 调 用 不 同 的 方 法 即 可 : nextInt() , nextLong() , nextFloat() 或 者nextDouble()。

Random rand = new Random(); int j = rand.nextInt() % 100;

模数运算符(%)可将结果限制到运算对象减 1 的上限

    1. 一元加、减运算符            一元减号得到的运算对象的负值。一元加号的含义与一元减号相反,虽然它实际并不做任何事情。

    2.自动递增和递减       ++         --

对每种类型的运算符,都有两个版本可供选用;通常将其称为“前缀版”和“后缀版”。

对于前缀形式,我们在执行完运算后才得到值。但对于后缀形式,则是在运算执行之前就得到值。

它们是唯一具有“副作用”的运算符(除那些涉及赋值的以外)。

    3.关系运算符            小于(<)、大于(>)、小于或等于(<=)、大于或等于(>=)、等于(==)以及不等于(!=)。

关系运算符生成的是一个“布尔”(Boolean)结果。

比较对象时使用equals()方法.主类型使用== !=

 equals()的默认行为是比较句柄。除非在自己的新类中改变了 equals(),否则不可能表现出我们希望的行为。

大多数 Java 类库都实现了 equals(),所以它实际比较的是对象的内容,而非它们的句柄。

    4.逻辑运算符             AND(&&)、OR(||)以及 NOT(!)

但要注意,对浮点数字的比较是非常严格的。即使一个数字仅在小数部分与另一个数字存在极微小的差异,仍然认为它们是“不相等”的。

短路:这意味着只有明确得出整个表达式真或假的结论,才会对表达式进行逻辑求值。因此,一个逻辑表达式的所有部分都有可能不进行求值

如果在前面部分可以得到结果,后面的的运算就不会执行。

    5.按位运算                        操作一个整数主数据类型中的单个“比特”,即二进制位。

若两个输入位都是 1,则按位 AND 运算符 (&)在输出位里生成一个 1;否则生成 0。若两个输入位里至少有一个是 1,则按位 OR 运算符 (|)在输出位里生成一个 1;只有在两个输入位都是 0 的情况下,它才会生成一个 0。若两个输入位的某一个是 1,但不全都是 1,那么按位  XOR(^,异或)在输出位里生成一个1。按位  NOT(~,也作“非”运算符)属于一元运算符;它只对一个自变量进行操作(其他所有运算符都是二元运算符)。按位 NOT 生成与输入位的相反的值——若输入 0,则输出 1;输入 1,则输出 0。

按位运算符可与等号(=)联合使用,以便合并运算及赋值:&=,|=和^=都是合法的(由于~是一元运算符,所以不可与=联合使用)。

    6.移位运算                        移位运算符面向的运算对象也是二进制的“位”。

可单独用它们处理整数类型(主类型的一种)。左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补 0)“有符号”右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入 0;若值为负,则在高位插入 Java也添加了一种“无符号”右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入 0

若对 char,byte 或者 short 进行移位处理,那么在移位进行之前,它们会自动转换成一个 int。只有右侧的 5 个低位才会用到。这样可防止我们在一个 int数里移动不切实际的位数。

    7.三元运算 if-else                    布尔表达式 ? 值 0:值 1

    8.逗号运算符                            在 Java 里需要用到逗号的唯一场所就是 for 循环

    9.字符运算符+                            运算符过载

如果想通过“加号”连接字串(使用 Java 的早期版本),请务必保证第一个元素是字串(或加上引号的一系列字符,编译能将其识别成一个字串)

    10.造型运算                            也就是类型强制转化        “造型”(Cast)的作用是“与一个模型匹配”。

对于boolean类型不允许造型,类的造型需要特定的转化,上溯造型。


float f4 = 1e-45f; // 10 to the power

float f4 = 1e-47f; //10 的幂数

通常,表达式中最大的数据类型是决定了表达式最终结果大小的那个类型。



执行控制:if-else    while    do-while    for    switch   但不支持    goto

if-else :

    if(布尔表达式)

    语句

或者

    if(布尔表达式)

    语句

    else

    语句

while:

    while(布尔表达式)

    语句

do-while:

do-while 的格式如下:

    do

    语句

    while(布尔表达式)

for:

for(初始表达式; 布尔表达式; 步进)

语句

终端和继续:

在任何循环语句的主体部分,亦可用 break 和 continue 控制循环的流程。其中,break 用于强行退出循环,不执行循环中剩余的语句。而 continue 则停止执行当前的反复,然后退回循环起始和,开始新的反复。

“标签”是后面跟一个冒号的标识符,就象下面这样:

label1:

类似goto的跳转

label1:

外部循环{

内部循环{

    //...

    break; //1

    //...

    continue; //2

    //...

    continue label1; //3

    //...

    break label1; //4

}

}

在条件 1 中,break 中断内部循环,并在外部循环结束。

在条件 2 中,continue移回内部循环的起始处。

但在条件 3 中,continue label1 却同时中断内部循环以及外部循环,并移至 label1 处。随后,它实际是继续循环,但却从外部循环开始。

在条件 4 中,break label1 也会中断所有循环,并回到 label1 处,但并不重新进入循环。也就是说,它实际是完全中止了两个循环。

如果没有 break outer 语句,就没有办法在一个内部循环里找到出外部循环的路径。这是由于 break 本身只能中断最内层的循环(对于 continue 同样如此)。当然,若想在中断循环的同时退出方法,简单地用一个 return 即可

在 Java 里唯一需要用到标签的地方就是拥有嵌套循环,而且想中断或继续多个嵌套级别的时候。

开关:switch

switch(整数选择因子) {

case 整数值 1 : 语句; break;

case 整数值 2 : 语句; break;

case 整数值 3 : 语句; break;

case 整数值 4 : 语句; break;

case 整数值 5 : 语句; break;

//..

default:语句;

}

例子:

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

switch (i) {

case 0:

prtInt(i);

// break;

case 1:

prtInt(i);

// break;

case 2:

prtInt(i);

// break;

case 3:

prtInt(i);

// break;

case 4:

prtInt(i);

// break;

case 5:

prtInt(i);

// break;

default:

// break;

}

}

}

private static void prtInt(int i){

System.out.println("value is "+i);

}


结果:

value is 0

value is 0

value is 0

value is 0

value is 0

value is 0

value is 1

value is 1

value is 1

value is 1

value is 1

value is 2

value is 2

value is 2

value is 2

value is 3

value is 3

value is 3

value is 4

value is 4

value is 5


遇到case后就会一直运行一直到结束或者到break语句