C语言
yuhuo2024-06-11开发工具
一. 环境搭建
安装
下载 MinGW64,选择 x86_64-posix-seh
版,解压到 D:\Software\mingw64
目录中。
将 bin 目录 D:\Software\mingw64\bin
配置到环境变量 Path 中。
VSCode 安装 C/C++
、C/C++ Extension Pack
、C/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.c
和 two.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);
}