C++基础入门Day1
C++基础入门Day1
1.1 第一个C++程序
编写一个C++程序需要四个步骤
- 创建项目
- 创建文件
- 编写代码
- 运行程序
1.1.1 创建项目
VS2022
1.1.2 创建文件
main.cpp
1.1.3 编写代码
注意:编写时键盘必须调整成英文
- 基本框架
#include <iostream>
using namespace std;
int main() {system("pause");return 0;
}
- 第一个程序-HelloWorld:
cout << "hello world" << endl;"
- 双引号中所写的字符串是可以任意修改:
cout << "hello c++" << endl;"
- cout后跟随的内容可以打印在控制台上
- 双引号中所写的字符串是可以任意修改:
1.2 注释
- 在代码中添加一些说明和解释,方便自己和其他程序员阅读代码
- 给程序员自己看的,不是给计算机看的
- 语法格式
- 单行注释:
// 描述信息(一行)
- 多行注释:
/* 描述信息(多行) */
- 单行注释:
- main函数
- 错误示例:
int main1() {}
- 错误示例:
#include <iostream>
using namespace std;// 1.单行注释/*
2.多行注释多行注释多行注释
*//*main是一个程序的入口每个程序必须有main函数有且仅有一个
*/int main() {// 向控制台输出hello worldcout << "hello world" << endl;system("pause");return 0;
}
1.3 变量
- 给一段指定的内存空间起名,方便操作这段内存
- 语法格式:
数据类型 变量名 = 初始值;
1.3.1 内存的概念
内存是计算机中用于存储数据和程序的临时存储器件。它在计算机工作过程存储正在运行的程序和数据,以便CPU能够快速地访问和处理这些信息。
1.3.2 内存的表示
- 每段内存都有一段属于自己的地址编号,用十六进制的数字来表示
- 数字10对应编号 0x1234
- 缺点:100个数字要记录100个地址编号,太麻烦
- 用特定的名称表示内存
- 数字10对应变量a,通过a就可以访问10(按照高中数学里的变量理解即可)
- 语法格式:
数据类型 变量名 = 初始值;
int a = 10;
#include <iostream>
using namespace std;
int main() {// 创建变量aint a = 10;cout << "a=" << a << endl;system("pause");return 0;
}
1.3.3* 内存扩展
1. 内存容量的单位
- 位(Bit):是计算机内存和存储的最基本单位,代表一个二进制数字,0或1。
- 字节(Byte):常用的内存单位,1字节等于8位。字节是最小的可寻址内存单位。
- 千字节(KB,Kilobyte):1KB 约等于 1,000 字节(实际上在计算机科学中,经常按照 2 的幂来定义,即 1 K B = 2 10 = 1024 1KB = 2^{10} = 1024 1KB=210=1024 字节)。
- 兆字节(MB,Megabyte):1MB 约等于 1,000,000 字节或 1,024 KB。
- 吉字节(GB,Gigabyte):1GB 约等于 1,000,000,000 字节或 1,024 MB。
- 太字节(TB,Terabyte):1TB 约等于 1,000,000,000,000 字节或 1,024 GB。
2. 地址的十六进制数表示
- 内存地址:每个存储在内存中的字节都有一个唯一的地址,这些地址用于定位和访问内存中的数据。地址通常以十六进制数表示。具体来说,有以下几个原因:
-
简化表示: 十六进制数可以更简洁地表示二进制数。由于计算机的基础是二进制系统,而每四位二进制数(比特)刚好可以用一个十六进制数字来表示,这种对应关系简化了长二进制数串的表示。例如,二进制的
1101 1010 1111 0001
可以用十六进制的DAF1
来表示,大大减少了表示的长度。 -
易于转换: 二进制与十六进制之间的转换非常直接,不需要复杂的计算。
-
节省空间: 在文档、代码和界面中使用十六进制可以节省空间。例如,用十六进制表示内存地址时,相比二进制需要的空间少得多,这在编程、系统设计文档和教程中尤其有用。
3. 进制转换
数制转换是在不同的进制之间转换数值的过程,常见的进制包括二进制(基数为2)、十进制(基数为10)和十六进制(基数为16)。下面将介绍这三种数制之间的转换方法。
二进制与十进制之间的转换
-
二进制转十进制:将每个二进制位乘以其对应的2的幂次方值,然后将这些值相加得到十进制数。
例如,二进制
1011
转换为十进制:
1 × 2 3 + 0 × 2 2 + 1 × 2 1 + 1 × 2 0 = 8 + 0 + 2 + 1 = 11 1 \times 2^3 + 0 \times 2^2 + 1 \times 2^1 + 1 \times 2^0 = 8 + 0 + 2 + 1 = 11 1×23+0×22+1×21+1×20=8+0+2+1=11 -
十进制转二进制:将十进制数不断除以2,记录每次的余数,直到商为0。然后将余数逆序排列得到二进制数。
例如,十进制
13
转换为二进制:- 13 ÷ 2 = 6 13 \div 2 = 6 13÷2=6 余 1
- 6 ÷ 2 = 3 6 \div 2 = 3 6÷2=3 余 0
- 3 ÷ 2 = 1 3 \div 2 = 1 3÷2=1 余 1
- 1 ÷ 2 = 0 1 \div 2 = 0 1÷2=0 余 1
所以,13的二进制为
1101
。
二进制与十六进制之间的转换
-
二进制转十六进制:将二进制数每四位一组(从右向左)转换成对应的十六进制数。如果最左边的组不足四位,则在前面补零。
例如,二进制
11010111
转换为十六进制:- 分为两组:
1101
和0111
1101
对应十六进制的D
,0111
对应十六进制的7
所以,二进制的
11010111
等于十六进制的D7
。 - 分为两组:
-
十六进制转二进制:将每个十六进制位转换成对应的四位二进制数。
例如,十六进制
1A3
转换为二进制:1
对应二进制的0001
A
(即十进制的10)对应二进制的1010
3
对应二进制的0011
所以,十六进制的
1A3
等于二进制的000110100011
。
1.4 常量
- 用于记录程序中不可更改的数据
在C++中,定义常量的两种主要方式是使用#define
预处理器指令和const
关键字。这两种方式各有特点和用
1.4.1 定义常量的两种语法格式
1. #define宏常量
-
#define
是一种预处理器指令,用于在编译之前替换文本。它不分配存储空间,仅仅在预处理阶段将所有的标识符替换为定义的值。其语法如下:`#define identifier value -
identifier
是要定义的常量名,value
是与之关联的值。例如:#define PI 3.14159
-
这行代码定义了一个常量
PI
,其值为3.14159。在程序中,每次使用PI
时,预处理器都会将其替换为3.14159。 -
使用
#define
定义的常量具有全局作用域,且没有类型,它们仅仅是文本替换,因此不能保证类型安全。
2. const修饰的变量
-
const
关键字用于定义常量变量,即值不能被修改的变量。与#define
不同,使用const
定义的常量具有类型,编译器可以进行类型检查,从而提高程序的安全性。其语法如下:const type identifier = value;
-
type
是常量的数据类型,identifier
是常量的名称,value
是常量的值。例如:const double Pi = 3.14159;
-
这行代码定义了一个类型为
double
的常量Pi
,其值为3.14159。使用const
定义的常量遵循正常的作用域规则,这意味着它们可以是局部的或全局的,依赖于它们定义的位置。
3*.作用域简介
作用域指的是程序中定义的变量和函数可被访问的区域。根据变量或函数定义的位置,作用域决定了哪些部分的程序可以使用这些变量或函数,以及如何使用它们。作用域有助于限制变量生命周期和可见性,从而提高程序的可读性、可维护性和避免命名冲突。
-
局部作用域(Local Scope): 局部作用域通常指的是在函数或代码块(如
if
语句、循环等)内部定义的变量。这些变量只能在它们被定义的那个函数或代码块中被访问和修改,对外部是不可见的。 -
全局作用域(Global Scope): 在所有函数之外定义的变量拥有全局作用域,这意味着它们可以在程序的任何地方被访问和修改。全局变量的生命周期从它们被定义开始,直到程序结束。
#include <iostream>
using namespace std;// 使用#define定义常量
#define MAX_SIZE 100int main() {// 使用const定义常量const float PI = 3.14159f;cout << "The maximum size is: " << MAX_SIZE << endl;cout << "The value of Pi is: " << PI << endl;system("pause");return 0;
}
注意:常量一旦被定义以后便不可以修改,否则报错
const float PI = 3.14159f;
PI = 1;
1.5 关键字(标识符)
- C++中预先保留的单词
- 在命名变量和常量时,不能使用关键字,不需要记忆,有印象即可
基本关键字
关键字 | 描述 |
---|---|
int | 定义整数类型 |
float | 定义单精度浮点数类型 |
double | 定义双精度浮点数类型 |
char | 定义字符类型 |
void | 表示无返回值或空类型 |
bool | 定义布尔类型 |
控制流关键字
关键字 | 描述 |
---|---|
if | 条件语句,用于执行条件为真的代码块 |
else | 在if 语句条件为假时执行的代码块 |
switch | 多分支选择语句 |
case | 在switch 语句中标识不同的分支 |
default | switch 语句中的默认分支 |
while | 循环语句,当条件为真时执行代码块 |
do | 循环语句,先执行一次代码块,然后检查条件 |
for | 循环语句,用于迭代指定次数的代码块 |
break | 中断当前循环或switch 语句 |
continue | 终止当前循环的迭代并开始下一次迭代 |
return | 从函数中返回值 |
数据类型关键字
关键字 | 描述 |
---|---|
struct | 定义结构体,可以包含不同类型的成员 |
class | 定义类,用于面向对象编程 |
enum | 定义枚举类型 |
union | 定义联合体,所有成员共享相同的内存空间 |
typedef | 为数据类型定义新的名称 |
auto | 自动推断变量类型 |
decltype | 返回表达式的类型 |
存储类关键字
关键字 | 描述 |
---|---|
static | 使局部变量在多次函数调用之间保持其值 |
extern | 声明变量或函数是在其他文件或模块中定义的 |
const | 定义只读变量,值不能被修改 |
volatile | 声明变量可能在程序的执行中被意外修改 |
register | 提示编译器将变量存储在寄存器中 |
mutable | 在类中声明的成员可以被const 成员函数修改 |
类型修饰符关键字
关键字 | 描述 |
---|---|
const | 声明常量,值不能被修改 |
volatile | 声明变量可能在程序的执行中被意外修改 |
mutable | 在类中声明的成员可以被const 成员函数修改 |
类型转换关键字
关键字 | 描述 |
---|---|
static_cast | 执行静态类型转换 |
dynamic_cast | 执行动态类型转换,用于运行时检查 |
const_cast | 从常量类型转换掉const 或volatile |
reinterpret_cast | 执行底层类型的转换 |
- 错误示例
#include <iostream>
using namespace std;
int main() {// 不要用关键字给变量起名int double a = 10;system("pause");return 0;
}
1.6 标识符命名规则
在C++中,标识符是用来标识变量、函数、类、对象等程序实体的名称。标识符的命名规则是一套约定俗成的规定,以确保程序的可读性、可维护性和一致性。以下是C++中标识符的命名规则:
-
保留字:
- 不允许使用C++中的保留字(关键字)作为标识符。
- 例如,不要将关键字
int
、class
、if
等用作标识符。
-
字符集规则:
- 标识符由字母、数字和下划线组成。
- 标识符的第一个字符必须是字母或下划线。
-
大小写敏感:
- C++是大小写敏感的语言,因此
myVariable
和MyVariable
被视为两个不同的标识符。
- C++是大小写敏感的语言,因此
-
规范命名风格:
- 通常推荐使用有意义的名称,以提高代码的可读性。
- 采用驼峰命名法(Camel Case)或下划线命名法(Snake Case)等命名规范。
- 驼峰命名法:
myVariableName
,calculateTotalAmount()
- 下划线命名法:
my_variable_name
,calculate_total_amount()
- 驼峰命名法:
举例
-
保留字:
// 不要使用关键字作为标识符 int int = 10; // 错误,使用了关键字 int double class = 3.14; // 错误,使用了关键字 class
-
字符集规则:
// 合法的标识符 int myVariable; float my_float_variable; char _firstChar;// 非法的标识符 int 123number; // 错误,数字不能作为首字符 double total@mount; // 错误,含有特殊字符 @
-
大小写敏感:
// 大小写敏感 int myVariable; int MyVariable; // 这两个是不同的变量
-
规范命名风格:
-
驼峰命名法:
int numberOfStudents; float averageGrade; void calculateTotalAmount();
-
下划线命名法:
int number_of_students; float average_grade; void calculate_total_amount();
-
相关文章:
C++基础入门Day1
C基础入门Day1 1.1 第一个C程序 编写一个C程序需要四个步骤 创建项目创建文件编写代码运行程序 1.1.1 创建项目 VS2022 1.1.2 创建文件 main.cpp 1.1.3 编写代码 注意:编写时键盘必须调整成英文 基本框架 #include <iostream> using namespace std…...

【高质量精品】2024美赛A题22页word版成品论文+数据+多版本前三问代码及代码讲解+前四问思路模型等(后续会更新)
一定要点击文末的卡片,进入后,即可获取完整资料后续参考论文!! 整体分析:这个题目是一个典型的生态系统建模问题,涉及到动物种群的性比例变化、资源可用性、环境因素、生态系统相互作用等多个方面。这个题目的难点在于如何建立一个合理的数学…...
Spark context stopped while waiting for backend
目录 报错信息 解决办法 解释 报错信息 Spark context stopped while waiting for backend 翻译过来就是 :Spark上下文在等待后端时停止 解决办法 通过在yarn-site.xml中添加如下配置项,并重启yarn,程序在 “–driver-memory 600m --e…...
保研机试算法训练个人记录笔记(三)
目录 基于范围的for循环 push_back return {it->second, i} 基于范围的for循环 for (const string& ageValue : age["Peter"]) 是C中的一种范围基于的for循环(也称为基于范围的for循环),它用于遍历容器中的元素。在这个…...

2月6日作业
1.现有无序序列数组为23,24,12,5,33,5347,请使用以下排序实现编程 函数1:请使用冒泡排序实现升序排序 函数2:请使用简单选择排序实现升序排序 函数3:请使用快速排序实现升序排序 函数4:请使用插入排序实现升序排序 #include<stdio.h> #include<string.h&…...
rust给py写拓展如此简单
很久没写rust,主要是写业务逻辑实在用不上这高性能.不过惊奇发现rust和py结合的如此之好,记录下: 搞一个python环境,pip install maturin建立一个项目文件,cd进去 maturin init照着生成模版正常写rust,完毕后maturin develop,注意这个命令包括把拓展包安装到虚拟环境site pack…...

白嫖10款游戏加速器,一年都不用开会员!
过年期间你们是走亲串戚还是窝家玩游戏、追剧?相信很多小伙伴都不会放过这个难得的假期,肯定是会百忙之中来两把的,那么人一多玩游戏肯定就会拥堵,有延迟。解决延迟最好的办法就是用加速器,当你的网络比别人强时&#…...

Kafka SASL_SSL双重认证
文章目录 1. 背景2. 环境3. 操作步骤3.1 生成SSL证书3.2 配置zookeeper认证3.3 配置kafka安全认证3.4 使用kafka客户端进行验证3.5 使用Java端代码进行认证 1. 背景 kafka提供了多种安全认证机制,主要分为SASL和SSL两大类。 SASL: 是一种身份验证机制&…...

css新手教程
css新手教程 课程:14、盒子模型及边框使用_哔哩哔哩_bilibili 一.什么是CSS 1.什么是CSS Cascading Style Sheet 层叠样式表。 CSS:表现(美化网页) 字体,颜色,边距,高度,宽度&am…...

spring boot(2.4.x之前版本)和spring cloud项目中配置文件的作用
spring 版本以及相关的组件一直在变化,其中一些类或者功能在低版本中有,高版本中去掉了,有的新功能只在高版本有。 为了防止理解问题,pom.xml 版本依赖如下 <parent><groupId>org.springframework.boot</groupId…...

web前后端小坑记录
游戏服务器过年这段时间忙完了,好久没看web了,重温一下。发现竟然没有文章记录这些修BUG的过程,记录一下。 目录 如何处理F5刷新? 如何处理F5刷新? 后端应该发现路由不存在,直接返回打包好的index.html就…...

股票K线简介
股票K线(K-Line)是用于表示股票价格走势的图形,主要由四个关键价格点组成:开盘价、收盘价、最高价和最低价。K线图广泛应用于股票市场技术分析中,它提供了丰富的信息,帮助分析师和投资者理解市场的行情走势…...

路由器、路由器的构成、交换结构
目录 1 路由器 1.1 路由器的结构 “转发”和“路由选择”的区别 1.1.1 输入端口对线路上收到的分组的处理 1.1.2 输出端口将交换结构传送来的分组发送到线路 2.2 交换结构 2.2.1 通过存储器 2.2.2 通过总线 2.2.3 通过纵横交换结构 (crossbar switch fabric) 1 路由器…...

【Mysql】整理
Mysql整理与总结 整理Mysql的基本内容供回顾。 参考: [1]. 掘金.MySQL三大日志(binlog,redolog,undolog)详解 [2]. Javaguide.MySQL三大日志(binlog、redo log和undo log)详解...

项目02《游戏-08-开发》Unity3D
基于 项目02《游戏-07-开发》Unity3D , 本次任务做物品相互与详情的功能, 首先要做 点击相应, 接下来用接口实现点击相应事件,具体到代码中,我们找到需要响应鼠标事件的对象, 双击PackageCell…...

【数据库原理及应用】简答题归纳总结
第一章 数据库概论 1.人工管理阶段数据管理的特点: (1)数据不保存在机器中 (2)无专用的软件对数据进行管理 (3)只有程序的概念,没有文件的概念 (4)数据面向程…...

通过无线打通两个路由器
通过无线打通两个路由器 上网向导无线连接 配置比较简单,有些路由器支持有些不支持,支持的大致就是下面的方法,不过不同型号面板不一样,这里主要学习方法,所以不做路由器型号介绍。 重要的事情说三遍:学习要…...

idea 配置文件,中文出现乱码如何解决
在进行 spring 项目开发时,项目中有 application.properties/application.yml 等配置文件,在配置文件中使用中文注解时可能会出现乱码的情况,如下: 这是因为 idea 配置文件的编码和其他文件的不同,我们需要修改配置文件…...

网络协议梳理
1 引言 在计算机网络中要做到有条不紊地交换数据,就必须遵守一些事先约定好的规则。这些规则明确规定了所交换的数据的格式以及有关的同步问题。这里所说的同步不是狭义的(即同频或同频同相)而是广义的,即在一定的条件下应当发生什…...

14. 【Linux教程】文件压缩与解压
文件压缩与解压 前面小节介绍了如何对文件和目录删除、移动操作,本小节介绍如何使用命令对文件和目录进行压缩与解压操作,常见的压缩包格式有 .bz2、.Z、.gz、.zip、.xz,压缩之后的文件或目录占用更少的空间。 1. tar 命令介绍 下面列举 ta…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...

Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...

ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...

软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...

《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
React核心概念:State是什么?如何用useState管理组件自己的数据?
系列回顾: 在上一篇《React入门第一步》中,我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目,并修改了App.jsx组件,让页面显示出我们想要的文字。但是,那个页面是“死”的,它只是静态…...

深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学
一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件,其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时,价带电子受激发跃迁至导带,形成电子-空穴对,导致材料电导率显著提升。…...
Yii2项目自动向GitLab上报Bug
Yii2 项目自动上报Bug 原理 yii2在程序报错时, 会执行指定action, 通过重写ErrorAction, 实现Bug自动提交至GitLab的issue 步骤 配置SiteController中的actions方法 public function actions(){return [error > [class > app\helpers\web\ErrorAction,],];}重写Error…...