C++学习笔记01-语法基础(问题-解答自查版)

前言

以下问题以Q&A形式记录,基本上都是笔者在初学一轮后,掌握不牢或者频繁忘记的点

Q&A的形式有助于学习过程中时刻关注自己的输入与输出关系,也适合做查漏补缺和复盘。

本文对读者可以用作自查,答案在后面,需要时自行对照。

--

问题集

Q1:结构化编程?C++的核心:OOP和泛型编程?

Q2:关于头文件命名,#include 合规,#include 语法没有错误,为什么却编译报错?

Q3:using namespace std; 中,using语法是属于编译指令吗?namespace的作用域的设计目的?

Q4:cout << 中的 “<<” 运算符叫什么名字?stream/流 是什么?控制符(manipulator)是什么?

Q5:const在C和C++的区别?const安全的底层原理?

Q6:在函数运行中定义变量合适吗?推荐做法是什么?a的值会随着循环每次变化吗?eg :

int main() {while(1) {int a = 0; print(a++);   // 这里的 定义int a变量是合理的吗?}
}

Q7:C风格中,原来需要预处理的 xxx.h 头文件在C++的新方式?

Q8:int在不同系统上可能有不同的位数表现(16bits/32bits),那么有办法设置int位宽吗?

Q9:以下两条语句的含义?

        int a{5};

        int b = {5};

Q10:unsigned类型有浮点数吗?

Q11:如果提前知道变量可能表示的int值大于16位,则推荐使用 long 而不是 int(大于20e则使用 long long),why?

Q12:伪代码 int a + bool b 的执行结果如何?其背后原理?进一步地,两个float数 f1+f2 内部运算是怎么样的?

Q13:语句 short i;  cout << int(i); 的含义是什么?为什么要这样设计?这里的int()是一个函数吗?

Q14:关于auto关键字原初的设计意图?

Q15:char a[n] 和 string的本质区别?

Q16:关于连续使用cin,我们已知的问题是第一个cin随着回车会导致遗留\0到下一个cin被读到

标准的解决方式是什么?

Q17:输出结果?

cout << R"(Jim "King" Tutt uses "\n" instead of endl.)" <<'\n';

Q18:C++允许在声明结构变量时省略关键字struct?

Q19:bit field 是什么?(也叫位域,From 小盖伦er)

Q21:关于枚举型变量对象band,下面几个表达式的正确性?(思考:enum-整型之间的提升)

Q22:指针的危险?(与之关联:Q27)

Q23:指针解引用之前的金科玉律?(这个学过c都会,跟Q22一样看看即可)

Q24:动态数组?动态联编?如何创建?如何释放?

Q25:对于C++, int *psome = new int[x]; 这个语句中,sizeof(psome)代表什么?sizeof(*psome)又代表什么?

Q26:p是一个指针,那么 p = p+1 之后,p指向哪?(以C++11标准-巩固)

Q27:假设有一个字符串 str1,那么下面的表达式语法合理吗?

        str1 [-1]

        *(str1 - 1)

Q28:除了vector和 xx[ ],还有什么方式可以表示数组?

Q29:关于vector和array,vector的底层实现是什么?

Q30:二维数组在内存的空间地址是连续的么?

Q31:关于RAII,说说RAII的简单理念是什么?

Q32:比起 cin >> sr.arr 说说这里为什么用 cin.getline() ?


参考解答

Q1:结构化编程?C++的核心:OOP和泛型编程?

A1:结构化编程简单来说就是 if-else 等结构的使用,属于早期设计。OOP+泛型编程是C++核心

Q2:关于头文件命名,#include 合规,#include 语法没有错误,为什么却编译报错?为什么这样设计?

A2:其实这两种都是支持的。但是

1)<iostream.h> 是一个过时的包含方式,编译器所选定的标准可能不支持了
2)<iostream> 将库的内容包含在  std 命名空间中,这有助于避免命名冲突,是现代C++编程中推荐的做法。

Q3:using namespace std; 中,using语法是属于编译指令吗?namespace的意义是什么?

A3:namespace 的作用:一个潜在的问题是,可能使用两个已封装好的空间,它们都包含一个名为 xxx() 的函数。

这样,使用 xxx() 函数时,编译器将不知道指的是哪个版本。命名空间是为了避免这个问题。

eg:

        Microflop::wanda("go dancing?");

        Piscine::wanda("a fish named Desire");

using namespace std; 的作用域:affects all function definitions in this file;也就是一次using会影响整个.cpp

