Unverified Commit 3d480803 authored by Early's avatar Early Committed by GitHub
Browse files

Merge pull request #2590 from OI-wiki/var-fix

Fix bugs in #2579
parents e9f15bdf 3a6d5f97
Loading
Loading
Loading
Loading
+18 −12
Original line number Diff line number Diff line
@@ -107,9 +107,11 @@ C++ 中类型的转换机制较为复杂,这里主要介绍对于基础数据
- 整数转换为浮点数时,会舍入到目标类型下最接近的值。
- 将其他类型转换为 `bool` 类型时,零值转换为 `false` ,非零值转换为 `true`

## 声明变量
## 定义变量

使用关键词加上变量名即可声明。
简单地说[^note2],定义一个变量,需要包含类型说明符(指明变量的类型),以及要定义的变量名。

例如,下面这几条语句都是变量定义语句。

```c++
int oi;
@@ -117,38 +119,38 @@ double wiki;
char org = 'c';
```

在目前我们所接触到的程序段中,声明在花括号包裹的地方的变量是局部变量,而声明在没有花括号包裹的地方的变量是全局变量。实际有例外,但是现在不必了解。
在目前我们所接触到的程序段中,定义在花括号包裹的地方的变量是局部变量,而定义在没有花括号包裹的地方的变量是全局变量。实际有例外,但是现在不必了解。

声明时没有初始化值的全局变量会被初始化为 0。而局部变量没有这种特性,需要手动赋初始值,否则可能引起难以发现的 bug。
定义时没有初始化值的全局变量会被初始化为 0。而局部变量没有这种特性,需要手动赋初始值,否则可能引起难以发现的 bug。

## 变量作用域

作用域是变量可以发挥作用的代码块。

变量分为全局变量和局部变量,意义已经在上面讲解。

全局变量的作用域是整个文件,全局变量一旦声明,在整个程序中都是可用的。
全局变量的作用域,自其定义之处开始[^note3],至文件结束位置为止。

局部变量的作用域是声明语句所在的代码块,局部变量只能被函数内部或者代码块内部的语句使用
局部变量的作用域,自其定义之处开始,至代码块结束位置为止

由一对大括号括起来的若干语句构成一个代码块。

```c++
int g = 20;  // 声明全局变量
int g = 20;  // 定义全局变量
int main() {
  int g = 10;         // 声明局部变量
  int g = 10;         // 定义局部变量
  printf("%d\n", g);  // 输出 g
  return 0;
}
```

在一个代码块中,局部变量会覆盖掉同名的全局变量,比如上面的代码输出的 g 就是 10 而不是 20。为了防止出现意料之外的错误,请尽量避免局部变量与全局变量重名的情况。
如果一个代码块的内嵌块中定义了相同变量名的变量,则内层块中将无法访问外层块中相同变量名的变量。

例如上面的代码中,输出的 $g$ 的值将是 10。因此为了防止出现意料之外的错误,请尽量避免局部变量与全局变量重名的情况。

## 常量

常量是固定值,在程序执行期间不会改变。

常量的值在定义后不能被修改。声明时加一个 `const` 关键字即可。
常量的值在定义后不能被修改。定义时加一个 `const` 关键字即可。

```c++
const int a = 2;
@@ -160,3 +162,7 @@ a = 3;
## 参考资料与注释

[^note1]:  C++20 起生效。C++20 前结果是实现定义的。详见 [整型转换 - cppreference](https://zh.cppreference.com/w/cpp/language/implicit_conversion#.E6.95.B4.E5.9E.8B.E8.BD.AC.E6.8D.A2)

[^note2]: 定义一个变量时,除了类型说明符之外,还可以包含其他说明符。详见 [声明 - cppreference](https://zh.cppreference.com/w/cpp/language/declarations)

[^note3]: 更准确的说法是 [声明点](https://zh.cppreference.com/w/cpp/language/scope#.E5.A3.B0.E6.98.8E.E7.82.B9)