# 你好，世界

[TOC]

## 什么是函数

* 函数: 一段用 `{}` 包裹的代码块，有一个独一无二的名字做标识。函数可以被其他函数调用。函数可以有返回值和参数。函数的 `{}` 代码块内的程序代码，每次该函数被调用时都会执行。

```cpp
int compute()
{
    return 42;
}
```

上面的代码中，`compute` 就是函数的名字，`int` 表示函数的返回类型——整数。

> {{ icon.fun }} 乃取整数之英文“integer”的“int”而得名（模仿侯捷老师说话）

而 `{}` 包裹的是函数体，是函数被调用时会执行的代码。

此处 `return 42` 就是函数体内的唯一一条语句，表示函数立即执行完毕，返回 42。

* 返回值: 当一个函数执行完毕时，会向调用该函数的调用者返回一个值，这个值就是 `return` 后面的表达式的值。返回值可以有不同的类型，此处 `compute` 的返回类型是 `int`，也就是说 `compute` 需要返回一个整数。

> {{ icon.tip }} 关于函数的参数，我们稍后再做说明。

## 从 main 函数说起

C++ 程序通常由一系列函数组成，其中必须有一个名为 `main` 的函数作为程序的入口点。

main 函数的定义如下：

```cpp
int main()
{
}
```

程序启动时，操作系统会调用 `main` 函数。

> {{ icon.detail }} 严格来说，是 C++ 运行时调用了 `main` 函数，但目前先理解为“操作系统调用了 `main` 函数”也无妨。

要把程序发展壮大，我们可以让 `main` 函数继续调用其他函数，也可以直接在 `main` 函数中编写整个程序的逻辑（不推荐）。

> {{ icon.fun }} 因此，`main` 可以被看作是“宇宙大爆炸”。

## main 函数的返回值

```cpp
int main()
{
    return 0;
}
```

`return` 表示函数的返回，main 函数返回，即意味着程序的结束。

main 函数总是返回一个整数 (`int` 类型)，用这个整数向操作系统表示程序退出的原因。

如果程序正常执行完毕，正常结束退出，那就请返回 0。

> {{ icon.detail }} 通常来说有返回类型的函数都需要在所有分支都有 return 语句，但有趣的是，C++ 标准对 main 函数做了特殊的“宽大处理”：在控制流达到 main 函数的结尾时，如果没有遇到 `return` 语句，则等价于执行 `return 0;`。所以对于你本来就打算返回 0 的情况，也可以偷懒不写 `return` 语句，编译器自动会帮你加上。以及，main 函数必须返回 `int` 类型，不能返回 `void` 类型。

返回一个不为 0 的整数可以表示程序出现了异常，是因为出错了才退出的，值的多少可以用于表明错误的具体原因。

> {{ icon.fun }} 操作系统：我调用了你这个程序的 main 函数，我好奇程序是否正确执行了？让我们约定好：如果你运转正常的话，就返回0表示成功哦！如果有错误的话，就返回一个错误代码，比如返回1表示无权限，2表示找不到文件……之类的。当然，错误代码都是不为0的。

## 这个黑色的窗口是？

TODO: 介绍控制台

## 打印一些信息

```cpp
int main()
{
    std::println("Hello, World!");
}
```

以上代码会在控制台输出 `Hello, World!`。

## 注释

```cpp
int main()
{
    // 小彭老师，请你在这里插入程序的逻辑哦！
}
```

这里的 `//` 是注释，注释会被编译器忽略，通常用于在程序源码中植入描述性的文本。有时也会用于多人协作项目中程序员之间互相沟通。

例如下面这段代码：

```cpp
int main()
{
    std::println("编译器伟大，无需多言");
    // 编译器是煞笔
    // 编译器是煞笔
    // 编译器是煞笔
    // 诶嘿你看不见我
}
```

在编译器看来就只是：

```cpp
int main()
{
    std::println("编译器伟大，无需多言");
}
```

> {{ icon.fun }} (\**编译器脸红中\**)

C++ 支持行注释 `// xx` 和块注释 `/* xx */` 两种语法。

```cpp
int main()
{
    // 我是行注释
    /* 我是块注释 */
    /* 块注释
        可以
         有
          很多行 */
    std::println(/* 块注释也可以夹在代码中间 */"你好");
    std::println("世界"); // 行注释只能追加在一行的末尾
    std::println("早安");
}
```

> {{ icon.tip }} 在我们以后的案例代码中，都会像这样注释说明，充当**就地讲解员**的效果。去除这些注释并不影响程序的正常运行，添加文字注释只是小彭老师为了提醒你每一行的代码作用。
