C++程序设计课本翻译programming - in - C++-紧缩版(8)

2019-08-01 23:13

用关系运算符把两个表达式连接起来的式子被称为关系表达式。关系表达式的结果是bool类型,例如,如果x是5并且y是10,下列表达式都有true值: x = = 5 y > x y >= x x ! = y x < y x < = y

如果x是字符’M’并且y是’R’,表达式的结果仍是true ,因为用于字符中的关系运算符<, 意思是“’M’在字符设置顺序对照表中在’R’之前”。

例如,广泛使用的ASCll字符设置,所有大写字母是以字母顺序排列的,小写字母也是一样,但是,所有大写字母在小写字母之前,所以 ‘M’<’R’ 和 ’m’<’r’ 的值是true,但是 ‘m’<’R’ 的值是false。

当然,我们必须要小心我们所比较的事物的数据类型,最安全的方法是,总是将int的数据类型与int的数据类型比较,float的与float的比较,char的与char的比较等等。如果你在比较中混合了数据类型,隐含着出现类型强制就像描述表达式中的一样。如果一个int值与一个float值比较,计算机在比较之前,暂时强制int值为与它等值的float值。与描述表达式一样,使用显式类型转换使你的目的可知是明智的。 someFloat > = float(someInt)

如果你比较一个布尔值和一个数字值(可能会出错),false值是暂时强制成数0,true强制成数1,因此,如果boolVar是一个bool变量,表达式 boolVar < 5

产生true ,因为0和1都小于5。 例如,比较

‘0’ < ’9’ 和 0 < 9 是合适的,但是 ‘0’ < 9

产生一个隐含类型强制并且结果可能不是你所期望的。

我们不仅可以使用关系运算符比较变量或常量,而且可以比较算术表达式的值。在下列表中,我们取不同的x和y的值,将x加3的结果与y乘10的结果比较。

注意:容易混淆赋值运算符(=)与关系运算符= = ,在程序中,两个运算符有非常不同的效果。 串比较

回忆第4章,string是一个类——用户自定义的类型,你用这个类型声明变量,这个变量更常称为对象。包含在每个string对象内的是一个字符串,string类被设计成可以使用关系运算符来比较这些串,按照句法规则,关系运算符的操作数可以是两个string对象,像在myString = ”Johnson” 可是,操作数不可以都是C串。

串的比较是遵循计算机字符设置(如ASCII)的排列顺序来进行的。当计算机测试两个字符间的关系时,在每个串中从第一个字符开始,按照排列顺序比较它们,如果它们相同,重复比较下一个字符,一个字符一个字符的测试下去,直至找到一个不匹配的字符或最后一个字符比较完也是相等为止。如果它们所有字符老师相等,那么两个串是相等的。如果有一个不匹配字符被找到,那么字符排列在前的串是更小的串。 例如,给出语句 string word1 ; string word2 ;

word1 = ”Tremendous” ;

word2 = ”Small” ;

在下列表中的关系表达式有指定的值。

如果有两个不同长度的串比较,相等比较是一直到较短的串的末尾,然后,较短的串小于较长的串,例如,如果word2包含”small”,表达式 word2<”Smaller”

产生true,因为比较一直到它们的第5个字符位置(左边串的末尾)串都是相等,而右边串更长。 5.2 条件和逻辑表达式 逻辑运算符

在数学中,逻辑(或布尔)运算符AND,OR和NOT把逻辑表达式作为操作数对待,C++对于逻辑运算符使用专门的符号:

&&(与) ||(或) !(非)

将关系运算符和逻辑运算符结合在一起,我们可以得到更复杂的判断式。例如,假设我们想要确定期末成绩是否大于90及期中成绩是否大于70,在C++中,我们以这种方法写表达式。 finalScore > 90 && midtemScore >70

AND操作(&&)需要两个关系式都是真,总的结果才是真,如果两个关系式有一个为假,总的结果为假。 OR操作(||)取两个逻辑表达式并把它们结合在一起,如果两者中有一个为真,结果为真,两个值必须都为假,结果才会为假。现在我们可决定是期中成绩为A还是期末成绩为A,如果期中成绩或者期末成绩等于A,判断式为真,在C++中,我们写表达式像这样: MidtermGrade = = ’A’ || finalGrade = = ’A’

&&和||运算符是双目(两个操作数)运算符。NOT运算符(!)是单目(一个操作数)运算符,它对一个逻辑表达式操作并给出它的相反值作为结果。如果(grade = =‘A’)是假,那么!(grade = =‘A’)是真。NOT给我们一种判断意思相反的方便的方法,例如, !(hours > 40) 等价于 hours <= 40

