首页/新闻资讯/正文详情

第1期|C++基础入门:变量、类型与表达式

发布时间:2026/9/27 23:13:51 来源:云帆数科 栏目:资讯中心
第1期|C++基础入门:变量、类型与表达式
开篇很多人阅读《C Primer》时总觉得前两章很简单。但面试时被问到这些基础知识如“声明和定义的区别”、“引用的底层实现”、“左值和右值如何区分”反而答不上来。而C的很多高级特性移动语义、完美转发、智能指针都建立在这些基础概念之上。这一篇把第1~2章的知识点串起来再配以代码和坑点进行说明。一、C程序的基本结构#include iostream int main() { std::cout Hello C std::endl; return 0; }四个要点1.#include引入头文件预处理阶段展开2.main是程序唯一入口返回int3.std是标准库命名空间cout用于标准输出4.endl输出换行并刷新缓冲区比\n多一次flush操作。《C Primer》中的提示程序员常常在调试时添加打印语句。这类语句应该保证“一直”刷新流。否则如果程序崩溃输出可能还留在缓冲区中从而导致关于程序崩溃位置的错误判断。避坑不要在头文件里写using namespace std;会导致命名空间污染。《C Primer》推荐在作用域内使用或直接写std::前缀。二、内置基本类型类别类型典型大小说明整型short/int/long/long long2/4/4/8字节int至少和short一样大long至少和int一样大浮点float/double/long double4/8/16字节double精度通常满足日常要求float用于性能敏感场景布尔bool1字节只有true/false非0值转true0转false字符char1字节char是否有符号由编译器决定使用时明确指出它的类型是signed还是unsigned注意类型大小不是C标准规定的而是由编译器和平台决定的。标准只规定了最小尺寸。用sizeof可以获取某个类型在当前平台的实际大小。再简单补充一些特殊的类型转换1. 当我们赋给无符号类型一个超出它表示范围的值时结果是初始值对无符号类型表示数值总数取模后的余数。2. 当我们赋给带符号类型一个超出它表示范围的值时结果是未定义的undefined。此时程序可能继续工作可能崩溃也可能生成垃圾数据。建议避免无法预知和依赖于实现环境的行为提示切勿混用带符号类型和无符号类型三、声明、定义、初始化声明declaration告诉编译器变量/函数的名字和类型不分配内存extern int a; // 声明不分配内存定义definition分配内存空间可以初始化int a 10; // 定义分配4字节核心规则一个变量可以多次声明但只能定义一次。这就是为什么头文件里放声明源文件里放定义——如果头文件里放定义多个源文件包含后就会出现重复定义错误。初始化不是赋值初始化的含义是创建变量时赋予其一个初始值而赋值的含义是把对象的当前值擦除而以一个新值来替代。列表初始化用花括号来初始化变量当列表初始化用于内置类型的变量时如果初始值存在丢失信息的风险则编译器将报错long double ld 3.1415926536; int a{ld}, b {ld}; // 错误转换未执行因为存在丢失信息的风险 int c(ld), d ld; // 正确转换执行且确实丢失了部分值如果是内置类型的变量未被显示初始化它的值由定义的位置决定1. 定义于任何函数体之外的变量被初始化为02. 定义在函数体内部的内置类型将不被初始化其值未定义提示未初始化变量引发运行时故障出现问题后很难调试建议初始化每一个内置类型的变量四、标识符identifier标识符就是变量名称、函数名称或类名等。C的标识符由字母、数字和下划线组成其中必须以字母或下划线开头。用户自定义的标识符中不能连续出现两个下划线、也不能以下划线紧连大写字母开头。此外定义在函数体外的标识符不能以下划线开头。另外C有一些保留字供C语言本身使用这些名字不能用作标识符比如C关键字 alignas、bool、auto、while等以及C操作符替代名and、and_eq、bitand、bitor、compl、not、not_eq、or、or_eq、xor、xor_eq。以下是一些约定俗成的命名规范1. 标识符要能体现实际含义2. 变量名一般用小写字母如index不要使用Index或INDEX3. 用户自定义的类名一般以大写字母开头如Sales_item4. 如果标识符由多个单词组成则单词之间应有明显区分如globalStr或global_str五、const常量const int ci 100;const的三个要点1. const对象必须初始化初始化后值不可修改2. const默认只在当前文件内有效要在多文件共享需加extern3. const可以和指针、引用组合产生多种语义const与指针的组合面试必背const int* p; // 指向常量的指针不能通过p改内容p本身可改指向 int* const p; // 指针常量p本身不可改指向可通过p改内容 const int* const p; //都不能改记忆口诀const在*左边指向的内容是常量const在*右边指针本身是常量。六、引用左值引用int val 10; int refVal val; // 正确refVal是val的别名 int refVal2; // 报错引用必须初始化定义引用时程序把引用和它的初始值绑定bind在一起而不是将初始值拷贝给引用。一旦初始化完成引用将和它的初始值对象一直绑定在一起。因为无法令引用重新绑定到另外一个对象因此引用必须初始化。引用的类型必须与其所引用对象的类型一致例外1. 在初始化常量引用时允许用任意表达式作为初始值只要该表达式的结果能转换成引用的类型即可2. 基类的引用可以绑定到公有派生类对象上后面会讲引用的三个铁律1. 必须初始化——不能写int ref;编译直接报错2. 是别名不是新对象——不分配独立内存对ref的操作就是对val的操作3. 一旦绑定不可更换——引用不能重新指向另一个变量赋值操作是改值不是改绑定底层实现大多数编译器用指针实现引用但语法层面有严格约束。引用比指针更安全不会空、不会野函数传参时优先用引用避免拷贝。七、指针pointer指针是“指向”另外一种类型的复合类型指针存放某个对象的地址要想获取该地址需要使用取地址符操作符int ival 42; int* p ival; // p存放ival的地址或者说p是指向变量ival的指针1. 指针本身就是一个对象允许对指针赋值和拷贝而且在指针的生命周期内它可以先后指向几个不同的对象。2. 指针无需在定义时赋初值。和其它内置类型一样在块作用域内定义的指针没有初始化也将拥有一个不确定的值野指针。利用指针访问对象如果指针指向了一个对象则允许使用解引用符操作符*来访问该对象int ival 42; int *p ival; std::cout *p; // 由符号*得到指针所指的对象输出42 *p 0; // 由符号*得到指针p所指的对象即可经由p为变量ival赋值 std::cout *p; // 输出0空指针null pointer空指针不指向任何对象在试图使用一个指针之前代码需要首先检查它是否为空int *p nullptr; // C11引入nullptr空指针请使用nullptr不要使用NULL或0来代替空指针建议初始化所有指针访问未经初始化的指针所引发的后果是无法预计的如果实在不清楚指针应该指向何处就把它初始化为nullptr。指向指针的引用引用本身不是一个对象因此不能定义指向引用的指针。但指针是对象所以存在对指针的引用。八、左值与右值这是理解C11移动语义的前提左值lvalue有持久内存地址、能取地址的表达式右值rvalue临时的、没有持久地址的表达式。比如字面量10、35、函数返回的临时对象。一个简单判断方法能放在等号左边的是左值只能放在右边的是右值。左值引用只能绑定左值不能绑定右值除非是const左值引用。C11引入右值引用专门绑定右值这是移动语义的基础——后面会详细讲。九、constexpr和常量表达式常量表达式是const expression是指值不会改变并且在编译过程就能得到计算结果的表达式一个对象或表达式是不是常量表达式由它的数据类型和初始值共同决定const int max_files 20; // max_files是常量表达式 const int limit max_files 1; // limit是常量表达式 int staff_size 27; // staff_size不是常量表达式是int非const int const int sz get_size(); // sz不是常量表达式具体值运行时才取到在一个复杂系统中很难分辨一个初始值是不是常量表达式。C11规定允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量而且必须用常量表达式初始化constexpr int sz size(); // 只有当size()是一个constexpr函数时才是一条正确的声明语句尽管不能使用普通函数作为constexpr变量的初始值但新标准允许定义一种特殊的constexpr函数。这种函数应该足够简单以使得编译时就可以计算其结果这样就能用constexpr函数去初始化constexpr变量了。一般来说如果你认定变量是一个常量表达式那就把它声明为constexpr类型。本期小结1. 区分定义和声明声明不分配内存定义分配一个变量只能定义一次2. const与指针组合看const在*的左边还是右边3. 引用是别名必须初始化不能空、不能重绑定4、左值有持久地址右值是临时值这是移动语义的基础下一期预告第2期——string、vector与数组标准库最常用的两个容器怎么用数组与指针的关系迭代器失效的坑。

