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 . 本意是要比较 ab 是否相等,但是 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

foreachC 语言中不存在的一种循环表达方式,看代码:

 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 其抽象程度比 Javaforeach 中用到的 Iterable 对象更高。