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

本文详细介绍了C++中的算术运算符,包括它们的优先级和结合律,并通过一系列练习题来加深理解。练习4.4展示了如何使用括号改变表达式求值过程,得出结果91。练习4.5和4.6进一步探讨了乘法、除法、取余的计算规则以及判断奇偶性的表达式。练习4.7则引入了溢出的概念,给出了可能导致溢出的表达式例子。
摘要由CSDN通过智能技术生成

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

4.2节算术运算符

练习4.4:在下面的表达式中添加括号,说明其求值的过程及最终结果。编写程序编译该(不加括号的)表达式并输出其结果验证之前的推断。
12 / 3 * 4 + 5 * 15 + 24 %4 / 2
【出题思路】
本题旨在考查算术运算符的优先级和结合律,乘法和除法的优先级相同,且均高于加减法的优先级;算术运算符都满足左结合律,意味着当优先级相同时按照从左向右的顺序进行结合。
【解答】
添加括号之后的形式应该是(( 12 / 3 )* 4 )+( 5 * 15 )+ (( 24 %4 )/ 2),
求值的过程是:首先计算12/3得到4,接着4*4得到16,同时计算5*15得到75,计算24%4得到0,接着计算0/2得到0,最后执行加法运算16+75+0得到91。最终的计算结果是91。

#include <iostream>

using namespace std;

int main(void)
{
    int val = 12 / 3 * 4 + 5 * 15 + 24 % 4 / 2;
    cout << "val=====================" << val << endl;
    
    return 0;
}

运行结果:

 练习4.5:写出下列表达式的求值结果。
(a) -30 * 3 + 21 / 5            (b) -30 + 3 * 21 / 5
(c) 30 / 3 * 21 % 5                (d) - 30 / 3 * 21 % 3
【出题思路】
本题主要考查乘法、除法、取余的计算规则。
【解答】
本题用到两条典型的算术运算规则。一是除法:整数相除结果还是整数,如果商含有小数部分,直接弃除。尤其当除法的两个运算对象的符号不同时,商为负,C++11新标准规定商一律向0取整。
二是取余:如果取余的两个运算对象的符号不同,则负号所在的位置不同运算结果也不相同,m%(-n)等于m%n,(-m)%n等于-(m%n)。因此,本题的求值结果是:

#include <iostream>

using namespace std;

int main()
{
    int val1 = -30 * 3 + 21 / 5;
    int val2 = -30 + 3 * 21 / 5;
    int val3 = 30 / 3 * 21 % 5;
    int val4 = -30 / 3 * 21 % 4;
    
    cout << "val1=============" << val1 << endl << endl;
    cout << "val2=============" << val2 << endl << endl;
    cout << "val3=============" << val3 << endl << endl;
    cout << "val4=============" << val4 << endl << endl;
    
    return 0;
}

运行结果:

练习4.6:写出一条表达式用于确定一个整数是奇数还是偶数。
【出题思路】
根据奇数和偶数的定义可知,一个数能被2整除的数是偶数,不能被2整除的数是奇数。
【解答】
下面的表达式可以用于确定一个整数是奇数还是偶数,假设该整数名为num,则表达式num % 2 == 0为真时num是偶数,该表达式为假时num是奇数。

#include <iostream>

using namespace std;

int main()
{
    int val = 25 % 2;
    if(0 == val)
    {
        cout << val << "是偶数" << endl;
    }
    else
    {
        cout << val << "是奇数" << endl;
    }
    
    return 0;
}

运行结果:

 练习4.7:溢出是何含义?写出三条将导致溢出的表达式。
【出题思路】
当计算的结果超出类型所能表示的范围时,产生溢出。
【解答】
溢出是一种常见的算术运算错误。因为在计算机中存储某种类型的内存空间有限,所以该类型的表示能力(范围)也是有限的,当计算的结果值超出这个范围时,就会产生未定义的数值,这种错误称为溢出。假定编译器规定int占32位,则下面的3条表达式都将产生溢出错误:

#include <iostream>

using namespace std;

int main()
{
    int val1 = 2147483647 + 1;
    int val2 = -100000 * 300000;
    int val3 = 2015 * 2015 * 2015 * 2015;
    cout << "val1===================" << val1 << endl;
    cout << "val2===================" << val2 << endl;
    cout << "val3===================" << val3 << endl;
    
    return 0;
}

 显然与我们的预期不相符,是溢出之后产生的错误结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值