Q4:cout << 中的 “<<” 运算符叫什么名字?stream/流 是什么?控制符(manipulator)是什么?

A4:

        “<<” 运算符是重载之后,根据实际功能的定义,在cout语境下为“插入”。(形同左移,但不是左移)
        endl 是一个典型的控制符,由iostream中定义,且位于std中,在输出流中插入endl将导致屏幕光标移到下一行开头。

Q5:const在C和C++的区别?为什么const在C++中相对安全一些?

A5:const在C++中不能被通过&的方式进行改写。主要的操作是在编译阶段把这个const修饰的变量偷换了,让程序员没法找到他。

Q6:在函数运行中定义变量合适吗?推荐做法是什么?a的值会每次变化吗?eg :

int main() {while(1) {int a = 0; print(a++);}
}

A6:在C中,所有的变量声明通常都位于函数或过程的开始位置,但C++没有这种限制。

不过,对于声明变量,C++的做法是尽可能在首次使用变量前声明它,以便于清楚的看出哪些在一起被定义了。

这个程序打印的结果是000000,说明 int a 在每次循环都会刷新。这里引用我和kimi的问答解释:

        Q:C++中的这段代码,变量a会不断地定义吗?还是说只是被赋值?

        A:在您提供的C++代码片段中,变量 a 会在每次 while 循环的开始时重新定义,并初始化为 0。

        这意味着每次循环都会创建一个新的局部变量 a,并且每次都会从 0 开始。

        Q:这个a变量的生命周期是仅在这次循环中?所以被创建在栈空间,在循环结束的时候被释放对吗?

        A:是的,您的理解是正确的。在C++中,局部变量(如在 while 循环中定义的变量 a)的生命周期仅限于它们被定义的代码块。一旦代码块执行完毕,局部变量就会被销毁,其占用的内存(在栈上)也会被释放。

Q7:math.h头文件在C++的新版本?

A7:cmath

Q8:int在不同系统上可能有不同的位数表现(16bits/32bits),那么有办法设置int位宽吗?

A8:标准C++并没有提供直接设置,但可以查。查 int 位宽的方法:在<climits>头文件中,通过宏 INT_MAX

Q9:以下两条语句的含义?

        int a{5};

        int b = {5};

A9:一种不是很常见,但实际是为新手考虑的变量赋值方法——列表初始化。

其内在设计思路是:将大括号 { } 作为一种通用的初始化器,对所有不同类型的变量进行统一化赋值

对于列表初始化有一定要求,就是不允许“缩窄”,即不能用越界赋值。这里考虑安全也不允许使用变量,避免运行时不安全:

Q10:unsigned类型有浮点数吗?

A10:原文:注意, unsigned 本身是unsigned int 的缩写。

Q11:如果知道变量可能表示的int值大于16位,则使用long(大于20e则使用 long long),why?

A11:这样,将程序移植到16位系统时,就不会因为int范围改变导致突然无法正常工作。

所以即使系统上 int 为32位,也应这样做。

Q12:伪代码 int a + bool b 的执行结果如何?

        其背后的原理是什么?进一步地,两个float数 f1+f2 其内部运算是怎么样的?

    int  a = 1;bool b = true;cout << a+b;

A12:int a + bool b 会整形提升为 int a + int b,f1+f2 会提升为 double a + double b

Q13:语句 short i;  cout << int(i); 的含义是什么?为什么要这样设计?int是一个函数吗?

A13:这里是C++的强制转换语法,但只是看起来像是函数,实则不然

Q14:关于auto关键字的设计意图?

A14:自动推导那些不容易由程序员设计所产生变化的复杂类型,尤其是STL的iterator类型

Q15:char a[n] 和 string的本质区别?

A15:

Q16:关于连续使用cin

我们已知的问题是第一个cin随着回车会导致遗留\0到下一个cin被读到,标准的解决方式是什么?

A16:从cin后面补充一个 cin.get()

        cin >> year;

        cin.get();

        也可以利用表达式 cin>>year 返回 cin 对象,将调用拼接起来:

        (cin >> year).get();

 Q17:输出结果?

cout << R"(Jim "King" Tutt uses "\n" instead of endl.)" <<'\n';

A17:前缀R:输出原始字符串

        上述代码将显示如下内容:

        Jim "King" Tutt uses \n instead of endl //特别注意:这里的 "\n" 变成了 \n,但不是粗暴的去除""

