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
对象更高。