网站首页 > 技术文章 正文
一个C++程序由一系列源文件(source file),经过转化,成为可执行程序代码(或库)。源文件为文本文件,遵循C++语言标准,虽人为可读但计算机无法直接执行;转化后的可执行代码为机器语言(machine language),计算机可以直接执行但人为基本不可读。这个转化过程称为翻译(translation),本质上是将一种高级语言(面向人)翻译为低级语言(面向计算机)。学习C++主要学习的是C++语言标准,其基本概念中涉及到一系列词法元素(lexical element)和语法元素(grammer element)。
C++词法涉及的概念有:
标识符(Identifier)和关键字(Keyword)
C++声明中引入的名通过标识符表示,标识符由字母、数字、下划线组成。
部分特殊的标识符被C++标准保留作为关键字,关键字无法再提供普通标识符的功能,也不能被重定义。
字面量(Literal)
C++程序中有一种令牌(即语法单元),直接嵌入在代码中表示常量,这些称为字面量。字面量有整型、浮点型、字符、字符串、布尔、自定义等类型,其类型和值在编译期已确定。
其中字符、字符串常量中可能会涉及到无法正常输入的字符,这种情况需要使用转义序列(escape sequence)表示。
运算符(operator)与标点符号(punctuator)
运算符和标点符号可能由单字符组成(例如:+-*/),也可能由多字符组成(例如:++、--、<=>)。这些符号具有特定的语法含义和用途。
注释(Comment)
注释主要面向人的阅读,其在翻译阶段被忽略,编译器将其当成空白处理。故实际上注释不能算作词法元素,在预编译阶段和编译阶段之前,注释已被移除并替换为空格。
C++语法涉及的概念有:
声明(Declaration)
根据C++标准,C++源文件(准确说是预处理过后的文件)由一系列的声明组成。
实体(Entity)
声明可能引入实体,同时将实体与其名(name)和特性(property)关联起来。C++程序中的实体有:
- 值(value)
- 对象(object)
- 引用(reference)
- 函数(function)
- 枚举(enumerator)
- 类型(type)
- 类成员(class member)
- 模版(template)
- 模版特化(template specializations)
- 命名空间(namespace)
现代C++标准(C++11以及之后)引入新的实体:
- 包(pack):C++11
- 结构化绑定(structured binding):C++17
- 结果绑定(result binding):C++26
定义(Definition)
如果声明中完全定义了实体所需的所有特性,那么这种声明也成为定义。
关于定义存在一个非常重要的法则,单一定义规则(One Definition Rule,ODR),即程序中对于同一实体不能重复定义,除非是inline函数或对象。
函数(Function)
函数的定义由一系列语句(statement)组成,部分语句中含有表达式(expression),这些指明了程序需要执行的计算过程。
名(Name)
程序中出现的名需要与引入它的声明相关联,这个关联过程称为名称查找(name lookup)。
每个名都有其作用域(scope),作用域外,名不可用。
当名和其引用的实体出现在不同的作用域或者TU中时,这些名具有链接性(Linkage)。链接性指明了名的可见性和共享方式。
型(Type)
每个对象、引用、函数、表达式都关联一种类型(简称型)。可能为基本类型(fundamenta)、复杂类型(compound)、自定义类型(user-defined);也可能是完整类型(complete)或不完整类型(incomplete)。
变量(Variable)
声明的对象或引用,如果其不是类的非静态对象成员,则称之为变量。
猜你喜欢
- 2025-08-01 Visual C++对C/C++新标准的支持有何诟病之处?C语言有哪些标准?
- 2025-08-01 《学习C++》基本概念之名称
- 2025-08-01 仓颉编程语言基础-面向对象编程-接口(Interface)核心特性
- 2025-08-01 《学习C++》基本概念之标识符
- 2025-05-08 定义变量类型总是在变量前面吗?如何理解typedef定义的类型?
- 2025-05-08 7. 包管理与模块(包和模块的区别)
- 2025-05-08 Python基础知识:什么是非局部语句?
- 2025-05-08 苹果来真的!明年起不符合隐私要求的App将从应用商店移除
- 2025-05-08 Java枚举(java枚举菜鸟教程)
- 2025-05-08 可验证凭证(VC):数字时代的重要信任基石
- 08-02C|在一个结构体嵌套一个共用体实现一体多用
- 08-02C++中,常用的强制类型转换函数
- 08-02如何使用C语言编程实现一个推箱子游戏?技术核心和算法实现
- 08-02C++20 新特性(24):模板访问权限和typename的放宽
- 08-02C++零基础到工程实践
- 08-02[深度学习] Python人脸识别库face_recognition使用教程
- 08-02AI算法之怎么利用Python实现支持向量机SVM算法
- 08-02【机器学习】SVM支持向量机
- 1521℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 623℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 526℃MySQL service启动脚本浅析(r12笔记第59天)
- 492℃启用MySQL查询缓存(mysql8.0查询缓存)
- 491℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 479℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 460℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 458℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)