Q18:C++允许在声明结构变量时省略关键字struct?

A18:yes:

Q19:bit field 是什么?(位域)

A19:

经过代码验证,位域的内存占用并不是简单地取4字节对齐(或者说存储字长对齐),而是根据以下因素决定的:

        1)位域的位数 2)结构体的内存对齐

        举个例子:假设一个结构体中有一个位域和一个整数成员,位域占用了23位,整数成员占用32位。那么,位域会占用3个字节(23位 / 8位/字节 = 2.875字节,向上取整为3字节),整数成员会占用4字节。整个结构体的总大小可能会因为整数成员的对齐而增加到 8字节。

        示例代码如下:

struct Example {bool flag : 1; // 占用1位unsigned int value : 23; // 占用23位int data; // 占用4字节};

但要注意,有的编译器会把不同类型的数据分成不同位域,上面的代码会输出示例 Example e 的大小为12字节。

具体是8字节还是12字节,以编译器自己的对齐和打包规则为准!

Q20:union主要用来省内存。目前作用不大了。等于一个可选类型变量

Q21:关于枚举型变量对象band,下面几个表达式的正确性?(思考:enum-整型之间的提升)

A21:枚举可以被看作是整型的扩展,看起来好像 “整型是基类,枚举是整型的派生”。

这里扩充两个小知识:

1)枚举不能++操作 2)更有迷惑性的 enum = int 型赋值错误

虽然尝试直接将整型变量 i 赋值给枚举变量 c 是不允许的,但是,通过使用 static_cast<>,可以显式地将整型转换为枚举类型。

Q22:指针的危险

A22:

Q23:指针解引用之前所谓的“金科玉律”?

A23:

Q24:动态数组?动态联编?如何创建?如何释放?

A24:

创建:int *psome = new int[10];

释放:delete [ ] psome;

使用 new 时,如果在运行阶段需要数组,则创建它,如果不需要则不创建。

关于释放:如果使用 new[] 为数组分配内存,则应使用delete [] 来释放。

Q25:对于C++, int *psome = new int[x]; 这个语句

        sizeof(psome)代表什么?

        sizeof(*psome)代表什么?

A25:这段代码是创建了一个动态数组,其中,sizeof(*psome)表示的是psome指针所指向的对象的类型 int 的大小。

它只表示单个int类型的大小,与x无关,也就是 sizeof(int)

由于psome是一个指向int的指针,*psome表示的是psome所指向的int变量的值。

那么是否能查找到动态数组的大小呢?答案是:程序跟踪了由 new int[] 创造的数组大小,用于delete [],但由于信息不公开,所以不能通过sizeof() 的方式来对整个动态数组的大小进行查询。

Q26:p是一个指针,那么 p = p+1 之后,p指向哪?

A26:将指针变量加1后,增加的量等于它指向的类型的字节数。

Q27:假设有一个字符串 str1,那么下面的语法合理吗?

        str1 [-1]

        *(str1 - 1)

A27:至少合法。与C语言一样,C++默认也不检查这种超界错误,无论是数组,vector还是array

Q28:除了vector和xx[ ],还有什么方式可以表示数组?

A28:在这些如array的模板类中,有很多设计是为了防止越界而进行设计的。

Q29:关于vector和array,vector的底层实现是什么?

A29:vector的底层实现是array,大小可变,注意添加删除操作实际上就是array重建,然后动态地管理len大小

Q30:二维数组在内存的空间地址是连续的么?

A30:不同编程语言的内存管理是不一样的,以C++为例,在C++中二维数组是连续分布的。

Q31:关于RAII,说说RAII的简单理念是什么?

A31:RAII(Resource Acquisition Is Initialization) 是 C++ 中一种重要的编程技术。

它通过对象的生命周期来管理资源,确保资源在使用完毕后能够被正确释放。

说白了也很简单,就是让设计好的构造析构函数对申请和释放进行封装,避免遗忘的同时,便于找到内存问题的根源:

#include<cstdio>
#include<iostream>using namespace std;class safeResource{
public:int name;char *arr;        // 这里维护一个动态数组safeResource(){arr = new char[5];    // 构造申请}~safeResource(){delete [] arr;        // 析构释放}
};int main(){safeResource sr;if(!cin.getline(sr.arr, 5)){cout << "input error" << endl;}cout << sr.arr << " " << endl;return 0;
}

Q32:比起 cin >> sr.arr 说说这里为什么用 cin.getline() ?

    // sr.arr 是一个动态数组的起始地址if(!cin.getline(sr.arr, 5)){cout << "input error" << endl;}