相关推荐

Imatest动态范围测试全解析:从原理到实操避坑指南
Imatest动态范围测试全解析:从原理到实操避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 23:13:51

你真的懂供应链管理吗?你其实都没真正看见过!
你真的懂供应链管理吗?你其实都没真正看见过!

所有做供应链管理的人,不管是甲方、乙方、咨询公司、培训机构,还是商学院的人,都应该先问自己一个问题: 你真的懂供应链管理吗?你其实都没真正看见过! 不是问你会不会讲 MRP、S&OP、IBP、控制塔、数字孪… · 2026/9/27 23:13:45

基于CNN的驾驶员疲劳检测系统:Python源码详解与预警实现
基于CNN的驾驶员疲劳检测系统:Python源码详解与预警实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 23:13:45

Java档案管理系统源码解析:Spring Boot+MyBatis毕设实战指南
Java档案管理系统源码解析:Spring Boot+MyBatis毕设实战指南

简介:面向计算机、电子信息、数学等专业毕业设计的高分Java档案管理系统源码,经导师指导并认可通过,适合正在做毕设、需项目实战练习的学生,也可用于课程设计或期末大作业,同时能作为Java Web项目从零搭建的参考范例。… · 2026/9/27 23:55:13

abandon便签技术解析:PyQt5+SQLite3桌面工具开发实践
abandon便签技术解析:PyQt5+SQLite3桌面工具开发实践

