01_C\C++编程方法
Carpe Tu Black Whistle

这一节主要摘录一些 C/C++ 的语言特性(我时常会忘记的那些,比较偏的

main()

可以理解为程序运行时就会执行 main() 中的代码。
实际上,main 函数是由系统或外部程序调用的。
最后的 return 0; 表示程序运行成功。

main 函数也可以有参数,通过 main 函数的参数,我们可以获得外界传给这个程序的指令(也就是“命令行参数”),以便做出不同的反应。

Cpp的文件管理

Namespace

namespace(命名空间)其实是Cpp用来区分文件(避免混淆)的文件管理方式

Using

两种Using指令的形式:

  1. using 命名空间::成员名;
    调用成员的时候,可以直接使用成员名。 有点像在环境变量中引入PATH。
    代码示例1:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream>

    using std::cin;
    using std::cout;
    using std::endl;

    int main() {
    int x, y;
    cin >> x >> y;
    cout << y << endl << x;
    return 0;
    }
  2. using namespace 命名空间;
    可以直接通过成员名访问命名空间中的 任何 成员。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>

using std::cin;
using std::cout;
using std::endl;

int main() {
int x, y;
cin >> x >> y;
cout << y << endl << x;
return 0;
}
// 会将 std 中的 所有名字 引入
// 因此,如果声明了与 std 重名的函数or变量,会导致命名冲突而导致编译错误。
  • 工程上不推荐使用, using namespace 命名空间; 的指令。会将命名空间内的所有变量和函数全部导入,容易引起命名冲突

  • 在C/C++中,程序返回值不为零,会导致运行时错误(Runtime Error, RE)

预处理命令

预处理命令就是 预处理器 所接受的命令,用于对代码进行初步的文本变换,比如 文件包含操作 #include 和 处理宏 #define 等,对GCC而言,默认不会保留预处理阶段的输出 .i 文件。可以用 -E 选项保留输出文件。

#include命令

#include 其实是一个预处理命令,意思为将一个文件“放”在这条语句处,被“放”的文件被称为头文件。也就是说,在编译时,编译器会“复制”头文件 iostream 中的内容,“粘贴”到 #include这条语句处。这样,你就可以使用 iostream 中提供的 std::cin、std::cout、std::endl 等对象了。

#define命令

#define 是一种预处理命令,用于定义宏,本质上是文本替换。

1
2
3
4
5
6
7
8
9
#include <iostream>
#define n 233
// n 不是变量,而是编译器会将代码中所有 n 文本替换为 233,但是作为标识符一部分的
// n 的就不会被替换,如 fn 不会被替换成 f233,同样,字符串内的也不会被替换

int main() {
std::cout << n; // 输出 233
return 0;
}

(可以使用 #undef 取消宏定义)
#define 作用域为整个程序,容易造成文本意外替换
更鼓励的做法: 使用 const 限定符声明常量

#ifdef

#ifdef 命令的灵活使用,可以在程序在不同操作系统(环境)下,得到方便

E.g.

1
2
3
4
5
#ifdef LINUX
// code for linux
#else
// code for other OS
#endif

可以在编译的时候通过 -DLINUX 来控制编译出的代码,而无需修改源文件。这还有一个优点:通过 -DLINUX 编译出的可执行文件里并没有其他操作系统的代码,那些代码在预处理的时候就已经被删除了。
#define 还能使用 #、## 运算符,极大地方便调试。

运算

位运算

运算符功能
~位非
&(双目)逐位与
|逐位或
^逐位异或
<<逐位左移
>>逐位右移

位运算的优先级低于普通的算数运算符

逻辑运算符

运算符功能
&&逻辑与
||逻辑或
逻辑非

成员访问运算符

运算符功能
[]数组下标
.对象成员
&(单目)取地址/获取引用
*(单目)间接寻址/解引用
->指针成员

控制流

分支

选择控制流

if语句

1
2
3
4
5
6
7
8
9
if (条件1) {
主体1;
} else if (条件2) {
主体2;
} else if (条件3) {
主体3;
} else {
主体4;
}

switch 语句

1
2
3
4
5
6
7
8
switch (选择句) {
case 标签1:
主体1;
case 标签2:
主体2;
default:
主体3;
}

循环

for loop

1
2
3
for (初始化; 判断条件; 更新) {
循环体;
}

while loop

1
2
3
while (判断条件) {
循环体;
}

do-while loop

do {
循环体;
} while (判断条件);