C语言

yuhuo2024-06-11开发工具
参考链接

一. 环境搭建

安装

下载 MinGW64open in new window,选择 x86_64-posix-seh 版,解压到 D:\Software\mingw64 目录中。

将 bin 目录 D:\Software\mingw64\bin 配置到环境变量 Path 中。

VSCode 安装 C/C++C/C++ Extension PackC/C++ Themes 这 3 个插件。

程序结构

// 头文件
#include <stdio.h>

// 函数声明
int add(int a, int b);
int reduce(int a, int b);

// 全局变量
int global = 2019;
// 全局常量
#define PI 3.1415926

// 主函数,程序的唯一入口
int main()
{
    // 局部变量
    int local = 2020;
    // 局部常量(也可全局)
    const int ID = 1001;
    
    // 调用头文件中引用的库的函数
    printf("PI:%.7lf\n", PI);
    printf("ID:%d\n", ID);

    // 调用当前文件中的函数
    int sum = add(1, 2);
    printf("sum:%d", sum);

    return 0;
}

// 静态函数定义:只能在当前文件中调用
static int add(int a, int b)
{
    return a + b;
}
// 外部函数定义:允许被外部文件调用(没有指定函数作用范围时,默认外部函数)
extern int reduce(int a, int b)
{
    return a + b;
}

单文件运行

项目中新建 src/one.c 文件:

#include <stdio.h>

int main()
{
    printf("你好 C语言");
    return 0;
}

点击右上角【运行图标】,首次运行需要选择调试配置【C/C++: gcc.exe】,自动生成 .vscode/tasks.json 配置文件。接着编译源码生成 one.exe 可执行文件,并成功运行。

此时通过右上角【运行图标】,已经可以实现单文件的直接运行和调试运行。也可以通过在终端执行 ./one 来直接运行编译好的 one.exe

多文件运行

修改 .vscode/tasks.json 配置文件:

{
    "tasks": [
        {
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                // 编译当前文件
                // "${file}",
                // 编译当前文件夹所有.c文件
                "*.c",
                "-o",
                // 生成当前文件同名的可执行文件
                // "${fileDirname}\\${fileBasenameNoExtension}.exe"
                // 生成固定名字的可执行文件
                "${fileDirname}\\main.exe"
            ],
            // ...
        }
	]
}      

从左侧导航栏打开【运行和调试】,点击【创建 launch.json 文件】,选择调试器【C++(GDB/LLDB)】,此时自动生成 .vscode/launch.json 文件。

打开 launch.json 文件,点击右下角【添加配置】,选择【C/C++:(gdb) 启动】,此时自动生成对应配置内容。再修改配置:

{
    "configurations": [
        {
            // 要执行的可执行文件
            "program": "${fileDirname}\\main.exe",
            // gdb 的位置
            "miDebuggerPath": "D:\\Software\\mingw64\\bin\\gdb.exe",
            // ...
        }
    ]
}

重测单文件运行是否成功,接着新增 src/two.c 和对应头文件 src/two.h

// two.c
int Max(int a, int b)
{
    return a > b ? a : b;
}
// two.h
int Max(int a, int b);

one.c 中引用 two.c 定义的方法:

#include <stdio.h>
#include "two.h"

int main()
{
    printf("你好 C语言\n");
    
    int num = Max(10, 20);
    printf("%d\n", num);

    return 0;
}

最后在 one.ctwo.c 中都可以通过右上角【运行图标】来直接运行或调试运行,统一生成并执行 main.exe

注:当前配置仅支持在同个目录中的多文件。

二. 数据类型

基本类型

#include <stdio.h>

int main()
{
    // 短整型
    short a = 1;
    // 整型
    int b = 2;
    // 长整型
    long c = 3;

    // 单精度浮点型
    float d = 1.2;
    // 双精度浮点型
    double e = 520.1314;

    // 字符型(单个字符,使用单引号)
    // 不能放超过1字节的字符,如中文(因为字符型只有1字节大小)
    char f = 'f';

    // % 代表格式化占位符
    // %d → int(十进制)
    // %x → int(十六进制)
    // %f → float(%.3f 表示保留小数点后3位)
    // %lf → double(%.3lf 同上)
    // %c → char
    printf("%d %d %d %.2f %lf %c", a, b, c, d, e, f);
}

构造类型

#include <stdio.h>

