从C++习题中思考

目录

  • 一.开始
    • 1.1
  • 二.变量和基本类型
    • 1.1
    • 1.2
    • 1.3
    • 1.3
    • 1.4
    • 1.5

C++ Peimer习题集第5版练习。

在这里插入图片描述

一.开始

1.1

编写程序,提示用户输入2个整数,打印出这两个整数指定的范围内的所有整数。

方式1:使用while循环。

#include<iostream>
using  namespace std;
int main()
{cout<<"请输入2个整数:"<<endl;int v1,v2;cin>>v1>>v2;cout<<"输入结束"<<endl;if(v1>v2){while(v1>=v2){cout<<v1<<",";v1--;}}else{while(v1<=v2){cout<<v1<<",";v1++;}}cout<<endl;return 0;
}

方式2:使用for循环。

#include<iostream>
using  namespace std;
int main()
{cout<<"请输入2个整数:"<<endl;int v1,v2;cin>>v1>>v2;cout<<"输入结束"<<endl;if(v1>v2){for(;v1>=v2;v1--){cout<<v1<<",";}}else{for(;v1<=v2;v1++){cout<<v1<<",";}}cout<<endl;return 0;
}

思考:对比for循环和while循环,两种形式的优缺点是什么?
在循环次数已知的情况下,for循环的形式更加简洁。
在循环次数无法预知时候,用while循环实现更适合。

二.变量和基本类型

1.1

读程序写结果。

#include<iostream>
using  namespace std;
int main()
{unsigned u=10,u2=42;cout<<u2-u<<endl;cout<<u-u2<<endl;int i=10,i2=42;cout<<i2-i<<endl;cout<<i-i2<<endl;cout<<i-u<<endl;cout<<u-i<<endl;return 0;
}

运行结果:

32
4294967264
32
-32
0
0

思考:为什么u-u2会等于4294967264?

  1. 首先看u2-u,42-10=32没有疑问。
  2. u-u2属于无符号数之间的减法,无符号数字做减法,一定要确保结果非负数,否则会输出取模后的值。
  3. i2-i=32。
  4. i-i2=-32。
  5. i-u和u-i,当算术表达式中,既有无符号数值又有int值时,int值被转换为无符号数。具体转换的数值根据对应计算机环境中int的占位数。

因此,为了避免错误,切勿混合使用带符号类型和无符号类型。

1.2

编写代码分别更改指针的值以及指针所指对象的值。

#include<iostream>
using namespace std;
int main()
{int i=5,j=10;int *p=&i;cout<<p<<" "<<*p<<endl;p=&j;cout<<p<<" "<<*p<<endl;*p=20;cout<<p<<" "<<*p<<endl;j=30;cout<<p<<" "<<*p<<endl;return 0;
}

运行结果:

0xca7b9ff964 5
0xca7b9ff960 10
0xca7b9ff960 20
0xca7b9ff960 30

思考:本题旨在考查指针的含义,指针本身的值和指针所指对象的值的区别。
1.p是一个整型指针,初始的时候令p指向变量i,此时cout<<p即输出p所指对象的内存地址0xca7b9ff964,cout<<*p即输出p所指对象的值5。
2. p=&j,会更改指针的值,令p指向整数j,此时cout<<p即输出p所指对象的内存地址0xca7b9ff960 ,cout<<*p即输出p所指对象的值10。
3. *p=20和j=30,都改变了指针所指向对象的值,但是指针所指向的地址没有发生变化。

1.3

解释代码:

#include<iostream>
using namespace std;
int main()
{int i=42;int *p1=&i;*p1=*p1 * *p1;cout<<*p1<<endl;return 0;
}

运行结果:

1764

思考:首先定义了一个整形变量i并将其设初值为42,接着定义了一个整型指针p,指向i,然后取出指针p1所指对象的值,计算平方后重新赋给p1所指向对象的值。

1.3

下面的语句在C++中合法吗?

int i=0;
int *ip=i;

非法的,不能直接把int变量赋给int指针,正确的做法是通过取地址运算符得到变量i在内存中的地址,然后将该地址赋给指针。

1.4

假设p是一个int类型指针,请说明下述代码的含义。

if(p)//...
if(*p)//...

先来看一段程序:

#include<iostream>
using namespace std;
int main()
{int i=0;int *p1= nullptr;//空指针int *p=&i;if(p1)//检验指针的值(即指针所指向对象的地址){cout<<"p1 pass"<<endl;}if(p) //检验指针的值(即指针所指向对象的地址){cout<<"p pass"<<endl;}if(*p) //检验指针所指对象的值{cout<<"i pass"<<endl;}return 0;
}

运行结果:

p pass

