【C语言】第二课 基础语法
一、🧱 基本程序结构
每个C程序都有一个基本的框架,这是程序执行的起点。
#include <stdio.h> // 包含标准输入输出头文件,这样我们才能使用 printf 等函数int main() { // main 函数是程序的入口,程序从这里开始执行// 你的代码写在这里printf("Hello, World!\n"); // 打印 Hello, World! 到屏幕,\n 表示换行return 0; // 返回 0 通常表示程序成功执行完毕
}
要点说明:
#include
是预处理器指令,用于包含其他文件(通常是头文件.h
)。stdio.h
包含了输入输出函数的声明,如printf
和scanf
。main()
函数是必须的,它是C程序的入口点。程序执行从这里开始。return 0;
表示程序正常退出。非零值通常表示错误。
二、🔢 数据类型、变量与常量
程序需要存储和操作数据,这就需要变量和常量。
1. 基本数据类型
C语言提供了几种基本数据类型来存放不同类型的数据:
数据类型 | 含义 | 示例 | 说明 |
---|---|---|---|
int | 整型 | int age = 25; | 存储整数,如 100, -5 |
float | 单精度浮点型 | float pi = 3.14f; | 存储小数,精度较低 |
double | 双精度浮点型 | double e = 2.71828; | 存储小数,精度比 float 高 |
char | 字符型 | char grade = 'A'; | 存储单个字符,用单引号括起 |
示例代码:变量定义与初始化
#include <stdio.h>int main() {int age = 30; // 定义整型变量并初始化float height = 1.75f; // 定义浮点型变量并初始化,'f' 表示 float 类型char grade = 'A'; // 定义字符型变量并初始化double weight = 65.5; // 定义双精度浮点变量// 打印变量值printf("Age: %d\n", age); // %d 用于输出整数printf("Height: %.2f meters\n", height); // %.2f 表示保留两位小数printf("Grade: %c\n", grade); // %c 用于输出字符printf("Weight: %.1f kg\n", weight); // %.1f 表示保留一位小数,double也可以用%f输出return 0;
}
要点说明:
- 变量命名规则:只能由字母、数字和下划线组成,且不能以数字开头。C语言区分大小写。
- 初始化:好的编程习惯是在定义变量时就赋予初始值,避免使用未初始化的变量导致不可预知的结果。
2. 常量
常量是其值在程序运行期间不可改变的量。
const
修饰的变量:表示变量是只读的。const double PI = 3.14159; // PI 的值之后不能再修改
#define
宏常量:在编译前进行文本替换。#define MAX_SIZE 100 // 注意没有分号,且通常用大写字母命名
三、📥 输入与输出
程序需要与用户交互,接收输入和显示输出。
1. 格式化输出 printf()
printf()
函数用于将格式化的数据输出到标准输出(通常是屏幕)。
常用格式说明符:
格式符 | 含义 |
---|---|
%d | 输出有符号十进制整数 |
%f | 输出浮点数 |
%c | 输出单个字符 |
%s | 输出字符串 |
你可以使用精度控制输出格式,例如 %.2f
表示保留两位小数。
2. 格式化输入 scanf()
scanf()
函数用于从标准输入(通常是键盘)读取格式化的数据。
重要: 在使用 scanf
读取变量时,必须在变量名前加上 &
符号(取地址运算符),表示将输入的值存储到该变量所在的内存地址中。
#include <stdio.h>int main() {int num1, num2;float price;char ch;printf("请输入两个整数,用空格隔开:");scanf("%d %d", &num1, &num2); // 读取两个整数,注意 & 符号printf("请输入一个浮点数:");scanf("%f", &price); // 读取一个浮点数printf("请输入一个字符:");scanf(" %c", &ch); // 注意 %c 前面的空格,用于消耗之前输入留下的换行符printf("你输入的数字是:%d 和 %d\n", num1, num2);printf("你输入的价格是:%.2f\n", price);printf("你输入的字符是:%c\n", ch);return 0;
}
四、🧮 运算符与表达式
运算符用于对变量和常量进行各种操作。
类型 | 运算符 | 示例 | 说明 |
---|---|---|---|
算术运算符 | + , - , * , / , % (取模/求余) | c = a % b; | 计算余数 |
关系运算符 | > , < , == , != , >= , <= | if (a == b) {...} | 判断相等 |
逻辑运算符 | && (与), ` | (或), !` (非) | |
赋值运算符 | = , += , -= , *= , /= | a += 5; // 等价于 a = a + 5; |
示例代码:
#include <stdio.h>int main() {int a = 10, b = 3;float result;result = a / (float)b; // 将b强制转换为float,使除法变为浮点除法printf("a / b = %.2f\n", result); // 输出 3.33printf("a %% b = %d\n", a % b); // 输出 1,%% 用于输出一个百分号if (a > 5 && b < 5) { // 逻辑与运算printf("Both conditions are true.\n");}a += 20; // 等价于 a = a + 20;printf("a is now %d\n", a); // 输出 30return 0;
}
五、🎛️ 控制流语句
控制程序执行的流程,是实现复杂逻辑的关键。
1. 条件语句 if
- else
根据条件的真假执行不同的代码块。
#include <stdio.h>int main() {int score;printf("请输入你的分数 (0-100): ");scanf("%d", &score);if (score >= 90) {printf("成绩优秀!\n");} else if (score >= 70) { // 注意是 else ifprintf("成绩良好。\n");} else if (score >= 60) {printf("成绩及格。\n");} else {printf("成绩不及格,需要努力。\n");}return 0;
}
2. 选择语句 switch
- case
当一个变量有多种可能的取值时,switch
语句比多个 if-else
更清晰。
#include <stdio.h>int main() {int day;printf("请输入星期数字 (1-7): ");scanf("%d", &day);switch (day) { // switch 后的表达式必须是整型或字符型case 1: // case 后的值必须是整型常量或常量表达式printf("星期一\n");break; // break 至关重要,用于跳出整个 switch 块case 2:printf("星期二\n");break;case 3:printf("星期三\n");break;// ... 可以继续写 case 4, 5, 6case 7:printf("星期日\n");break;default: // 当所有 case 都不匹配时,执行 defaultprintf("输入错误!请输入 1-7 之间的数字。\n");}return 0;
}
⚠️ 注意:忘记写 break
会导致“穿透”现象,即程序会继续执行下一个 case
的语句,直到遇到 break
或 switch
结束。
3. 循环语句
用于重复执行一段代码。
for
循环:适合已知循环次数的场景。#include <stdio.h>int main() {// for (初始化; 循环条件; 增量表达式)for (int i = 0; i < 5; i++) { // 循环5次,i从0到4printf("i = %d\n", i);}return 0; }
while
循环:适合循环次数不确定,但循环条件明确的场景。#include <stdio.h>int main() {int count = 0;while (count < 3) { // 只要条件为真,就继续循环printf("Hello while loop! Count: %d\n", count);count++; // 不要忘记改变循环条件,否则可能成为死循环}return 0; }
do-while
循环:先执行一次循环体,再判断条件。至少执行一次。#include <stdio.h>int main() {int num;do {printf("请输入一个正数:");scanf("%d", &num);} while (num <= 0); // 条件检查在循环体之后printf("你输入的是: %d\n", num);return 0; }
4. 循环控制 break
和 continue
break
:立即终止整个循环或switch
语句。continue
:跳过本次循环中剩余的代码,立即开始下一次循环。
#include <stdio.h>int main() {// 示例:breakfor (int i = 0; i < 10; i++) {if (i == 5) {break; // 当 i 等于 5 时,跳出整个循环}printf("%d ", i); // 输出: 0 1 2 3 4}printf("\nBreak example ended.\n");// 示例:continuefor (int j = 0; j < 6; j++) {if (j == 3) {continue; // 当 j 等于 3 时,跳过下面的打印,直接进行 j++}printf("%d ", j); // 输出: 0 1 2 4 5}printf("\nContinue example ended.\n");return 0;
}
六、📝 注释
注释用于解释代码,提高可读性,编译器会忽略它们。
- 单行注释:以
//
开始,到行尾结束。// 这是单行注释 int age; // 声明一个年龄变量
- 多行注释:以
/*
开始,以*/
结束。/* 这是一个多行注释,可以跨越多行 */