Thinking in Java chapter5 笔记和习题
1 简介
Controlling Execution 这一章涉及的大多知识点和 C/C++ 中已经学过的类似,仅仅有一小部分不同,比如去掉了饱受争议的 goto 语句。本文记录控制语句学习过程中需要记录的知识点。
2 只有 boolean 有真假
由于Java是强类型语言, 只有 boolean 有真假。尤其要注意的是不能把 int 或者 float 的非零值当 true 来处理。 在使用 if 语句时, 比如 if(a) ,条件判断语句 a 必须是 boolean 类型。如果要用非 boolean 类型来做判断,则需要用这个非 boolean 类型的变量来生成一个 boolean 变量。比如对非布尔变量 a 做对比 (a = 0)= .
3 注意 a=b 问题
在 if 的条件判断句中,最容易犯的错误是: a=b . 本意是要比较 a 和 b 是否相等,但是 a=b 是赋值语句。这样的语句在 C/C++ 中不会报错,但是存在逻辑错误,但是在java中,这样的语句一定会报错。看代码:
1: //:control/IfElse.java 2: import static net.mindview.util.Print.*; 3: public class IfElse 4: { 5: static int result = 0; 6: static void test(int testval, int target) 7: { 8: if (testval > target) { 9: result = +1; 10: }else if (testval < target ) { 11: result = -1; 12: } 13: if (testval = target) { 14: result = 0; 15: } 16: } 17: public static void main(String args[]) 18: { 19: test(6,5); 20: print(result); 21: test(5,6); 22: print(result); 23: test(1,1); 24: print(result); 25: } 26: }
第14行代码在编译的时候会报错:
IfElse.java:14: error: incompatible types: int cannot be converted to boolean
if (testval = target) {
Java 在编译阶段就避免了代码中可能因为 a=b 导致的逻辑错误。我认为这是 Java 相对于 C/C++ 进步的地方。
4 Random的导入
在完成 Exercise02 的过程中,忘记导入 import java.util.* 导致无法使用 Random 类, 特此记录,看代码:
1: import java.util.*; 2: public class Exercise0502 3: { 4: public static void main(String args[]) 5: { 6: Random rand = new Random(); 7: 8: int target = rand.nextInt(); 9: int source; 10: for (int j=0; j < 25; j++) { 11: source = rand.nextInt(); 12: if (source > target) 13: System.out.println( "target " + target + 14: " < " + " source " + source); 15: else if (source < target) 16: System.out.println( "target " + target + 17: " > " + " source " + source); 18: else 19: System.out.println( "target " + target + 20: " = " + " source " + source); 21: } 22: 23: } 24: }
5 foreach
foreach 是 C 语言中不存在的一种循环表达方式,看代码:
1: import java.util.*; 2: public class ForEachFloat 3: { 4: public static void main(String[] args) 5: { 6: Random rand = new Random(); 7: float f[] = new float[10]; 8: for (int i = 0; i < 10; i++) { 9: f[i] = rand.nextFloat(); 10: } 11: for (float x : f) { 12: System.out.println(x); 13: } 14: 15: } 16: }
foreach 可以配合任何 Iterable 对象。 Python 中有一类数据叫做 iterator 其抽象程度比 Java 的 foreach 中用到的 Iterable 对象更高。