int main()
{
    // 枚举
    enum Sex
    {
        MALE,
        FEMALE,
    };
    printf("MALE:%d\n", MALE);     // 0
    printf("FEMALE:%d\n", FEMALE); // 1

    // 数组
    // 注1:一经声明,数组长度就固定无法改变,并且也没有获取的方法
    // 注2:避免数组访问越界
    int arr1[5] = {1, 2, 3, 4, 5};
    int arr2[5] = {1, 2, 3};
    int arr3[5];
    int arr4[] = {1, 2, 3, 4, 5};

    // 字符串
    // 只能通过字符数组来定义,有以下2种方式
    char str1[] = "你好";
    // 明确每个元素对应的字符,同样只能使用1字节的字符,并且以 '\0' 结尾进行标记
    char str2[] = {'a', 'b', 'c', '\0'};

    // %s → 字符串
    printf("%s %s\n", str1, str2); // 你好 abc
    // 直接打印字符串
    puts(str1);

    // 多维数组
    int list1[2][3] = {{1, 2, 3}, {4, 5, 6}};
    int list2[][3] = {{1, 2}, {3}, {4, 5}}; 
    int list3[4][5];

    printf("%d\n", list1[0][1]); // 第1个数组的第2个元素,即2
}

三. 运算符

#include <stdio.h>

int main()
{
    // 获取类型应用的字节数
    int count = sizeof(char);

    printf("short:%d\n",sizeof(short)); // 2
    printf("int:%d\n",sizeof(int)); // 4
    printf("long:%d\n",sizeof(long)); // 4
    printf("float:%d\n",sizeof(float)); // 4
    printf("double:%d\n",sizeof(double)); // 8
    printf("char:%d\n",sizeof(char)); // 1
}

四. 语句

选择语句

#include <stdio.h>

// if...else
int fun1()
{
    int a;
    scanf("%d", &a);
    if (a == 1)
    {
        printf("一");
    }
    else if (a == 2 || a == 3)
    {
        printf("二或三");
    }
    else
    {
        printf("其他");
    }
    return 0;
}
// switch
int fun2()
{
    int i = 1;
    int r = 0;
    switch (i)
    {
    case 1:
        r = 10;
        break;

    default:
        r = 20;
        break;
    }
    printf("%d", r);
    return 0;
}

循环语句

#include <stdio.h>

// for
int fun1()
{
    int r = 0;
    for (int i = 0; i < 10; i++)
    {
        r += i;
    }
    printf("%d", r);
    return 0;
}

// while
int fun2()
{
    int i = 0;
    int r = 0;
    while (i < 10)
    {
        r += i;
        i++;
    }
    printf("%d", r);
    return 0;
}

// do...while
int fun3()
{
    int i = 0;
    int r = 0;
    do
    {
        r += i;
        i++;
    } while (i < 10);
    printf("%d", r);
    return 0;
}

结束语句

#include <stdio.h>

int main()
{
    int r = 0;
    for (int i = 1; i < 10; i++)
    {
        if (i == 5)
        {
            // 结束本轮循环,进入下一轮
            continue;
        }
        if (i == 8)
        {
            // 跳出循环
            break;
        }
        r += i;
    }
    // 1 + 2 + 3 + 4 + 6 + 7 = 23
    printf("%d", r);
}

五. 内置库

stdio

标准输入输出库

#include <stdio.h>

int main()
{
    // 打印字符串
    printf("你好 C语言\n");

    // 包含格式化占位符
    int a = 10;
    printf("a的值:%d\n", a);

    // 控制台输入,赋值到变量中
    int b, c;
    scanf("%d %d", &b, &c);
    printf("%d", b * c);
    
    return 0;
}

math

数学库

#include <stdio.h>
#include <math.h>

int main()
{
    // 绝对值
    float a = fabs(-5.1);
    // 向上取整
    int b = ceil(5.1);
    // 向上取整
    int c = floor(5.1);
    // 次幂,3的4次方
    int d = pow(3, 4);
    // 根号,根号16 = 4
    int e = sqrt(16);
    // 以2为底的对数
    int f = log2(16);
    // 以10为底的对数
    int g = log10(100);

    printf("%lf %d %d %d %d %d %d\n", a, b, c, d, e, f, g);
    return 0;
}

string

#include <stdio.h>
#include <string.h>

int main()
{
    char str[50] = "你好!";

    // 获取字符串的字节数(汉字3字节,英文1字节)
    int a = strlen(str); // 7
    
    // 比较字符串大小,相同返回0,参数一大于参数二返回1,反之返回-1
    int b = strcmp(str, "你好!");

    // 字符串拷贝
    char c[20];
    strcpy(c, str);

    // 字符串拼接
    strcat(str, "哈哈哈");

    printf("%d %d %s %s", a, b, c, str);
}
Last Updated 2024/6/15 18:38:34