对于if语句来说,if(表达式)括号里的表达式为1或者true时,才会满足条件执行。当指针p作为if语句的条件时,实际检验的是指针本身的值,即指针所指向对象的地址。
上面的程序中,p和p1是两个整型指针,其中p1被定义为空指针(nullptr),p则指向整数i。在三个if判断条件中,p1指向为空,即指向地址为0,条件不满足;p指向i,在内存中有一个实际的地址值且不为0,因此满足条件;p表示所指对象的值,即p=0,因此if条件不满足,所以最终输出结果为p pass。

1.5

说明下面的定义是什么意思,挑选出其中不合法的。

  1. int i,*const cp;
  2. int *p1,*const p2;
  3. const int ic,&r=ic;
  4. const int *const p3;
  5. const int *p;

1是非法的,cp是一个常量指针,因为常量指针所指向的值不能被改变,因此必须初始化,如:int i=0;*const cp=&i。
2是也是如此,p2是一个常量指针,因为常量指针所指向的值不能被改变,因此必须初始化。
3是非法的,ic是一个常量,他的值不能被改变,因此必须初始化。
4是非法的,p3是一个常量指针,他的值不能被改变,必须初始化;同时p3是常量,因此不能通过p3改变所指对象的值。
5是合法的。

思考:要注意常量引用、常量指针、指向常量的指针的区别。其实区别这些比较绕口的东西,只需要按照命名顺讯来读就行。

  • 常量指针:指针的指向不可以修改,指针指向的值也不可以修改。例如int * const p =&a;首先是一个指针int * , 然后一个const常量 那么p就是指针常量。
  • 常量指针:指针的指向可以修改,但是指针指向的值不可以修改。例如:const int *p=&a;首先是一个const常量, 然后一个指针int * 那么p就是常量指针。
  • 指向常量的常指针:指针的指向不可以修改,指针指向的值也不可以修改。例如:const int const *p=&a。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/601131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

socket实现视频通话-WebRTC

最近喜欢研究视频流&#xff0c;所以思考了双向通信socket&#xff0c;接下来我们就一起来看看本地如何实现双向视频通讯的功能吧~ 客户端获取视频流 首先思考如何获取视频流呢&#xff1f; 其实跟录音的功能差不多&#xff0c;都是查询电脑上是否有媒体设备&#xff0c;如果…

C语言学习NO.11-字符函数strlen,strlen函数的使用,与三种strlen函数的模拟实现

&#xff08;一&#xff09;strlen函数的使用 strlen函数的演示 #include <stdio.h> #include <string.h>int main() {char arr1[] "abcdef";char arr2[] "good";printf("arr1 %d,arr2 %d",strlen(arr1),strlen(arr2));return …

GUI三维绘图

绘制三维图plot3 t0:pi/50:10*pi; xsin(t); ycos(t); zt; plot3(x,y,z); 产生栅格数据点meshgrid 这个接口在绘制三维图像里面相当重要&#xff0c;很多时候要将向量变成矩阵才能绘制三维图。 x0:0.5:5; y0:1:10; [X,Y]meshgrid(x,y); plot(X,Y,o); x和y是向量&#xff0c;…

Python开发环境搭建

Python程序设计语言是解释型语言&#xff0c;其广泛应用于运维开发领域、数据分析领域、人工智能领域&#xff0c;本文主要描述Python开发环境的搭建。 www.python.org 如上所示&#xff0c;从官方网站下载Python最新的稳定版本3.12.1 如上所示&#xff0c;在本地的开发环境安…

Spring面试篇

Spring面试篇 前置知识ApplicationContextInitializerApplicationListenerBeanFactoryBeanDefinitionBeanFactoryPostProcesssorAwareInitialzingBean&#xff0c;DisposableBeanBeanPostProcessor SpringBoot启动流程IOC容器初始化流程Bean生命周期Bean循环依赖解决 SpringMvc…

关于kthread_stop的疑问(linux3.16)

线程一旦启动起来后&#xff0c;会一直运行&#xff0c;除非该线程主动调用do_exit函数&#xff0c;或者其他的进程调用kthread_stop函数&#xff0c;结束线程的运行。 之前找销毁内核线程的接口时&#xff0c;发现了kthread_stop这个接口。网上说这个函数能够销毁一个内核线程…

Linux 的引导与服务控制

一 开机启动过程 bios加电自检-->mbr-->grub-->加载内核文件-->启动第一个进程 1 bios加电自检 检测硬件是否正常&#xff0c;然后根据bios中的启动项设置&#xff0c;去找内核文件 2 mbr 因为grup太大,第一个扇区存不下所有的grub程序&#xff0c;所以分为…

【Tools】VS基本使用

