avatar

Catalog
从3开始的C++世界生活(函数&局部/全局变量&数组简介)

本篇是学习VC驿站的《实用C++》教程时的超简化同步笔记,详细内容可参见VC驿站原帖

是在学校C++课程之外重新系统地学习一遍C++,所以很基础很基础的部分不会记录

代码块渲染有误,目前不知道怎么解决,#include< iostream>总是消失,你们自己加上就好了QAQ

如果觉得网站字体太小,可以在右下方的按钮中点击+放大哦√(比如我就觉得这个网站的字体很小)

希望对你和我都能有所帮助 : )

复习天数:1 2 4 7 15 30

函数

几个面白い小点

  1. main函数:主入口函数
  2. 实参类型:常量、变量、表达式
  3. 调用函数时实参应尽量与形参的类型一致,或可进行相应的转化,如果转化不了则编译器会报错
  4. 函数内部的return返回值类型要与函数本身定义时候的返回值类型一致,即使不一致也是可以相互转化的,最终以函数定义时候的返回值类型为主进行转化,若转化不了则编译期间报错

函数调用的几种方式

  1. 普通语句调用

    eg. int sum = add (2, 3);

  2. 作为表达式调用

    eg. cout << “sum = “ << add(2, 3) << endl;

  3. 作为函数参数调用

    eg. print_msg(add(2, 3));

  4. 嵌套调用

    函数a中调用函数b

    注意:函数不可以嵌套定义(在函数a中定义函数b),编译器会报错。在其它类似js的脚本语言中可以这样,但在C/C++中不可以。(新标准中可能可以?有需要时再百度,目前来讲不会这样用就是了)

  5. 递归调用

    举个栗子:求第十个人的岁数,已知第十个人比第九个人大两岁,第九个人比第八个人大两岁……第一个人今年十岁。

    c++
    1
    2
    3
    4
    5
    6
    7
    int get_age(int who)
    {
    if (who > 1)
    return get_age(who - 1) + 2;
    else if (who == 1)
    return 10;
    }

    其中who代表第几个人。如果是求第一个人的岁数,那么他是十岁;如果问的是后面的人的岁数,那么他的岁数等于前一个人的岁数再+2。

    (忽然就感觉递归很符合我们的思考逻辑,超简单

局部变量和全局变量

局部变量举例

一般局部变量的作用域就在它所在的一对花括号内。

函数的形参作用域也在其函数的整个作用域内,也是局部变量;

c++
1
2
3
4
5
6
7
int x = 2, y = 5;
sum = add(x, y);
if (sum > 5)
{
int k = 10;
++k;
}

这里面的变量 k 就是一个局部变量,他的作用域也只局限于 if 的 {} 花括号内。

多文件共同访问一个全局变量

  1. 在其中一个C/Cpp文件中定义并初始化全局变量,例如:
    int sum = 0;
  2. 在C/Cpp文件都能访问到的一个h头文件中声明该全局变量为支持多文件访问的
    extern int sum; //此时只是声明,所以不需要初始化
  3. 在其他C/Cpp文件中 #include 这个头文件之后,就可以直接使用这个全局变量 sum 了。

备注:不能在 h 文件中直接定义这个全局变量 int sum = 0; 这样的话如果有多个C/Cpp文件 include 包含这个头文件的时候,就会提示 sum 重复定义了。所以一定要在 C/Cpp文件中定义该全局变量,之后在 h 头文件中声明该全局变量才行。

static 静态类型变量

c++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int sum = 0;
int add(int a, int b)
{
static int num = 1;
int ret = a+b;
ret += num;
++num;
return ret;
}

int main()
{
int x = 2, y = 5;
sum = add(x, y);
cout << "sum = " << sum << endl;

sum = add(x, y);
cout << "sum = " << sum << endl;

sum = add(x, y);
cout << "sum = " << sum << endl;
return 0;
}

结论: static 静态类型局部变量只初始化一次,之后的调用都不进行初始化

分析:有那种 在局部范围内定义了全局变量 的意思

数组

关于定义

  1. 定义时,中括号内必须是常量/常量表达式

    不能是个变量或者一个不确定的值,不然编译阶段就直接报错了。因为定义好了之后,系统马上就根据这个个数来分配空间了。如果是个变量,系统就不知道要分配多少空间。

  2. 数组名的命名规则与变量的命名规则相同,由数字、字母、下划线组成,且数字不能放到开头。

  3. 如果想动态地创建数组,用的方法是:int *student = new int[num];

    以后会讲。

关于元素访问

下标可以是常量也可以是变量,注意不要越界。

一维数组初始化

初始化方式

  1. 定义时,全部元素初始化

    int stu_no[5] = {101, 102, 103, 104, 105};

  2. 定义时,部分元素初始化,后面未初始化元素默认赋初值0

    int stu_no[5] = {101, 102};

  3. 定义时,全部元素初始化,不指定数组长度

    int stu_no[] = {101, 102, 103, 104, 105};

  4. 定义后,对单个元素初始化,未初始化的元素的值随机

不管是定义的时候指定长度还是不指定长度,总结起来就一个规则,定义的时候让系统知道数组的长度就可以了,也就是定义即确定大小

一维数组代码举例

一整形数组中有10个数,分别是:5,8,9,0,2,1,4,7,6,3;
求出数组中最大和最小的数并进行输出。

c++
1
2
3
4
5
6
7
int max_num = 0, min_num = 0;
int num[] = {5, 8, 9, 0, 2, 1, 4, 7, 6, 3};
for (int idx = 0; idx <= 9; idx++)
{
max_num = (max_num > num[idx]) ? max_num : num[idx];
min_num = (min_num < num[idx]) ? min_num : num[idx];
}

仔细看的话,这块代码是有问题的。比如,如果数组里面的0是2,那求出来的最小值是多少呢?计算机会求出来,是0,不是1。

所以赋的初值应该来源于数组里面的元素,修改后的代码如下:

c++
1
2
3
4
5
6
7
int num[] = {5, 8, 9, 0, 2, 1, 4, 7, 6, 3};
int max_num = num[0], min_num = num[0];
for (int idx = 0; idx <= 9; idx++)
{
max_num = (max_num > num[idx]) ? max_num : num[idx];
min_num = (min_num < num[idx]) ? min_num : num[idx];
}

其实是很简单的代码啦,主要是逗号表达式没用过,这里是个简单的使用例子,所以列了出来。

Author: Crux
Link: http://cruxssssss.github.io/2020/06/05/cong3/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
    微信
  • 支付寶
    支付寶