C语言复习笔记(一)
这里写自定义目录标题
- 1 Windows编译环境搭建
- 1.1 软件安装与配置
- 1.2 C语言程序运行
- 2 变量和赋值
- 3 格式化输入/输出
- 4 表达式
- 5 选择语句
- 6 循环
本着“每次任务必须血洗一个关键领域”,2025年10月18日开启C语言的攻坚战。
1 Windows编译环境搭建
1.1 软件安装与配置
- 使用的IDE是VS code:
- 安装MinGW 编译器(在windows环境下提供类UNIX的开发工具)
- 运行MinGW,然后输入以下代码安装MinGW-w64工具链
pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain
- 添加环境变量,用户path新建
“D:\Program Files (x86)\MSYS2\ucrt64\bin”
- 在VS code里添加 c/c++扩展程序
- 新建一个文件夹,VS code是一款基于文件夹进行代码编辑和管理的编辑器,通常会新建一个文件夹来管理一个项目的代码,并在Vs code中打开。
1.2 C语言程序运行
C语言依赖3个关键的语言特性:指令、函数和语句。预处理器执行的命令称为指令,所有指令都以#开头,默认只占一行,结尾没有分号或其他特殊标记;函数可分为库函数和用户自编写函数,可以理解为一系列组合在一起的语句以实现某些功能的结合体;语句是程序运行时执行的具体命令,以分号结尾
例如:
/*
* Name: test.c
* Purpose: prints a bad pun
* Author: Sonny
*/
#include <stdio.h> //预处理指令int main(void)//主函数,返回一个整数值int, 参数为空void
{printf("To C or not to C: that is the question.\n");//库函数return 0;//语句
}
上述C语言程序首先送交预处理器,执行以#开头的第一行命令,这行命令包含的是C语言标准输入/输出库的相关信息,也就是下面printf实现过程,预处理器有点类似编辑器,给程序添加头文件内容
添加修改后的程序(比如添加库函数)进入编译器,将程序翻译为机器指令,由链接器将编译器产生的目标代码和其他附加代码整合在一起,产生最终可执行的程序。
2 变量和赋值
- Float变量可以存储比int变量大得多的数值,但是运算时比int更慢,更重要的是,float变量只是实际数值的一个近似值,例如存储0.1,变量实际可能为0.09999999.
- 就书写格式,在声明和语句之间留出一个空行;
- 变量在赋值前必须先声明,float在赋值时在常量后面加一个f;
#include <stdio.h>int main(void)
{int weight, volume, length, width, height;height = 8;length = 12;width = 10;volume = length * width * height;weight = (volume + 165) / 166;printf("Dimensions:%dx%dx%d\n", length, width, height);printf("Volume:%d\n", volume);printf("Dimensional weight:%d\n", weight);return 0;
}
- scanf命令
scanf(“%d”, &height);
- 宏定义 #define INCHER 166,此处名称是大写,只是一种规范,不是C语言本身的要求
- 名称以字母或下划线开头,区分大小写,长度没有限制(超过31个会丢失),不能使用关键字