文章目录 0 前言1 下载安装与基本使用1.1 下载安装1.2 项目创建1.3 编译运行和调试1.4 界面和设置 2 项目属性配置【重点】2.1 打开项目属性配置窗口2.2 静态库和动态库2.3 包含目录&库目录&依赖项&工作目录2.4 代码中添加附加依赖项2.5 配置项目环境变量2.6 修改属…

护眼台灯是智商税吗?眼科医生告诉你哪款护眼台灯最好

青少年近视发病率高达67%&#xff0c;如今&#xff0c;人们都被屏幕包围着&#xff0c;电脑、手机和电视已经成为最重要的信息手段&#xff0c;我们周围的屏幕也隐藏着有害的光污染。 对于4-15岁年龄段的孩子而言&#xff0c;除了学习本身带来的视力损伤外&#xff0c;每天接触…

C语言学习NO.12-字符函数(二)-strcpy,strcat,strcmp长度不受限制的字符串函数

一、strcpy的使用和模拟实现 &#xff08;一&#xff09;strcpy使用 //strcpy的使用 #include <stdio.h>int main() {char arr1[] "abcdef";char arr2[10] "qwertt";char arr3[10] "okl";strcpy(arr2, arr1);printf("arr2 %s\n&…

iOS 解决push证书不受信任

重新下载&#xff1a;https://www.apple.com/certificateauthority/

leetcode:2784. 检查数组是否是好的(python3解法)

难度&#xff1a;简单 给你一个整数数组 nums &#xff0c;如果它是数组 base[n] 的一个排列&#xff0c;我们称它是个 好 数组。 base[n] [1, 2, ..., n - 1, n, n] &#xff08;换句话说&#xff0c;它是一个长度为 n 1 且包含 1 到 n - 1 恰好各一次&#xff0c;包含 n 两…

Java反射篇----第三篇

系列文章目录 文章目录 系列文章目录前言一、反射使用步骤(获取 Class 对象、调用对象方法)二、获取 Class 对象有几种方法三、利用反射动态创建对象实例前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章…

Rust:qmetaobject 框架的环境变量和搜索路径设置

一、编译错误 安装qmetaobject后&#xff0c;编译出现下面错误信息&#xff0c;原因是环境变量和搜索路径没有正确设置。 qt_gui>cargo run warning: unused manifest key: buildCompiling qttypes v0.2.11 error: failed to run custom build command for qttypes v0.2.1…

【MYSQL】MYSQL 的学习教程(十一)之 MySQL 不同隔离级别,都使用了哪些锁

聊聊不同隔离级别下&#xff0c;都会使用哪些锁&#xff1f; 1. MySQL 锁机制 对于 MySQL 来说&#xff0c;如果只支持串行访问的话&#xff0c;那么其效率会非常低。因此&#xff0c;为了提高数据库的运行效率&#xff0c;MySQL 需要支持并发访问。而在并发访问的情况下&…

【IPC通信--信号】

信号处理函数 • 信号发送函数 – kill(), sigqueue(), raise(), alarm(), setitimer(), pause() &#xff0c; abort() • 信号安装函数 – signal(), sigaction() • 信号集操作函数 – sigemptyset(), sigfillset(), sigaddset(), sigdelset(), sigismember() 信号发送函数—…

将yolov8的检测框从正框修改为旋转框需要做那些修改?

将yolov8项目修改为yolov8_obb项目需要修改模型结构(增加角度预测)、dataloader(使其支持dota格式数据)、修改TaskAlignedAssigner(使其支持带角度的bbox)、修改loss(新增对角度的训练)、修改metric(将hbb指标titile修改为obb)、修改绘图代码(使其能绘制旋转框)。 …

常用类型_日期..

1.Date java.util.Date是开发中常用的日期处理类(并非java.sql.Date类) 现在这么一个需求&#xff1a; 就是获取当前时区的时间 public class Main{public static void main(String[] args) {// d1和d2表示的时间都是一样的 所以推荐使用第一种写法 比较简洁Date d1 new Da…

MybatisPlus—快速入门

目录 1.使用MybatisPlus的基本步骤 1.1引入MybatisPlus的起步依赖 1.2 定义Mapper 2.MybatisPlus常用注解 2.1 TableName 2.2 TableId 2.3 TableField 2.4 小结 3. 常用配置 4. 总结 1.使用MybatisPlus的基本步骤 1.1引入MybatisPlus的起步依赖 MyBatisPlus官方提…

124基于matlab的禁忌搜索算法和蚁群优化算法优化TSP路径

基于matlab的禁忌搜索算法和蚁群优化算法优化TSP路径&#xff0c;动态输出路径规划过程及输出最小距离。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。需要直接拍下&#xff0c;拍下后发邮箱。标价为程序价格&#xff0c;不包含售后。程序保证可直接运行。 …