A32:虽然用 cin >> sr.arr 也能通过,但是 cin 的方法不会自带一个 '\0'

        getline的方法就可以为 sr.arr 附带一个可靠的结束符号,经测试,即使是输入多了,最后一个字符仍然是\0,其他则被丢弃。

        并且 cin.getline 的方法更易于异常处理。

Q33:在大多数现代系统上,指针的大小通常是 4 或 8 字节(取决于_____)

A33:系统是32位还是64位

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

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

相关文章

STM32--HAL库--定时器篇

一&#xff1a;如何配置定时器 打开对应工程串口配置好的工程&#xff08;上一篇博客&#xff09;做如下配置&#xff1a; 定时器的中断溢出时间计算公式是&#xff1a; 由图得T100*1000/100MHz 注&#xff1a;100MHz100000000 所以溢出时间等于1ms 关于上图4的自动重装…

ARM功耗管理之Suspend-to-RAM实验

安全之安全(security)博客目录导读 ARM功耗管理精讲与实战汇总参见&#xff1a;Arm功耗管理精讲与实战 思考&#xff1a;睡眠唤醒实验&#xff1f;压力测试&#xff1f;Suspend-to-Idle/RAM/Disk演示&#xff1f; 1、实验环境准备 2、软件代码准备 3、唤醒源 4、Suspen…

计算机技术基础 (bat 批处理)Note4

计算机技术基础 &#xff08;bat 批处理&#xff09;Note4 本节主要讲解一些 bat 批处理文件中的一些特殊符号&#xff0c;包括 , %, > 和 >>, |, ^, & 和 && 和 ||, " ", ,, ;, ()。 回显屏蔽符 回显屏蔽符 : 这个字符在批处理中的意思是关…

linux 部署flask项目

linux python环境安装: https://blog.csdn.net/weixin_41934979/article/details/140528410 1.创建虚拟环境 python3.12 -m venv .venv 2.激活环境 . .venv/bin/activate 3.安装依赖包(pip3.12 install -r requirements.txt) pip3.12 install -r requirements.txt 4.测试启…

微服务安全——OAuth2详解、授权码模式、SpringAuthorizationServer实战、SSO单点登录、Gateway整合OAuth2

文章目录 Spring Authorization Server介绍OAuth2.0协议介绍角色OAuth2.0协议的运行流程应用场景授权模式详解客户端模式密码模式授权码模式简化模式token刷新模式 OAuth 2.1 协议介绍授权码模式PKCE扩展设备授权码模式拓展授权模式 OpenID Connect 1.0协议Spring Authorizatio…

EXO-chatgpt_api 解释

目录 chatgpt_api 解释 resolve_tinygrad_tokenizer 函数 resolve_tokenizer 函数 调试和日志记录 参数 返回值 初始化方法 __init__ 异步方法 注意事项 chatgpt_api 解释 展示了如何在一个项目中组织和导入各种库、模块和类,以及如何进行一些基本的Web服务设置和配置…

机器学习 | 回归算法原理——最小二乘法

Hi&#xff0c;大家好&#xff0c;我是半亩花海。很早便想学习并总结一本很喜欢的机器学习图书——立石贤吾的《白话机器学习的数学》&#xff0c;可谓通俗易懂&#xff0c;清晰形象。那就在此分享并作为学习笔记来记录我的学习过程吧&#xff01;本章的回归算法原理基于《基于…

智能化数据安全分类分级实践

在当今数字化浪潮的迅猛推进下&#xff0c;企业和组织正遭遇前所未有的数据安全治理挑战。随着海量数据的不断产生、传输、存储和应用&#xff0c;它们面临着来自黑客攻击、内部人员恶意泄露以及数据误操作等多重安全威胁的侵袭。因此&#xff0c;构建一个健全的数据安全治理体…

【快速逆向四/无过程/有源码】浙江工商职业技术学院 统一身份认证

逆向日期&#xff1a;2024.07.23 使用工具&#xff1a;Node.js 加密方法&#xff1a;RSAUtils 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理&#xff08;直接解密即可&#xff09;&#xff08;crypto-js.js 标准算法&#xf…

Unity ShaderLab基础

[原文1] [参考2] 一 基础知识 1. 1 着色器语言分类: 语言说明HLSL基于 OpenGL 的 OpenGL Shading LanguageGLSL基于 DirectX 的 High Level Shading LanguageCGNVIDIA 公司的 C for GraphicShader LabUnity封装了CG,HLSL,GLSL的Unity专用着色器语言,具有跨平台,图形化编程,便…

