
3.5.1 组合关系和逻辑操作符
通过进一步考察图3-4,我们再次讨论运费计算问题。第一个要做出的程序判断是客户是否已经购买超过$100.00的商品。如果这是真的,那么下一个判断是客户是否需要陆运。如果购买额不超过$100.00,那么程序将进行其他选择。如果购买额是$100.00或者更多,并且客户住在美国而且愿意使用陆运,那么送货是免费的。但是,如果客户偏爱空运,那么就要回答其他一些问题。如果客户的包裹重量超过50磅,那么运费取决于客户是否住在美国。运费变化取决于商品的重量和送货目的地,图3-5说明了如何使用复合条件来简化类似于这种情况的判断结构数目。
3.5.1.1 逻辑操作符回顾
如第2章所讨论的那样,尽管有许多可用的逻辑操作符,但我们只需要使用其中的3个。也就是用两个&符号(&&)表示的AND操作符,用两个竖线(||)表示的OR操作符,以及用感叹号(!)表示的NOT操作符。
一个使用AND操作符的复合条件是true,当且仅当通过&&连接的两个条件都是true。一个使用OR操作符的复合条件是true,除非通过||连接的两个条件都是false。NOT操作符简单地意味着:如果表达式是true,那么!(表达式)是false;而且如果表达式是false,那么!(表达式)是true。
图3-5 使用复合条件
为了说明逻辑操作符和复合条件的使用,我们编写了一个工资程序,为在一周内工作超过40小时并且每小时收入少于$20.00的雇员支付加班费。其代码在例3.6中显示。
例3.6 加班费 这个例子计算雇员的每周工资。如果雇员的工作时间少于40小时,那么工资只是把工作小时数与雇员的时薪相乘。有些雇员有资格获取超出40小时之外工作时间的加班费。然而,如果雇员的时薪超过$20.00,那么他没有资格获取加班费。这也许不是在所有的州都是合法的,但是它可用于举例说明复合条件的使用。如果一个雇员有资格获取加班费,那么它将按常规时薪的1.5倍计算。
第9行展示了复合条件,它代替嵌套的if...else结构并且使程序容易运行和简单化。
例3.7提供逻辑操作符和复合条件的另一个样例。
例3.7 计算运费 在这个例子中,我们编写运费计算程序。图3-5展示购买额超过$100.00商品的客户的各种选择,但是公司可能根据其他数量收取不同的运费。在下面的例子中,我们使用复合条件为总额$1.00~$24.99、$25.00~$49.99、$50.00~$74.99和$75.00~$99.99的商品分别赋予不同的运费。在这个例子中,假定客户住在美国而且选择陆运。类似代码可用于许多其他选择。
这个程序运行得很好,然而是否有更好的方法来编写包括许多选项的程序代码呢?有。我们将在3.6节讨论处理这类结构的问题。
复合条件的最后一个例子将使用OR操作符。在例3.7所示代码的基础上,例3.8为有特殊优惠码的客户增加一项免运费选项。
例3.8 增加免运费选项 为例3-7添加代码,从而为录入特殊优惠码FREESHIP的客户提供免运费服务。这里只重复例3.7在第5~19行上的函数shipCost()。通过在第6行之后增加一行代码并且在第16行包括一个含有OR操作符的复合条件,可以为使用FREESHIP码的客户提供免运费服务。
第16行让购买额超过$100.00商品或者录入正确优惠码的客户免除运费。因为计算机按顺序执行命令,所以当到达第17行时不管ship的值是什么,如果在第16行上的复合条件是true,那么ship的值就是0.00,而不管客户是录入了正确的免运费码还是购买商品额超过$100.00。
3.5.1.2 关于语法的说明
关于编写if语句的复合条件有以下一点说明。语法如下:
每次必须写一个完整的条件。例如,不能写成这样:
也不能写成这样:
正确的语法如下:
这个完整的复合条件必须用圆括号括起来,包括其中的每个条件、变量、操作符和操作数。
3.5.1.3 使用AND和OR
学生经常想知道是否有关于何时使用AND操作符和何时使用OR操作符的特殊规则。在大多数情况下,只要小心编写那么无论使用哪一个操作符都能够正常工作。例如,若要把一个用户的选择限制在整数6、7、8和9,你可以使用AND操作符指定任何比5大而又比10小的数是可接受的。在JavaScript中,可以写成这样:
只有当num是6、7、8或9时,这个条件才是true。然而,你也可以把这个条件说成:任何小于或等于5,或者大于或等于10的整数是false。在JavaScript中,这种描述将使用NOT和OR操作符写成这样:
这两种方法都会产生相同的结果。使用其中一种方法而不使用另一种方法的理由取决于程序的其他元素。例3.9在一种情况下使用AND操作符而在另一种情况下使用OR操作符将产生相同的结果。
例3.9 在复合条件中使用逻辑操作符 下列程序与例3.6显示的程序做相同的事情,但是它使用另一个复合条件。这里的程序以注释形式再次写出例3.6使用的选择语句,以便于比较这两个选择语句的区别:
通常,下面两条语句生成相同的结果:
3.5节检查点
3.20 要使下列条件为true,则要求num具有什么整数值?
(num>3)&&(num<8)
3.21 要使下列条件为true,则要求num具有什么值?
(num<12)||(num>8)
3.22 假定变量num=4,以下每个表达式是true还是false?
a)((2*num)+1==3)&&(num>2)
b)!(2*num==0)||(num+1==5)
3.23 编写程序,它将告诉用户天气是否足够冷需要穿夹克。程序提示用户录入一个温度,如果录入的温度低于50,程序将显示Yes;如果录入的温度高于70,则显示No;而如果录入的温度在50~70之间,则显示Maybe。程序应该使用一个复合条件。