跳转至

C++程序设计

程序基本概念

标识符

标志符(英文对应词:identifier,缩写为ID),又称为识别码,是一个用来识别物件的名称,识别对象可能是概念、具体可数的物体或是不可数的物质。标志符可能是字、编号、字母、符号,也可能是由上述元素所组成。

在编程语言中,标志符就是程序员自己规定的具有特定含义的词,比如类名称,属性名称,变量名等。

关键字

保留字(英语:Reserved word),有时也叫关键字(keyword),是编程语言中的一类语法结构。在特定的编程语言里,这些保留字具有较为特殊的意义,并且在语言的格式说明里被预先定义。通常,保留字包括用来支持类型系统的原始数据类型的标记,并可以用来识别诸如循环结构、语句块、条件、分支等程序结构。

常量

常量是不变化的量,即在计算机程序运行中时,不会被程序修改的量。与变量相对应。

变量

变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。在C++编程语言中,按照类型的不同,变量分为整数类型、浮点类型、字符类型、字符串类型、布尔类型等。

字符串

字符串(英语:string),是由零个或多个字符组成的有限序列。一般记为\({s=a_{1}a_{2}\dots a_{n}}({0\leq n\lneq \infty} )\)。它是编程语言中表示文本的数据类型。

表达式

表达式是为实现某种目的并符合特定编程规范的式子,包括赋值表达式(例如 \(a = 3\) )、算数表达式( 例如 \(3 + 4\) )等。表达式的组合形成语句。

示例程序

程序1: hello, world
1
2
3
4
5
6
#include <iostream>
using namespace std;
int main() {
    cout << "hello, world" << endl;
    return 0;
}
程序2
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 引入输入输出头文件(提供 printf 函数)
#include <cstdio>

// 引入名字空间 std
using namespace std;

// 声明常量 PI 并赋值
const double PI = 3.14159;

// 程序入口 main 函数
int main() {

    // 声明整型变量并赋值
    int r = 3;

    // 算数表达式结果赋值
    double s = PI * r * r;

    // 输出
    printf("%lf\n", s);

    // main函数结束 返回0
    return 0;
}

变量和常量的命名规则

  1. 变量名称可以由字母、数字、下划线组成,但是不能以数字开头。
  2. 不能与相同作用域内的变量重名。
  3. 不要使用与任何关键字、函数名相同的名字。
  4. 见名知义。
  5. 命名规则:匈牙利命名法、驼峰命名法(大驼峰、小驼峰)、下划线命名法。
  6. 常量的命名规则同变量。

头文件与名字空间

名字空间:

头文件:

编辑源文件

编译程序

编译与解释的区别
编译型语言与解释型语言。

运行程序

调试程序

结构体类型

结构体的内存对齐

字节对齐主要是为了提高内存的访问效率,比如intel 32位cpu,每个总线周期都是从偶地址开始读取32位的内存数据,如果数据存放地址不是从偶数开始,则可能出现需要两个总线周期才能读取到想要的数据,因此需要在内存中存放数据时进行对齐。 通常我们说字节对齐很多时候都是说struct结构体的内存对齐,比如下面的结构体:

struct A {
    char a;
    int b;
    short c;
};

在32位机器上 char\(1\) 个字节,int\(4\) 个字节,short\(2\) 个字节,一共占用 \(7\) 个字节。但是实际真的是这样吗?

内存对齐主要遵循下面三个原则:

  1. 结构体变量的起始地址能够被其最宽的成员大小整除
  2. 结构体每个成员相对于起始地址的偏移能够被其自身大小整除,如果不能则在前一个成员后面补充字节结构体总体大小能够被最宽的成员的大小整除,如不能则在后面补充字节
  3. 结构体总体大小能够被最宽的成员的大小整除,如不能则在后面补充字节

其实这里有点不严谨,编译器在编译的时候是可以指定对齐大小的,实际使用的有效对齐其实是取指定大小和自身大小的最小值,一般默认的对齐大小是 \(4\)

再回到上面的例子,如果默认的对齐大小是 \(4\),结构体 a 的起始地址为 \(0x0000\),能够被最宽的数据成员大小(这里是int,大小为 \(4\),有效对齐大小也是 \(4\))整除,char a 的从 \(0x0000\) 开始存放占用一个字节即 \(0x0000 \sim 0x0001\),然后是 int b,其大小为 \(4\),故要满足 条件2,需要从 \(0x0004\) 开始,所以在 char a 后填充三个字节,因此 a 对齐后占用的空间是 \(0x0000 \sim 0x0003\)b 占用的空间是 \(0x0004 \sim 0x0007\), 然后是 short c 其大小是2,故从 \(0x0008\) 开始占用两个字节,即 \(0x0008 \sim 0x0009\)。 此时整个结构体占用的空间是 \(0x0000 \sim 0x0009\), 占用 10 个字节,10 % 4 != 0, 不满足第三个原则,所以需要在后面补充两个字节,即最后内存对齐后占用的空间是 \(0x0000 \sim 0x000B\),一共 12 个字节。

公式技巧:

  1. 前面的地址必须是后面的地址正数倍,不是就补齐
  2. 整个结构体的地址必须是最大字节的整数倍

来源:https://www.zhihu.com/question/27862634/answer/208895189


最后更新: 2021-10-02
Back to top