Modbus转BACnet/IP网关BA100-配硬件说明

在现代自动化系统中&#xff0c;不同设备和系统之间的通信至关重要&#xff0c;Modbus和BACnet/IP协议虽然各有优势&#xff0c;但它们之间的直接通信存在障碍。钡铼Modbus转BACnet/IP网关作为连接这两种协议的桥梁&#xff0c;允许不同系统之间的无缝数据交换。 一、Modbus转…

Ubuntu22.04安装X11vnc方法

一、问题描述 客户想使用Ubuntu图形化功能,需要远程去操作界面 二、安装方法如下 通常情况&#xff0c;ubuntu不允许root用户运行GUI程序。因此&#xff0c;我们创建普通用户进行安装配置X11vnc服务 1.安装x11vnc程序包 sudo apt-get update sudo apt-get install -y x11v…

内网隧道——HTTP隧道

文章目录 一、ReGeorg二、Neo-reGeorg三、Pivotnacci 实验网络拓扑如下&#xff1a; 攻击机kali IP&#xff1a;192.168.111.0 跳板机win7 IP&#xff1a;192.168.111.128&#xff0c;192.168.52.143 靶机win server 2008 IP&#xff1a;192.168.52.138 攻击机与Web服务器彼此之…

pdf压缩在线免费 pdf压缩在线免费网页版 在线pdf压缩在线免费 pdf压缩工具在线免费

在数字化时代&#xff0c;pdf文件已经成为我们工作、学习和生活中的重要组成部分。然而&#xff0c;体积庞大的pdf文件往往给我们的存储空间、传输速度带来不小的压力。本文将为您揭秘几种简单有效的pdf文件压缩方法&#xff0c;让您轻松应对文件体积过大带来的困扰。 方法一、…

PLC通过IGT-SER系列智能网关快速实现WebService接口调用案例

IGT-SER系列智能网关支持PLC设备数据对接到各种系统平台&#xff0c;包括SQL数据库&#xff0c;以及MQTT、HTTP协议的数据服务端&#xff1b;通过其边缘计算功能和脚本生成的工具软件&#xff0c;非常方便快速实现PLC、智能仪表与WebService服务端通信。 本文是通过智能网关读取…

如何切换网络IP地址?IP切换的应用与方法

随着互联网的发展和普及&#xff0c;我们日常生活中的各种操作和通讯越来越依赖互联网。互联网上存在的一些问题和限制使得更换IP地址成为必要的步骤。下面我们将探讨在互联网业务中&#xff0c;需要更换IP地址的原因与方法。 一、IP轮换的应用 解决访问限制&#xff1a;解决访…

Intellij IDEA多模块分组 实现move to group

新版本idea&#xff0c;没有了move to group的功能&#xff0c;导致模块很多的时候不能分组。2018版本有。 这个分组是虚拟的&#xff0c;不会在磁盘中实际存在。 要实现这个功能&#xff0c;只需要改modules.xml即可。 步骤 1. 找到配置文件 .idea目录下的moudules.xml 2.…

新增ClamAV病毒扫描功能、支持Java和Go运行环境,1Panel开源面板v1.10.12版本发布

2024年7月19日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布了v1.10.12版本。 在这一版本中&#xff0c;1Panel新增了多项实用功能。社区版方面&#xff0c;1Panel新增ClamAV病毒扫描功能、支持Java和Go运行环境&#xff0c;同时1Panel还新增了文件编辑器…

服务器数据恢复—Isilon存储集群节点误删除的数据恢复案例

Isilon存储结构&#xff1a; Isilon存储使用的是分布式文件系统OneFS。在Isilon存储集群里面每个节点均为单一的OneFS文件系统&#xff0c;所以Isilon存储在进行横向扩展的同时不会影响数据的正常使用。Isilon存储集群所有节点提供相同的功能&#xff0c;节点与节点之间没有主备…

怎样将对象转换为包含键值对的对象数组?然后又将数组转换为对象?

​ const formData {location: Park,address: 123 Main St,latitude: 37.7749,longitude: -122.4194 };​1、怎样把这个对象转化为一个数组&#xff1f; 2、然后又怎样把转化后的数组再转化回来&#xff1f; 3、怎样将这两个方法单独封装成函数&#xff1f; 方法 1: 将对象…