主题:条件运算符[1]
嵌套的if语句
当if表达式为true时,被执行的语句可以还是一条if语句,它也可以作为else子句的一条语句。这就使你可以表达一种错综复杂的逻辑关系,比如"如果我的银行有足够的余额,如果我带着支票本,就买一辆汽车,要不然如果我可以从银行获得贷款,也会买一辆汽车。"一个嵌套在另一条if语句中的if语句又可以包含一个嵌套的if语句。可以像此下去多层嵌套,只要你清楚自己在做什么或对繁琐、混乱情有独钟。
我们可以对前面例子中的if语句进行修改来说明嵌套的if语句,
if (number%2==0) //Test if it is even
(
if (number<50) //Output a message if number is <50
system.out.println(you have got an even number<50,"+number)
)
else
system.out .println (you have got an odd number,"+number);It is odd
这里如果假设number的值小于50,则显示一条有偶数值的信息。
因为有else子句,所以必须用一个大括号将嵌套的if语句括起来。大括号中内嵌I}语句意味着,若该语句拥有else子句,必将出现在包含嵌套if语句的大括号中。如果没有大括号,程序也可以被编译并运行,但逻辑结构却会发生变化。让我们看看是怎么回事。
在嵌套多层if语句后,会产生一个问题,即一个特定的else子句属于哪一个if语句。如果将上面代码中的大括号去掉,我们可以得到
if (number%2==0) //Test if it is even
if (number<50) //Output a message if number is <50
system.out.println(you have got an even number<50,"+number)
else
system.out.println(you have got an odd number +number);//It is odd
这种书写形式与前面的逻辑结构有着本质的区别。这里的else子句属于被嵌套在内的用来测试number值小于50的if语句,所以,第二个prirttln()调用仅在偶数值大于或等于50时才被执行。很显然,与我们所需要的结果有差别,因此本例中的输出结果是错误的,但是它能够说明将else连接到if的规则,即:
else子句永远属于前面的距离它最近的、属同一程序块的、没有匹配else子句的if语句。
你一定要认真仔细,以确保在嵌套if语句时的缩进格式正确。依照标识的缩进格式理解逻辑结构,很容易让你采纳,但它有可能是完全错误的。
让我们在另一个程序中试试if-else的应用,试试看--一种笨拙的译码方式
按如下所示,建立LetterCheck类并编写main()方法的代码:
public class LetterCheck
{
public static voif main(string[] args)
{
char symbol="A"
symbol=(char)(128.0*Math.random()); //Generate random character
if (symnol>=A) //Is it A or greator
if system.out.println(you have the capital letter +symnol);
else //It is not z or less
if (symbol>=a) //so is it a or greater?
if (symbol>=z) //YES so is it z or less?
//Then it is a small letter
system.out.println(you have the small letter symbol
else //it is not less than z
system.out.println(
"the code is less than a and it's not a letter)
else
system.out.println(the code is less than a so it's not a letter)
如何工作
这个程序用来识别存储在变量symbol中的值是大写字母、小写字母还是其他字符。它首先产生一个在0到127之间的随机字符,这个字符与基本的7位ASCII字符集(ISO646)中的字符对应。你可以在附录D中查阅ASCII字符集编码。ASCII字符的编码与Unicvde字符集中对应字符的编码相同。在这个字符集中,字母'A'到'Z'用65到90这组相邻的ASCII编码来表示。小写字母用另一组从97到122·的相邻ASCII编码来表示。所以,你只需将字符编码加上32就可以将任何大写字母转换为小写字母。
该If语句确实有一些复杂,所以让我们来看看下述逻辑图。
这张图一共有4条if语句。第一条if语句测试symbol是否大于等于'A'.如果成立,它可能是一个大写字母、小写字母或其他可能的编码,反之,它肯定不是一个字母。所以,if语句的else子句(直到程序结尾)对这种结果产生一个相应的信息。
布尔AND操作
你可以使用AND运算符包含的&&或&中的任意一个,只有当两个逻辑表达式都true时,结果才为true,比如,你既要富裕又要健康。从逻辑表达式看,这两个运算符将产生相同的结果。那么,它们的差距在哪儿?首先,让我们看看它们是如何使用的。下面所有的论述对于&和&&都将产生相同的效果。
让我们看看逻辑运算符是如何简化上一个例子的。假如你需要测试一个char类型的变量是否包含一个大写字母,就可以使用&&运算符。被测试的变量内容必须大于或等于A并且(AND)小于或等于Z.两个条件都必须为ture才说明这个变量所表示的是一个大写字母。我们用前一个程序举例,对于一个存储在char类型的变量symbol中的字符,我们可以通过在if语句的判别表达式中使用&&运算符简化对大写字母的测试:
if (symbol>="A"&& symbol<=z)
system.out.println(you have the Capital letter"+symbel
如果查阅一下第2章中的优先级表,你就会看到关系运算符优先于&&运算符,所以不需要用括号。在这里,只有当被&&运算符连接的两个条件都为true时,输出语句才被执行。然而,就像我们前面所说的,适当增加括号是一种良好的习惯,它提高了代码的可读性,并且一可以帮助我们避免不必要的错误。
实际上,&&操作的过程非常简单。当两个操作数都为true时,结果为true:反之为false.
现在,我们可以重新编写上一个例子中if语句代码段。
试试看--一种简单的编译方法
用下列语句替换LetterCheck.java中外层的if-else及内容:
if(symbol>="A" && symbol< "z") //Is it a capital letter?
system.out.println(you have the capital letter +symbol);
else
if (system >="A" &&symbol<= z ) //or is it a small letter?
system.out.println(you hve the small letter symbol
else //It is not less than z
system.out.println(the code is not a letter)
如何工作
使用&&运算符已经将例子缩短了一些。现在,我们可以用两个if语句来完成这项工作。它肯定更易于表现事件的发生过程。
你需要注意,当else子句中的语句是另一条if语句时,这条if语句有时与。else写在同一行上,如下所示:
if(symbol=="A"&& symbol<'z') //In it a capital letter
system.out.println|you have the captal) letter +symbol;
else if (symbol>="a"&& symbol=z) //or is it a smll letter?
system.out.println (you have the small letter symbol
else //It is not loss than z
system.out.println(The code is not a letter);
但是,我认为前一种书写方式更清楚,所以我不喜欢后一种格式。
&&与&
如何区分&&和&呢?它们之间区别在于,如果左边的操作数是false,则&&条件表达式将不对运算符右边的操作数进行判断,因为在这种情况下,结果肯定是false.从此可以看出,左边操作数是false时,运算速度会快一些。
例如,思考一下下列语句:
int number=50;
if (number<40 &&(3*number-27)>100)
system.out.println(number=number)
在这里,由于表达式number<40+的结果总是false,所以表达式((3*number-27)>100永远不会被执行。另外,如果你将语句编写为,
int number=50;
if (number<40 &&(3*number-27)>100)
system.out.println(number=number)
这样编写后效果就发生了变化。整个逻辑表达式都将被计算,即使&运算符左边的操作数是false,并且结果已经肯定不成立,右边的操作数(f3*number-27 )>100)还要计算。所以,我们可以使用&&加快程序的运行速度,忘记&吧,对吗?不对。这将取决于你要操作的内容。在绝大多数情况下,你可以使用&&,但有时你需要计算右边的操作数,同样也有一些例子,在左边操作数是false的情况下,不希望计算右边的操作数。
第一种情况可能出现,例如,当右边表达式包括对一个变量的修改,并且你需要这个变量在任何情况下都被修改时。比如这样一个语句:
if (value%2==0 &++count
//Do something
这里,变量count在任何情况下后将递增。如果你用&&代替&,count仅在AND运算符左边的操作数为true时增加。使用不同的运算符,有可能获得不同的结果。
我们可以用下列语。句说明第二种情况:
if(count>0 && tatal/count>5)
//Do something
在这个例子中,如果左边操作数为true,即count是正数,&&运算符右边的操作数才执行。显然,如果我们在这里使用&,并且count正好为0,就会出现用0除total的情况,没有代码可以阻止这一情况的发生,程序最终将被中断。
布尔OR操作
OR运算符,|和||,应用在当任意一个或者两个操作数都是true时,结果为true.的操作。条件的OR,||,和条件的AND具有相同的效果,即当运算符左边的操作数是true时,忽略右边的操作数的计算。显而易见,假如左边的操作数是true,则不管右边的操作数是true还是false,其结果都为true .
让我们举一个例子。对于16岁以下和65岁以上的人们,票价打折;你可以使用下面的if语句来测试:
if(age<16||age>=65)
tickeprice*=0.9 //Reduce ticket price by 10%
在这里,如果其中一个条件为true,则ticketPrice(票价)就降低%10.很显然,本例中的两个条件都不满足。
用|或者||进行操作时,若两个操作数都为false,则结果为false.若其中一个或两个操作数为true,则结果为true.
布尔NOT操作
第三种逻辑运算符,属一元运算符,其结果为操作数的相反值。所以,如果布尔变量state的值为true,则表达式!state的值就为false,反之则为true.为了介绍这个运算符在表达式中的使用方法,我们可以重新编写提供打折票价的代码段:
if(age<16||age>=65)
tickeprice*=0.9 //Reduce ticket price by 10%
若年龄在16至64岁之间,表达式(age>=16&&age<65)为true.这一年龄段的居民不能享受打折,所以打折应该在表达式为false的时候执行。对表达式的结果使用!运算符就可以满足我们的需要。
我们也可以在下述表达式中应用!运算符,这是作家狄更斯的喜好:
!(Income>Expenditure)
如果表达式为加。(就是说,你将入不敷出),结果就悲惨了,至少银行会马上开始退回你的支票。
当然,若需要的话,也可以在表达式中混合使用任何一种逻辑运算符。如果这个主题公园决定对12岁以下并且身高在48英寸以下,或者年龄在65岁以上并且身高在72英寸以上的人们提供门票打折的话,就可以使用下列测试语句实现这项测试操作:
if ((age<12 && height<40) (age>65 && height>72)
ticketPrice*=0.8 //20% discount on the ticket price
严格地说,这里并不需要括号,&&比||的优先级高,但是,增加括号可以使我们更加清楚这些比较操作的结合方式,也使程序更具有可读性。
不要把运算符&、|和!与看起来相同的逻辑运算符混淆,在特定的例子中,使用运算符的类型是由所使用的操作数类型决定的。位运算符应用于整数类型,并且产生一个整数结果,逻辑运算符应用于布尔型操作数,并且将产生布尔型结果、ture或false.如果你习惯的话,你可以在表达式中同时使用位运算符和逻辑运算符。
使用标准库方法测试字符
使用逻辑运算符测试字符,是一种演示这些运算符工作过程的很好途径,实际上,这也是一种更简便的方法。标准的Java包为我们提供了一系列标准方法可完成这类测试工作,其中包括用if语句测试特定的字符集,比如,字母、数字。它们可用于character类,该类被自动地加载到程序中。例如,我们可以在LetterCheck程序中编写如下所事的if语句:
试试看--无意义的译码
用下面代码替换LetterCheck类的代码块:
if (character.isUpperCase(symbol))
system.out.println(you have the capital letter symbol);
else
if (character.isLowerCase(symbol))
system.out.println(you have the capital letter symbol);
else
system.out println(The code is not a letter)
如何工作
如果传递给isUppeiCase()方法的char是大写字母,则该方法返回true,反之返回false.同样,如果传递给isLowerCase()方法的char是小写字母,则该方法返回true。
QQ 744437114
疯狂软件官网:http://www.fkjava.org
疯狂java视频 android视频:http://www.fkjava.org/video.html