void floatTest(float x; float y) { // Arithmetic operators: x = x * y; x = x / y; x = x % y; x = x + y; x = x y; x++; x……; x = +y; x = …y; // Relational and logical: f(x 》 y); f(x 》= y); f(x 《 y); f(x 1; //! x = x 》》》 1; 81 …………………………………………………………Page 83…………………………………………………………… // pound assignment: x += y; x …= y; x *= y; x /= y; x %= y; //! x = 1; //! x 》》》= 1; //! x &= y; //! x ^= y; //! x |= y; // Casting: //! boolean b = (boolean)x; char c = (char)x; byte B = (byte)x; short s = (short)x; int i = (int)x; long l = (long)x; double d = (double)x; } void doubleTest(double x; double y) { // Arithmetic operators: x = x * y; x = x / y; x = x % y; x = x + y; x = x y; x++; x……; x = +y; x = …y; // Relational and logical: f(x 》 y); f(x 》= y); f(x 《 y); f(x 1; //! x = x 》》》 1; // pound assignment: x += y; 82 …………………………………………………………Page 84…………………………………………………………… x …= y; x *= y; x /= y; x %= y; //! x = 1; //! x 》》》= 1; //! x &= y; //! x ^= y; //! x |= y; // Casting: //! boolean b = (boolean)x; char c = (char)x; byte B = (byte)x; short s = (short)x; int i = (int)x; long l = (long)x; float f = (float)x; } } ///:~ 注意布尔值(boolean)的能力非常有限。我们只能为其赋予true 和false 值。而且可测试它为真还是为 假,但不可为它们再添加布尔值,或进行其他其他任何类型运算。 在 char,byte 和 short 中,我们可看到算术运算符的“转型”效果。对这些类型的任何一个进行算术运算, 都会获得一个 int 结果。必须将其明确“造型”回原来的类型(缩小转换会造成信息的丢失),以便将值赋 回那个类型。但对于int值,却不必进行造型处理,因为所有数据都已经属于 int类型。然而,不要放松警 惕,认为一切事情都是安全的。如果对两个足够大的 int 值执行乘法运算,结果值就会溢出。下面这个例子 向大家展示了这一点: //: Overflow。java // Surprise! Java lets you overflow。 public class Overflow { public static void main(String'' args) { int big = 0x7fffffff; // max int value prt(〃big = 〃 + big); int bigger = big * 4; prt(〃bigger = 〃 + bigger); } static void prt(String s) { System。out。println(s); } } ///:~ 输出结果如下: big = 2147483647 bigger = …4 而且不会从编译器那里收到出错提示,运行时也不会出现异常反应。爪哇咖啡(Java )确实是很好的东西, 但却没有“那么”好! 对于 char,byte 或者 short,混合赋值并不需要造型。即使它们执行转型操作,也会获得与直接算术运算相 同的结果。而在另一方面,将造型略去可使代码显得更加简练。 83 …………………………………………………………Page 85…………………………………………………………… 大家可以看到,除boolean 以外,任何一种主类型都可通过造型变为其他主类型。同样地,当造型成一种较 小的类型时,必须留意“缩小转换”的后果。否则会在造型过程中不知不觉地丢失信息。 3。2 执行控制 Java 使用了 C 的全部控制语句,所以假期您以前用C 或 C++编程,其中大多数都应是非常熟悉的。大多数程 序化的编程语言都提供了某种形式的控制语句,这在语言间通常是共通的。在Java 里,涉及的关键字包括 if…else、while、do…while、for 以及一个名为switch 的选择语句。然而,Java 并不支持非常有害的goto (它仍是解决某些特殊问题的权宜之计)。仍然可以进行象goto 那样的跳转,但比典型的 goto 要局限多 了。 3。2。1 真和假 所有条件语句都利用条件表达式的真或假来决定执行流程。条件表达式的一个例子是 A==B 。它用条件运算符 “==”来判断A 值是否等于 B 值。该表达式返回 true 或 false。本章早些时候接触到的所有关系运算符都可 拿来构造一个条件语句。注意 Java 不允许我们将一个数字作为布尔值使用,即使它在 C 和 C++里是允许的 (真是非零,而假是零)。若想在一次布尔测试中使用一个非布尔值——比如在if(a)里,那么首先必须用 一个条件表达式将其转换成一个布尔值,例如 if(a!=0)。 3。2。2 ifelse if…else 语句或许是控制程序流程最基本的形式。其中的 else 是可选的,所以可按下述两种形式来使用 if: if(布尔表达式) 语句 或者 if(布尔表达式) 语句 else 语句 条件必须产生一个布尔结果。“语句”要么是用分号结尾的一个简单语句,要么是一个复合语句——封闭在 括号内的一组简单语句。在本书任何地方,只要提及“语句”这个词,就有可能包括简单或复合语句。 作为 if…else 的一个例子,下面这个 test()方法可告诉我们猜测的一个数字位于目标数字之上、之下还是相 等: static int test(int testval) { int result = 0; if(testval 》 target) result = …1; else if(testval 《 target) result = +1; else result = 0; // match return result; } 最好将流程控制语句缩进排列,使读者能方便地看出起点与终点。 1。 return return 关键字有两方面的用途:指定一个方法返回什么值(假设它没有 void 返回值),并立即返回那个 值。可据此改写上面的 test()方法,使其利用这些特?