《C++ Primer》第4章 4.3节习题答案

本文详细解析了C++中的逻辑与、逻辑或及相等性运算符的求值顺序。逻辑与遵循短路求值,只有当左侧为真时才计算右侧;逻辑或也是短路求值,但左侧为假时才计算右侧。举例说明了在if语句和while循环中如何使用这些运算符。同时,讨论了如何通过表达式检查多个条件,如确保a大于b、b大于c、c大于d。此外,还解释了关系运算符的优先级,以及不正确的表达式可能导致的错误理解,如i!=j<k的含义。
摘要由CSDN通过智能技术生成

《C++ Primer》第4章 表达式

4.3节逻辑和关系运行符

练习4.8:说明在逻辑与、逻辑或及相等性运算符中运算对象求值的顺序。
【出题思路】
逻辑与、逻辑或执行短路求值,相等性运算符则正常计算两个运算对象的值。
【解答】
对于逻辑与运算符来说,当且仅当两个运算对象都为真时结果为真;对于逻辑或运算符来说,只要两个运算对象中的一个为真结果就为真。
逻辑与运算符和逻辑或运算符都是先求左侧运算对象的值再求右侧运算对象的值,当且仅当左侧运算对象无法确定表达式的结果时才会计算右侧运算对象的值。这种策略就是短路求值。其策略是:对于逻辑与运算符来说,当且仅当左侧运算对象为真时才计算右侧运算对象;对于逻辑或运算符来说,当且仅当左侧运算对象为假时才计算右侧运算对象。
值得注意的是,逻辑与运算符和逻辑或运算符是C++中仅有的几个规定了求值顺序的运算符。相等性运算符的两个运算对象都需要求值,C++没有规定其求值顺序。

练习4.9:解释在下面的if语句中条件部分的判断过程。
const char *cp = "Hello World";
if (cp && *cp)
【出题思路】
本题旨在考查指针和解引用运算符作为if条件的用法。
【解答】
cp是指向字符串的指针,因此上式的条件部分含义是首先检查指针cp是否有效。如果cp为空指针或无效指针,则条件不满足。如果cp有效,即cp指向了内存中的某个有效地址,继续解引用指针cp并检查cp所指的对象是否为空字符'\0',如果cp所指的对象不是空字符则条件满足;否则不满足。在本例中,显然初始状态下cp指向了字符串的首字符,是有效的;同时当前cp所指的对象是字符'H',不是空字符,所以if的条件部分为真。

练习4.10:为while循环写一个条件,使其从标准输入中读取整数,遇到42时停止。
【出题思路】
综合运用逻辑与运算符及相等性运算符,注意在本题中利用了逻辑与运算符的短路求值特性,其左侧运算对象是为了确保右侧运算对象求值过程的正确性和安全性。
【解答】
最简洁的形式是:
while(cin >> num && num != 42)
该语句首先检查从输入流读取数据是否正常,然后判断当前读入的数字是否是42,遇到42则条件不满足,退出循环。还有一种形式也可以实现同样的目的:

#include <iostream>

using namespace std;

int main()
{
    int num;
    while(cin >> num)
    {
        if(42 == num)
        {
            cout << "num=============" << num << endl;
            break;
        }
    }
    
    return 0;
}

运行结果:

练习4.11:书写一条表达式用于测试4个值a、b、c、d的关系,确保a大于b、b大于c、c大于d。
【出题思路】
本题旨在考查关系运算符的用法。
【解答】
要想用一条表达式测试a、b、c、d的关系,并确保a大于b、b大于c、c大于d,应该写成:
a > b && b > c && c > d
切勿写成:
a > b > c > d因为关系运算符满足左结合律且运算的结果是布尔值,所以把几个关系运算符连写在一起必然会产生意想不到的结果。a > b > c > d的实际求值过程是先判断a > b是否成立,成立则为1,不成立则为0;接着用这个布尔值(1或0)与c比较,所得的结果仍然是一个布尔值;最后再用刚刚得到的布尔值与d进行比较。显然这一过程与用户的书写原意背道而驰。

练习4.12:假设i、j和k是三个整数,说明表达式i!=j<k的含义。
【出题思路】
需要明确两种关系运算符!=和<的优先级关系,这是解答本题的关键。
【解答】
C++规定<、<=、>、>=的优先级高于==和!=,因此上式的求值过程等同于i!=(j<k),意即先比较j和k的大小,得到的结果是一个布尔值(1或0);然后判断i的值与之是否相等。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值