在某些前后关系中,第一种形式更清楚,在另一些关系中,第二种形式更好理解。 下列成对的表达式是等价的:

密切注意这些表达式,确信你理解了为什么它们是等价的。试试用某些a、b、c和d的值求它们。注意形式:左边的表达式就是它的右边用!加上关系和逻辑运算符所表示的取反(例如,= =用!=取代,|| 用&&取代),记住这种形式,这允许你以最简单的形式重写表达式。

逻辑运算符可以被应用到比较结果中,它们也可以直接应用于bool类型的变量,例如,取而代之写为 isElector = ( age > = 18 && district = = 23 )

赋一个值给布尔变量isElector,我们可以使用两个中间布尔变量,isVoter和isConstituent : isVoter = ( age > = 18 ) ;

isConsticuent = ( district = = 23) ; isElector = isVoter && isConstituent ;

下面两个表格总结了一对逻辑表达式应用&&和 || 的结果(这里x 和y用布尔变量表示)。 下面表格总结了对一个逻辑表达式应用!运算符的结果(x表示布尔变量)

在技术上,C++运算符!,&&和||不需要有逻辑表达式作为操作数。它们的操作数可以具有任何简单数据类型甚至浮点类型,如果一个操作数不具有bool类型,它的值暂时强制成bool类型如下:

0 值强制成false ,并且任何非零值强制成true。贯穿本书,我们将逻辑运算符仅应用于逻辑表达式,而不是用于应用算术表达式。

短路径(条件)求值:一个逻辑表达式的求值是从左到右,一旦最终真实值能被决定求值就停止。 考虑逻辑表达式

i ==1 && j > 2

C++采用短路径(或有条件的)求逻辑表达式的值。求值过程从左到右,计算机—有可能就停止求子表达式的值——即,只要它一知道整个表达式真实值时就停止子表达式求值,如果计算机不检查所有子表达式,它如何能知道,一个过长的逻辑表达式是产生true还是false?让我们首先看看AND操作。

如果AND的两个操作数是true,AND操作产生true值。在上面表达式中,假如i的值是95,第1个子表达式产生false,所以计算机甚至不必看第2个子表达式,计算机就停止求值并产生最后false结果。 具有或OR的操作,从左到右求值,只要一找到产生true的子表达式,求值就停止,记住,OR操作数中的一个或两个为true,OR产生一个true的结果。给出这个表达式 c < = d || e == f

如果第1个子表达式是true,求值停止并且整个表达式的结果是ture。计算机不浪费时间对第2个子表达式的不必要求值。

运算符的优先权

在第3章中,我们讨论了求取算术表达式的优先权规则。C++也给出了关系和逻辑运算符的优先权规则,这里是一个列表,显示了算术,关系,逻辑运算符的优先权顺序(赋值运算符也给出了)

列表中同一行的运算符优先权相同,如果一个表达式包含几个具有相同优先权运算符,大部分运算符组(或伙伴)从左到右求值,例如,表达式 a / b * c

意味着( a / b )* c ,不是 a / (b * c),可是,单目运算符组(!,单目+,单—)是从右到左,虽然你从没有机会使用这个表达式: !! bad Data

这意味着!(!badData)而不是意味着(!!)badData ,附录B, “运算符的优先权”,列出了C++中所有运算符的优先权次序。 关系运算符与浮点类型

不要用等于号来比较实数:当执行实数计数时,由于在最右边小数位置中的小误差,两个实数值几乎不能确切地相等,例如,考虑下面使用两个名为oneThird和x的实型变量: oneThird =1.0 /3.0 ;

x = oneThird + oneThird + oneThird ;

我们会认为x包含的值为1.0,但是它可能不是,第一条赋值语言存储一个1/3的近似值到oneThird,也许是0.333333 。第2 条语句存储一个像0.999999这样的值到x中,如果我们现在要计算机比较x和1.0,比较结果产生false。

比较实数相等,我们采用近似相等测试来取代,为了这样做,我们计算两个数之间差值,测试看看结果是否小于某些允许的最大差值,例如,我们常使用像这样的比较。 fabs( r – s) < 0.00001

这里fabs是 C++标准库中实数绝对值的函数 。表达式fabs (r – s)计算两个float变量r和s差值的绝对值。如果差值小于0.00001,两个数足够接近称它们相等。 常见错误

逻辑表达式中许多错误在于英语中我们倾向采取的简化操作,我们也许查询期中成绩是不是‘A’或者期末成绩是不是‘A’但是如果我们在C++中直接写为 midtermGrade | |finalGrade = = ‘A’

