🔷 第二章 C++语言基础
📄 一句话概括

函数体就是紧跟在函数头后面的一对花括号 { },里面装着"这个函数要干的活"——一堆以分号结尾的语句,默认从上到下依次执行。同时花括号还兼一个身份:作用域边界——在里面定义的变量,出了这对花括号就"不存在了"。记住三句话:语句以分号结尾;执行从上到下;花括号成对写、成对缩进。

一、函数体的长相与规矩

int main() {                    // ← 函数头(2.1.4)
    int a = 3;                  // ← 语句①
    int b = 4;                  // ← 语句②
    cout << a + b << endl;      // ← 语句③
    return 0;                   // ← 语句④
}                               // ← 函数体结束(别忘这个右花括号)
规矩 说明 写错的后果
每条语句以 ; 结尾 分号是"这句话说完了"的句号 报错常指到下一行,让人迷惑
默认从上到下执行 语句③一定在①之后跑(第 4 章会学分支与循环来改变顺序) —
花括号成对 有 { 就必须有 } 少 } → 报"文件意外结束"(expected '}' at end of input)
建议缩进 里面的语句往右缩 4 个空格 编译器不在乎,人不高兴:代码无法阅读

关于缩进的一句实话:你在 Dev-C++ 里按 Tab 或空格缩进,对程序运行没有任何影响。但只要你写超过 20 行代码,没有缩进就等于自找麻烦——缩进是给眼睛用的,不是给编译器用的。

二、花括号的第二个身份:作用域

int main() {
    int x = 5;              // x 在 main 的函数体里"出生"
    cout << x << endl;      // 能用:还在同一对花括号里

    {
        int y = 10;         // y 在这层内层花括号里"出生"
        cout << y << endl;  // 能用
    }

    cout << y << endl;      // ✗ 报错:y 已经不在了
    return 0;
}

为什么要有这个限制:每个名字都要占用内存空间。作用域就像一个"说话的场合"——出了这间屋子,你说的话就不算数了。

说法 通俗解释
作用域(scope) 一个名字能被使用的范围
局部变量 在函数体(或内层花括号)里定义的变量
生命周期 从定义那一行开始,到它所在的花括号结束为止

这个规则带来一个好处:不同函数里可以重名——main 里有 int x,sayHi 里也可以有 int x,它们互不干扰(就像两个班各有自己的"小明")。

三、动手 Demo:把作用域"走"一遍

新建 scope.cpp,照抄下面的代码,逐段注释掉/打开观察:

#include <iostream>
using namespace std;

int main() {
    int x = 5;
    cout << "x = " << x << endl;

    {
        int y = 10;
        cout << "y = " << y << endl;
        cout << "内层也能看到 x = " << x << endl;   // 外层的东西,内层可以用
    }

    // cout << "y = " << y << endl;   // ← 试着打开这一行
    return 0;
}

看到什么算成功:前半段正常输出三行;把注释打开的那行恢复后,F11 报错类似 'y' was not declared in this scope——"not declared in this scope" 这句话就是在说"这里看不到它"。

记住这个报错:以后看到 was not declared in this scope,第一反应是——这个名字在这个位置看不见(要么拼错了,要么它的花括号已经结束了)。

30 秒实验:把 int x = 5; 挪到内层花括号里,再在外层 cout << x。会发生什么?——同样的报错。规矩是"内向外的单向通道":里面能看见外面,外面看不见里面。

四、常见误区

  1. "缩进错了程序就会出错"——不会。缩进只影响可读性。但"看起来对了"不代表"括号配对对了":缩进乱了的代码,常常藏着少一个 } 的问题
  2. "函数体里可以再定义一个函数"——不可以。C++ 不允许函数嵌套定义(有些语言允许)。要在函数里干活,得调用别的函数,不是在里面定义函数
  3. "花括号只有函数用"——不止。if、for、while、名字空间、类……都用花括号。凡是花括号,就划出一层作用域
  4. "所有语句都要写在 main 里"——不是。main 应该短:干活的语句放别的函数里,main 只当"调度员"(第 5 章之后)
自测三问(点开对答案) 1. 函数体在哪儿?里面对什么形式的内容?——紧跟函数头的**一对花括号 `{ }`**;里面是**以分号结尾的语句**,默认从上到下执行。 2. 什么叫"作用域"?——一个名字**能被使用的范围**;由花括号(以及函数、名字空间等)划定。 3. 内层花括号能不能用外层的变量?反过来呢?——内层**能**用外层的;外层**不能**用内层的。方向是单向的。

相关笔记