1. 为什么“abandon便签”能在一堆桌面工具里突然冒头?最近两周,好几个做行政、产品和UI设计的朋友在微信里甩给我同一个链接:“快看这个!比系统自带的便签好看十倍,还完全免费。”点开就是个极简的白色窗口&#xff0… · 2026/9/27 23:55:13

基于MATLAB的风力发电场动态模拟仿真:从风速模型到并网控制
基于MATLAB的风力发电场动态模拟仿真:从风速模型到并网控制

简介:基于MATLAB 2021a 实现的风力发电场动态模拟仿真资源,包含完整的.m源程序、各类数据文件与仿真操作录像,面向高校本科生、研究生及科研人员,可用于风电场的动态建模、发电过程仿真与教学演示。资源以风力变化和发电场响应为主… · 2026/9/27 23:55:13

不装 Office 也能批量生成 Word、Excel、PPT?免费的 OfficeCLI 单文件就够了
不装 Office 也能批量生成 Word、Excel、PPT?免费的 OfficeCLI 单文件就够了

不装 Office 也能批量生成 Word、Excel、PPT?免费的 OfficeCLI 单文件就够了 【免费下载链接】OfficeCLI OfficeCLI is the first and best Office suite purpose-built for AI agents to read, edit, and automate Word, Excel, and PowerPoint files. Free, open-… · 2026/9/27 23:55:07

superpowers 安装与使用指南:从加载到能力编排的实战避坑
superpowers 安装与使用指南:从加载到能力编排的实战避坑

1. 从“superpowers”这个热词说起:它到底是什么第一次看到“superpowers”这个词,很多人会下意识地以为是某个超级英雄题材的游戏或者影视周边。但如果你最近在开发者社区、自动化工具圈或者效率工具讨论区里频繁刷到它,就会发现大家聊的其实… · 2026/9/27 23:55:07

找搭子系统源码部署与二开实战:从环境配置到上线避坑
找搭子系统源码部署与二开实战:从环境配置到上线避坑

简介:这套找搭子系统源码定位为企业级社交平台快速搭建方案,面向需要上线同城圈子、社群服务或陪玩娱乐业务的开发者和运营团队,解决从零开发周期长、成本高的问题。压缩包共2002个文件、约203.5MB,其中1237个JS逻辑文件负责核心业… · 2026/9/27 23:55:07

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码