我们得到一个错误的结果,因为或运算符 || 连接了一个字符值(midtermGrade)和一个逻辑表达式(finalGrade = =’A’),或 | |的两个操作数应该是逻辑表达式,所以我们必须写为 midtermGrade = =’A’ | | finalGrade = =’A’

类似地,判断i是否等于3还是4,不能写为 i = =3 || 4 而必须写为 i = =3 || i = = 4 数学中使用的标记 12 < y < 24

意思是“y是在12与24之间”,但是直接将这个标记转换为C++就会有一个不同的效果。首先,关系式12 < y 被求值,给出结果true 或false 然后,计算机把这个结果强制成 1和0都小于24 ,结果总是 true,正确转换的C++是 12 < y && y < 24

5.3 If 语句

现在我们已看到了如何写逻辑表达式,让我们使用它们来改变程序中正常的控制流。If语句是基本的控制结构,允许在控制流中产生分支。用它,我们可以提出一个问题并且选择一个行为方向:If某条件存在,那么完成一项行为,else否则执行一项不同的行为。 If —Then—Else 形式

在C++中,If语句以两种形式出现,If—Else形式和If形式。 让我们看看第1种IF—Else形式,这里是它的语法模板。

圆括号中的表达式可以是任何简单数据类型,几乎没有例外,表达式将是一个逻辑(布尔)表达式,如果不是,它的值隐含强制成bool类型,在执行时,计算机求表达式的值,如果值是true,计算机执行语句1A,如果表达式的值为false,语句1B被执行,语句1A常被称为then-clause ,语句1B被称为 else-clause, 图5-3说明了If –Then-Else的控制流程,在图中,语句2是程序中整个If语句后面的下一条语句。

注意,一个C++ If 语句使用保留字if 和else而不包含字then,我们仍使用术语If –Then –Else ,因为它与我们用英语说的事“If(如果)某事为真,then(那么)做这个,else(否则)做那个”相符合。 下面代码段显示了在程序中如何写If语句。观察then从句和else从句的缩排形式,这使得语句更容易阅读,注意下列If语句的位置。 if (hours < = 40.0) Pay = rate * hours ; else

Pay = rate * (40..0+(hours-40.0)*1.5) ; cout << pay ;

按照计算机的指令,上面代码段说,“如果hours 是小于或等于40.0,计算常规薪水,然后继续执行输出语句;但是如果hours 是大于40.0,计算常规薪水和超时薪水,然后继续执行输出语句。”

作为另一个If-Then-Else的例子,假如我们想决定一个string变量中字母A第一次出现所处的位置,回想第3章,串类有一个成员函数名为find,这个函数返回所找到项目的位置(如果项目没有找到,返回名字常量 string : : npos),下列代码输出搜索的结果。 string myString; string::size_type pos; . .

pos = myString.find('A') ; if (pos == string::npos)

cout << \else

cout <<\

按照模板,在If语句的末尾没有分号。在上面两个程序段中——工人的薪水和串搜索例子——似乎在每个If语句末尾都有一个分号。可是,在这些例子中,这个分号属于else从句;赋值语句以分号结束,输出语句也以分号结束。If语句在末尾没有自己的分号。

块(复合语句)

在一个表达式中,检查避免被零除,假如当除数等于零时,我们想要做两件事:打印一个错误信息。并设置名为result的变量等于一个像9999这样的特殊值,在同一分支中,我们会需要两条语句,但是语法模板似乎限制我们一条语句。

我们真正想做的事是,将else从句转成一系列的语句,这是容易的、记住第2章中编译器处理的块。 { . . }

就像单条语句一样,如果在一个If语句的分支中,你用一对花括号{}括起语句序列,语句序列变成为单个块 例如: if (divisor != 0)

result = dividend / divisor ; else {

cout << \result = 9999; }

如果divisor的值是0 ,在继续If 语句后面的任何语句之前,计算机打印错误信息中设置result变量的值为 9999.

块可以用在 If –Then – else 两个分支语句中,例如: if (divisor != 0) {

result = dividend / divisor;

cout << \} else {

cout << \result = 9999: }

当你在一个If语句中使用块,有一个C++语法规则要记住:在块的右花括弧后面,决不能使用分号,分号用来中止简单语句,例如赋值语句,输入语句,和输出语句。在上面例中,在花括号后没有分号,右花括弧发出每个块结束的信息。 If- Then 形式

有时,你运行到一种情况,在这种情况下,你想说:“如果某一条件存在,那么完成某些活动;其它情


C++程序设计课本翻译programming - in - C++-紧缩版(8).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:住房公积金 - 专办员试题与答案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: