Some Notes

Be hard-working every day.

函数

函数的作用

一般来说,我都是懂的。函数的总用比较简单:

  1. 优化代码量
  2. 让程序代码更加清晰明了
  3. 调用时更加方便

总之,函数的存在就是为了更加方便清晰快速

定义函数

方法:

<函数类型> <函数名称>([参数])
{
    [主体];
    [return []]; // 如果为类型 void,就不能返回值,直接 `return` 即可。
}

如:

int add(int x, int y)
{
    int ans = x + y;
    return ans;
}

注意:当不返回(无 return)时,函数类型应为 void(表面含义无类型)。

形参和实参

当你运行这段代码时:

#include <stdio.h>
using namespace std;

int swap(int x, int y)
{
    int t = x;
    x = y;
    y = t;
}

int main()
{
    int a, b;
    scanf("%d %d", &a, &b);
    
    swap(a, b);
    printf("%d %d\n", a, b);
}

你会发现 a 还是 ab 还是 b

这是因为 swap(int, int) 只是把函数内的 xy 交换了而已,ab 没有交换。

因为 xy 对于 main 函数来说只是形参,xy 只是拷了一份 ab

如果想交换 ab 需要这样写:

#include <stdio.h>
using namespace std;

int swap(int &x, int &y)
{
    int t = x;
    x = y;
    y = t;
}

int main()
{
    int a, b ;
    scanf("%d %d", &a, &b) ;
    
    swap(a, b) ;
    printf("%d %d\n", a, b) ;
}

此时此刻,你使用 xy 就相当于引用了 ab

函数重载

函数名不可重复。

但是有几种方法可以重复:

  • 函数参数类型不同
  • 函数参数数量不同

比如:

#include <stdio.h>
using namespace std;

int add(int a, int b)
{
    return a + b;
}
void add()
{
    printf("Hello\n");
}

int main()
{
    int n = add(1, 2);
    printf("%d\n", n);
    add();
    
    return 0;
}

输出:

3
Hello

注意:仅仅函数类型不同不足以区分两个函数!

拓展:主函数中的argcargv 实际上我不懂

用法:

int main(int argc, char *argv[])

或:

int main(int argc, char **argv)

含义:

  1. argc是argument count 的缩写,保存运行时传递给main函数的参数个数。
  2. argv是argument vector 的缩写,保存运行时传递main函数的参数,类型是一个字符指针数组,每个元素是一个字符指针,指向一个命令行参数。

比如:

#include <stdio.h>
using namespace std;

int main(int argc, char *argv[])
{
    printf("sum: %d\n", argc) ;
    for(int i = 0; i < argc; i ++)
    {
        printf("argc[%d], %s\n", i, argv[i]) ;
    }
    
    return 0 ;
}

打开命令行,cd文件所在文件夹,输入:[file name].[file extension] hello world i am so happy

结果为:

sum: 7
argc[0], 未命名1.exe
argc[1], hello
argc[2], world
argc[3], i
argc[4], am
argc[5], so
argc[6], happy

这就是main函数参数作用。