3 格式化输入/输出
printf函数的转化说明与变量最好一一对应,如果:
- 变量类型不对应,会输出无意义的数据
- 变量数量多于转化说明,多余的变量不显示;
- 变量数量少于转化说明,多余的变量显示无意义
#include <stdio.h>int main(void)
{int weight, volume, length, width, height;// printf("Enter height of box:");// scanf("%d", &height);length = 12;width = 10;volume = length * width * height;weight = (volume + 165) / 166;printf("Dimensions:%fx%f\n", length, height);// printf("Dimensions:%dx%dx%d\n", length, width, height);// printf("Volume:%d\n", volume);// printf("Dimensional weight:%d\n", weight);return 0;
}
- 不能在字符串中只单独放置一个 \ ,为了显示单斜杠,需要放2个 \ ;
- 使用scanf函数时,必须检查转换说明与输入变量的数量是否匹配,且数据类型是否对应;
- 使用scanf函数时,需要把&符号放在每个变量前面(如果不放置,就无法把输入读进来的值存储到变量中)
- 尽量避免使用scanf函数,而是采用字符格式读取所有数据,然后再把他们转换为数值形式,否则用户输入非预期数据,许多程序将无法正常执行;
- 在使用scanf函数时,%e、%f、%g这三个转换说明是可以互换的;
- 要求读入整数时,scanf会首先寻找正号或负号,然后读取数字到一个非数字才停止;
- 要求读入浮点数时,scanf会选找一个正负号,然后一串数字(可以包含小数点);
- 读入的字符串空格数无关紧要,除非转换说明中包含了空格;
- scanf遇到输入其他字符,会将它与下一个输入字符进行比较,如果不匹配,就会把字符放入输入中,然后异常退出。
- 需要注意,scanf的转换说明中不要增加符号,比如逗号,这会触发scanf读取字符串时寻找逗号;末尾也不要增加换行符等转义符
/** add two fractions*/
#include <stdio.h>int main(void)
{int num1, denom1, num2, denom2, result_num, result_denom;printf("Enter first fraction:");scanf("%d/%d", &num1, &denom1);printf("Enter second fraction:");scanf("%d/%d", &num2, &denom2);result_num = num1 * denom2 + num2 * denom1;result_denom = denom1 * denom2;printf("The sum is %d/%d\n", result_num, result_denom);return 0;
}
4 表达式
C 语言中最基础的运算符:算术运算、赋值运算、自增自减运算、逻辑运算、关系运算等。
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:
注意:
- 当两个操作数是整数时,/会丢掉分数部分来截取结果;
- 运算符%要求操作数是整数;
- i+=2,等同于i=i+2;
- i++, 先用i的原始值,计算后再自增;
- ++i ,立即自增1;
#include <stdio.h>int main(void)
{int i, j, k;i = 1;j = 1;k = ++i + j++;printf("%d%d%d\n", i, j, k);return 0;
}
- ++和–与+、-的优先级相同,是右结合的;
#include <stdio.h>int main(void)
{int i, j, k;i = 5;k = (j = i + 2) - (i = 1);printf("%d%d%d\n", i, j, k);return 0;
}
- C语言关系运算符的结果是0(假)或者1(真);
#include <stdio.h>int main(void)
{int i, j, k;i = 5;j = 5;k = i == j;printf("%d\n%d\n%d\n", i, j, k);return 0;
}
5 选择语句
C语言的语句大多有以下三类:
- 选择语句:if和switch
- 重复语句:while、do、for语句
- 跳转语句:break、continue、goto语句
/** Calculates a broker's commission*/#include <stdio.h>int main(void)
{float commission, value;printf("enter value of trade:");scanf("%f", &value);if (value < 2500.00f)commission = 30.00f + .017f * value;else if (value < 6250.00f)commission = 56.00f + .0066f * value;else if (value < 20000.00f)commission = 76.00f + .0034f * value;else if (value < 5000.00f)commission = 100.00f + .0022f * value;else if (value < 50000.00f)commission = 155.00f + .0011f * value;elsecommission = 255.00f + .0009f * value;if (commission < 39.00f)commission = 39.00f;printf("commission:$%.2f\n", commission);return 0;
}
- 悬空else语句属于离它最近的且未和其他else匹配的if语句,不以缩进格式为依据,可以用花括号括起来;
- 条件表达式: 表达式1?表达式2:表达式3
/** Calculates a broker's commission*/#include <stdio.h>int main(void)
{int i, j, k, l;i = 1;j = 2;k = i > j ? i : j;l = (i >= 0 ? i : 0) + j;printf("%d\n%d\n", k, l);return 0;
}
- Bool类型是整数类型,只能赋值为0或者1;
/** Calculates a broker's commission*/#include <stdio.h>int main(void)
{int i, j, k;_Bool l;i = 1;j = 2;k = i > j ? i : j;l = (i >= 0 ? i : 0) + j;printf("%d\n%d\n", k, l);return 0;
}
- <stdbool.h>头文件,变量类型可以用bool定义
#include <stdio.h>
#include <stdbool.h>
int main(void)
{int i, j, k;bool l;i = 1;j = 2;k = i > j ? i : j;l = (i >= 0 ? i : 0) + j;printf("%d\n%d\n", k, l);return 0;
}
- swtich语句
/** prints a date in legal form*/#include <stdio.h>
#include <stdbool.h>
int main(void)
{int month, day, year;printf("Enter date (mm/dd/yy):");scanf("%d /%d /%d", &month, &day, &year);printf("Dated this %d", day);switch (day){case 1:case 21:case 31:printf("st");break;case 2:case 22:printf("nd");break;case 3:case 23:printf("rd");break;default:printf("th");break;}printf(" day of ");switch (month){case1:printf("January");break;case2:printf("February");break;case3:printf("March");break;case4:printf("April");break;case5:printf("May");break;case6:printf("June");break;case7:printf("July");break;case8:printf("August");break;case9:printf("September");break;case10:printf("October");break;case11:printf("November");break;case12:printf("December");break;}printf("20%.2d.\n", year);return 0;
}
6 循环
- while循环语句
#include <stdio.h>
#include <stdbool.h>
int main(void)
{int i, n;printf("This program prints a table of .\n");printf("Enter number of entries in table:");scanf("%d", &n);i = 1;while (i <= n){printf("%10d%10d\n", i, i * i);i++;}return 0;
}
- do语句
/** Calculates the number of digits in an integer*/
#include <stdio.h>
#include <stdbool.h>
int main(void)
{int digits = 0, n;printf("Entera nonnegativew integer:");scanf("%d", &n);do{n /= 10;digits++;} while (n > 0);printf("The number has %d digits(s)\n", digits);return 0;
}
- for语句
/** Calculates the number of digits in an integer*/
#include <stdio.h>
#include <stdbool.h>
int main(void)
{int i, n;printf("Enter number of entries in table :");scanf("%d", &n);for (i = 1; i <= n; i++)printf("%10d%10d\n", i, i * i);return 0;
}