柴田讲逻辑运算符“或”和“与”,这两个运算符,在数学上用过很多次了,判断必要条件、充分条件用。我现在也没有记住必要条件和充分条件之间的区别。有没有什么记忆的小技巧?不知道我之前是怎么学的,反正一直没记住。刚才查了资料,首先必要和充分说的是条件,为什么要强调这个?因为条件和结果是两个角度,如果你在说条件,那就是满足条件或不满足条件,结果会怎样。这在暗示一个推导顺序。指定条件和结果,意思是指定推导的顺序。为了简化顺序描述还能表示条件和结果的关系,使用必要条件、充分条件、充要条件这些术语。
必要条件是说,如果没有a,一定没b,如果有a ,不一定有b,如果有b ,一定有a。这样我还是记不住必要条件的,还要再简化一下,结果b能推出条件a,但有a不一定有b。不行,还是记不住。父亲是儿子的必要条件。父亲是条件,儿子是结果。有儿子一定有父亲,有父亲不一定有儿子。这让我想到远山启的逆定理的推导,也是在说这个关系。他说,下雨是坏天气。但坏天气不是下雨。坏天气是下雨的必要条件。可以从范围的大小来看,应老师用的例子是省和市的大小,宁波市是浙江省,浙江省不是宁波市。浙江省是宁波市的必要条件。从大小的角度看必要条件是合适的。必要条件看大小,大是小的必要条件。
下次再有人给我扯必要条件,我应该立马想到一句话,大是小的必要条件,含义着小能推出大,但大未必推出小。
继续说柴田的逻辑或和逻辑与,他的习惯,先来个代码,再讲解内容。
if (n >= 3 && n <=5)
System.out.println("Spring");
if(n >= 6 && n <=8)
System.out.println("Summer");
if(n >= 9 && n <=11)
System.out.println("Autumn");
if(n == 12 || n ==1 || n==2)
System.out.println("Winter");
这是读入一个月份,然后判断季节,n >= 3 && n <=5,这是说满足这两个条件之后,表达式为true,执行语句。否则执行下一个if。&& 是逻辑与,读音是and,在java中的用法区别于一个& ,具体怎么区别不知道。第七章的内容。
n== 12 || n ==1 || n==2,满足其中一个条件,表达式就是true,||是逻辑或。
柴田说,有一个短路求值的问题,对于&&,如果左操作数为false,程序不再判断右操作数。对于||,如果左操作数为true,程序不再判断后面的操作数。这就是短路求值。英文是short circuit evaluation,我肯定是记不住这个英文的,罗列出来留着复习吧。
柴田布置一个简单的题目,判断成绩等级,如果是0-59则不及格,60-69及格,70-79良,80-100优。
刚开始我想着能不能在最后用一个else,这样可以省去(n >= 80 && n <=100)
不行,漏想了一种情况。代码如下
if (n >= 0 && n <=59)
System.out.println("不及格");
if(n >= 60 && n <=69)
System.out.println("及格");
if(n >= 70 && n <=79)
System.out.println("良");
//if(n >= 80 && n <=100)
// System.out.println("优");
else
System.out.println("优");
输入0-69,会出现两个结果,总是会输出优。一方面这不是我想要的结果,另一方面,为什么会出现这样的结果呢?
上次的笔记说,else有一个就近原则,和上一个if是配对的。这是说,如果数值小于70,程序先挨个判断if,输出一个语句。程序判断到if(n >= 70 && n <=79)之后,会跳到else执行一个优。因为if里面的判断为false,外面的else就是true,会执行。
如果加上代码块呢?逐个尝试{}的位置,都不对,不是想要的结果,最后我放弃使用else了。还是用
if (n >= 0 && n <=59)
System.out.println("不及格");
if(n >= 60 && n <=69)
System.out.println("及格");
if(n >= 70 && n <=79)
System.out.println("良");
if(n >= 80 && n <=100)
System.out.println("优");