一、输入输出
(1)scanf
scanf 是C语言中的一个标准库函数,用于从标准输入(通常是键盘)读取数据。scanf 函数定义在 <stdio.h> 头文件中。
#include <stdio.h>int main(void) {//读取整数 int num;printf("Enter an integer: ");scanf("%d", &num); // 读取一个整数printf("You entered: %d\n", num);//读取浮点数 float num2;printf("Enter a floating-point number: ");scanf("%f", &num2); // 读取一个浮点数printf("You entered: %f\n", num2);//读取字符 char ch;printf("Enter a character: ");scanf(" %c", &ch); // 读取一个字符,前面的空格用于忽略空白字符printf("You entered: %c\n", ch);// 读取字符串char str[50];printf("Enter a string: ");scanf("%s", str); // 读取一个字符串,直到遇到空白字符printf("You entered: %s\n", str);// 读取多个数据int num3;float fnum;char ch;printf("Enter an integer, a floating-point number, and a character: ");scanf("%d %f %c", &num3, &fnum, &ch); // 读取多个数据printf("You entered: %d, %f, %c\n", num3, fnum, ch);char str2[50];printf("Enter a multi-word string: ");scanf("%[^\n]", str2); // 读取多单词字符串,直到遇到换行符printf("You entered: %s\n", str2);return 0;
}
(2)getchar
功能:该函数从标准输入读取一个字符,并返回该字符的ASCII码值。
#include <stdio.h>
int main(void) {char ch = getchar(); // 定义char 变量 ch,接收 getchar() 函数返回值做为初值。printf("ch的数值:%d\n", ch); printf("ch的字符:%c\n", ch);return 0;
}
(3)printf
- printf 函数的第一个参数是一个格式字符串,用于指定如何输出后续的参数。例如%d 是一个格式说明符,用于输出整数。
#include <stdio.h> // 引⼊头⽂件 stdio.h , 因为下⾯使⽤了printf() 必须添加此头⽂件。
#define PI 3.14
int main(void) {int a = 10;printf("%d\n", a); // %d:格式匹配符,匹配整数。printf("a = %d\n", a); // a = 在“”中,代表普通字符串, 原样输出。printf("%d\n", 100);printf("%f\n", PI); // %f:格式匹配符,匹配小数。printf("PI = %f\n", PI); // PI = 在“”中,代表普通字符串, 原样输出。printf("%f\n", 3.45678); // %f:格式匹配符,匹配小数。int b = 20;printf("%d + %d = %d\n", a, b, a+b); // +、= 在 “”中,代表普通字符串, 原样输出。printf("%d + %d = %d\n", 3, 7, 3+7);return 0; //C程序要求,main 函数要有返回值。借助 return 实现返回。
}
补充:占位符说明
二、变量
1、 变量 3 要素
- 变量名:用来在程序中使用。
- 变量类型:开辟内存空间大小。
- 变量值:存储的实际数据。
2、变量名命名的主要规则:
字母数字和下划线 变量名只能包含字母(A-Z, a-z)、数字(0-9)和下划线(_)。变量名不能以数字开头。
不得使用关键字 变量名不能与C语言的关键字(如 int, char, for, if 等)相同。
3、变量的作用域
变量的作用域决定了变量在哪里可以被访问。主要作用域有:
- 局部变量:在函数内部声明的变量,只在该函数内有效。
- 全局变量:在所有函数之外声明的变量,在整个文件或多个文件中都可访问。
- 形式参数:函数定义中参数列表内的变量,仅在该函数调用期间有效。
- 静态局部变量:使用 static关键字声明的局部变量,其生命周期贯穿整个程序运行期,但是作用域仍限制在声明它的函数内。
#include <stdio.h>// 全局变量
int globalVar = 100;void func() {// 局部变量int localVar = 200;printf("Inside function: globalVar = %d, localVar = %d\n", globalVar, localVar);
}int main() {func();printf("In main: globalVar = %d\n", globalVar);// 下面这行会报错,因为 localVar 是 func 函数内的局部变量// printf("localVar = %d\n", localVar);return 0;
}
三、常量
- C语言中,常量是那些在程序执行过程中其值不能被修改的量。
C语言中常量的主要用法:
- 使用 #define 预处理器指令
#define 是一个预处理器指令,用于定义宏常量。宏常量在编译前会被预处理器替换为指定的值。
#include <stdio.h>#define PI 3.14159
#define MAX 100int main(void) {printf("Value of PI: %f\n", PI);printf("Maximum value: %d\n", MAX);return 0;
}
- 使用 const 关键字
const 关键字用于声明常量变量。这种常量在内存中分配空间,并且可以在编译时或运行时初始化。
#include <stdio.h>int main(void) {const int MAX = 100;const float PI = 3.14159;const char GRADE = 'A';printf("Maximum value: %d\n", MAX);printf("Value of PI: %f\n", PI);printf("Grade: %c\n", GRADE);// 下面这行代码会导致编译错误,因为 MAX 是常量// MAX = 200;return 0;
}
- 枚举常量
枚举(enum)是一种特殊的整型常量集合,用于定义一组具名的整数值。
说明:枚举类型 Day 包含七个枚举常量:MON, TUE, WED, THU, FRI, SAT,
SUN。默认情况下,这些枚举常量会被赋予从 0 开始的连续整数值。
#include <stdio.h>enum Day { MON, TUE, WED, THU, FRI, SAT, SUN };int main(void) {enum Day today = WED;printf("Today is day number: %d\n", today);//Today is day number: 2return 0;
}
练习:
#include <stdio.h>
#define PI 3.1415926 // 定义常量
int main(void) {
// 圆的面积 :s = PI * r * r
// 圆的周长 :L = 2 * PI * rint r = 3; // 变量的定义。float s = PI * r * r; // 表达式。作为变量值。float l = 2 * PI * r;
//printf("圆的面积:%f\n", s);// 28.274334 默认显示 6 位小数。
//printf("圆的周长:%f\n", l);// 18.849556
//printf("圆的面积:%.2f\n", s);// 28.27
//printf("圆的周长:%.2f\n", l);// 18.85指定保留小数点后两位,对第3位四舍五入float m = 3.4567891;printf("m=%.2f\n", m);printf("m=%6.2f\n", m);
//共显示6位数,包含小数点,保留小数点后两位,对第3位四舍五入,不足6位用空格补齐。printf("m=%06.2f\n", m);
//共显示6位数,包含小数点,保留小数点后两位,对第3位四舍五入,不足6位用0补齐。return 0;
}
四、sizeof
1、有符号整型
#include <stdio.h>
#include <limits.h>
int main(void) {printf("int大小 = %u\n", sizeof(int));printf("int最小值:%d, 最大值:%d\n", INT_MIN, INT_MAX);printf("short大小 = %u\n", sizeof(short));printf("short最小值:%hd, 最大值:%hd\n", SHRT_MIN, SHRT_MAX);printf("long大小 = %u\n", sizeof(long));printf("long最小值:%ld, 最大值:%ld\n", LONG_MIN, LONG_MAX);printf("long long大小 = %u\n", sizeof(long long));printf("long long最小值:%lld, 最大值:%lld\n", LLONG_MIN, LLONG_MAX);
}
2、无符号整型
【扩展】:C语言中引入无符号整型有几个重要的原因,这些原因涉及性能、表示范围、内存利用率以及特定应用场景的需求。以扩大表示范围为例子,无符号整型可以表示更大的正数范围。
五、char
在C语言中,char 类型用于表示字符。char 类型是一个基本的数据类型,通常占用1个字节的内存。以下是关于 char 类型的详细总结:
-
基本属性
-
定义和初始化
#include <stdio.h>
#include <limits.h>
int main(void) {char ch1 = 'A'; // 单引号表示单个字符char ch2 = 65; // 使用ASCII码值初始化printf("%c",ch2); //结果:A return 0;
}
-
字符常量
-
字符串
-
输入和输出
#include <stdio.h>int main(void) {char ch;printf("Enter a character: ");scanf("%c", &ch); // 读取一个字符printf("You entered: %c\n", ch); // 打印字符return 0;
}
-
ASCII 码
-
字符操作
- 比较字符:可以使用关系运算符比较字符。
- 字符运算:可以对字符进行算术运算,实际上是对其ASCII码值进行运算。
#include <stdio.h>int main(void) {char ch1 = 'A';char ch2 = 'B';if (ch1 < ch2) {printf("'%c' comes before '%c'\n", ch1, ch2);//'A' comes before 'B'}char ch3 = ch1 + 1; // 'A' + 1 -> 'B'printf("ch1 + 1 = %c\n", ch3);//ch1 + 1 = Breturn 0;
}
- 字符串处理函数
- C标准库提供了许多用于字符串处理的函数,例如 strlen、strcpy、strcat、strcmp 等。
#include <stdio.h>
#include <string.h>int main(void) {char str1[20] = "Hello";char str2[20] = "World";strcpy(str1, str2); // 复制 str2 到 str1strcat(str1, "!"); // 连接字符串printf("str1: %s\n", str1);int len = strlen(str1); // 获取字符串长度printf("Length of str1: %d\n", len);return 0;
}
- 无符号字符
- 如果需要确保 char 类型的值是非负的,可以使用 unsigned char。
#include <stdio.h>int main(void) {unsigned char ch = 255; // 无符号字符printf("Value of ch: %u\n", ch);return 0;
}
【 练习1 】:将大写字母,转换成 小写字母
#include <stdio.h>
int main(void) {char ch = 'R'; // char 变量定义printf("R 转换的小写为:%c\n", ch+32); //ch+32 表达式,对应格式匹配符 %cchar ch2 = 'h'; // char 变量定义printf("h 转换的大写为:%c\n", ch2-32); //ch2-32 表达式,对应格式匹配符 %cchar ch3 = '5';
// 借助字符5, 利用 ASCII特性,打印出 字符9printf(" 打印字符9 = %c\n", ch3+4);return 0;
}
【 练习 2】:在一个printf函数中, 打印输出 hello 换行 world 换行 。
#include <stdio.h>
/*方法1
int main(void) {printf("hello\nworld\n");return 0;
}
*/
//方法2
int main(void) {char ch = '\n'; //定义ch变量,初值为'\n'printf("hello%cworld%c", ch, ch); // 等价于 printf("hello\nworld\n");return 0;
}
六、bool
- 在C语言中,布尔类型(bool)并不是内置类型,而是通过包含 <stdbool.h> 头文件来引入的。bool 类型用于表示真(true)和假(false)两种逻辑值。
1.输出布尔值
可以使用 %d 格式说明符来输出布尔值。true 输出为 1,false 输出为 0。
#include <stdio.h>
#include <stdbool.h>int main(void) {bool isTrue = true;bool isFalse = false;printf("isTrue: %d\n", isTrue); // 输出 1printf("isFalse: %d\n", isFalse); // 输出 0return 0;
}
2.布尔值的整数表示
在C语言中,true 实际上表示整数 1,false 表示整数 0。因此,任何非零值都可以被视为 true,零值被视为 false。
#include <stdio.h>
#include <stdbool.h>int main(void) {bool a = 1; // truebool b = 0; // falsebool c = 10; // trueprintf("a: %d\n", a); // 输出 1printf("b: %d\n", b); // 输出 0printf("c: %d\n", c); // 输出 1return 0;
}
3.布尔运算
布尔运算符(如 &&、||、!)可以用于布尔表达式的组合和否定。
#include <stdio.h>
#include <stdbool.h>int main(void) {bool a = true;bool b = false;bool andResult = a && b; // falsebool orResult = a || b; // truebool notResult = !a; // falseprintf("a && b: %d\n", andResult);printf("a || b: %d\n", orResult);printf("!a: %d\n", notResult);return 0;
}
七、运算符
(1)算数运算符
(2)自增自减运算符
#include <stdio.h>
// ++ / -- 运算符
int main(void) {
// 前缀int a = 10;printf("%d\n", ++a); // ++a 等价于 a = a+1;
// 后缀int b = 10;printf("%d\n", b++); // b++ 等价于 b = b+1;
// 不管前缀、后缀、含有变量 ++/-- 表达式执行完后,变量均发生了自增、自减。printf("b = %d\n", b);return 0;
}
(3)赋值运算符
(4)比较运算符
(5)逻辑运算符
- 0 为假, 非0 为真。(非0: 1、 27、-9)
- 逻辑非(!)
- 规律:非真为假,非假为真。
#include<stdio.h>
// 逻辑运算符
int main(void) {
// 逻辑非int a = 34; // 34 是非0, 默认 a 为真。int b = 0;printf("a = %d\n", !a); // a为真,非a 为假!!---> 0printf("b = %d\n", !b); // b=0, b为假,非b, 为真。 ---> 1return 0;
}
- 逻辑与(&&)
- 规律:同真为真,其余为假。
#include<stdio.h>
// 逻辑运算符
int main(void) {int a = 34; // 34 是非0, 默认 a 为真。int b = 0;printf("%d\n", a && !b); // a为真,!b为真, 真&&真 -- 真。 --->1
}
- 逻辑或(||)
- 规律:有真为真,同假为假。
#include<stdio.h>
// 逻辑运算符
int main(void) {int a = 34; // 34 是非0, 默认 a 为真。int b = 0;printf("------%d\n", a || !b); // a为真,!b为真,真||真 -- 真。---> 1printf("------%d\n", a || b); // a为真,b为假,真||假 --真。---> 1printf("------%d\n", !a || b); // !a为假,b为假,假||假 --假。---> 0
}
(6)逗号运算符
(7)三目运算符
#include<stdio.h>
// 三目运算
int main(void) {int a = 40;int b = 4;//int m = a > b ? 69 : 10;//printf("m = %d\n", m); // m = 69;//int m = a < b ? 69 : 10;//printf("m = %d\n", m); // m = 10;// 三目运算支持嵌套int m = a < b ? 69 : (a<b?3:5); // 先算表达式3,取5,整个三目运算,取表达式3-- >5printf("m = %d\n", m); // m = 5;int m2 = a < b ? 69 : a < b ? 3 : 5;printf("m2 = %d\n", m2); // m = 5;return 0;
}
【说明】:如果不使用(),三目运算默认的结合性,自右向左。
(8)运算符的优先级
八、if 条件判断
(1)if…else 分支
#include <stdio.h>int main(void) {int a;printf("请输入一个数:");int ret = scanf("%d", &a);if (a > 0) {printf("a > 0\n");} else {printf("a <= 0\n");}return 0;
}
(2)多个分支逻辑
#include <stdio.h>int main(void) {int score;printf("请输入学生成绩:");scanf("%d", &score);if (score >= 90) { // 优秀printf("优秀\n");} else if (score >=70 && score < 90) { // 70 < score < 90 错误写法。printf("良好\n");} else if (score >= 60 && score < 70) {printf("及格\n");} else {printf("差劲\n");}
}
九、switch 语句
#include <stdio.h>
int main(void) {int score;printf("请输入学生成绩:");scanf("%d", &score);// 将 学生成绩,通过运算,得出可以放入 switch case 分支的 表达式。switch (score/10) {case 10:printf("优秀\n");break; // 表示当前分支结束。case 9:printf("优秀\n");break;case 8:printf("良好\n");break;case 7:printf("良好\n");break;case 6:printf("及格\n");break;default: // 所有case都不满足的其他情况。printf("不及格");break;}return 0;
}
备注:case穿透
十、while 循环
#include<stdio.h>
int main(void) {//7的倍数: num % 7 == 0//个位含7: num % 10 == 7//十位含7: num / 10 == 7int num = 1;while (num <= 100) {if (num % 7 == 0 || num % 10 == 7 || num / 10 == 7) {printf("敲桌子!\n");} else {printf("%d\n", num);}num++;}return 0;
}
十一、do while 循环
练习:
#include<stdio.h>
int main(void) {//-个位数:int a = num % 10;//-十位数:int b = num / 10 % 10;//-百位数:int c = num / 100;int num = 100; // 数数从 100 开始。int a, b, c; // 定义存储个位、十位、百位数 的变量。do {a = num % 10; // 求个位数。b = num / 10 % 10;c = num / 100;// 判断 这个数字是否是“水仙花数”if (a * a * a + b * b * b + c * c * c == num){printf("水仙花数:%d\n", num);}num++; // 不断向后数数。} while (num <= 999);return 0;
}
十二、for 循环
- 使用 for 循环 求 1~100 的 和
#include <stdio.h>int main(void) {int sum = 0; // 初始化累加和为0// 使用 for 循环从1到100求和for (int i = 1; i <= 100; i++) {sum += i; // 累加当前的值}// 输出结果printf("The sum of numbers from 1 to 100 is: %d\n", sum);return 0;
}
- 特殊语法:
-
十三、嵌套 for 循环
#include <stdio.h>int main(void) {for (int i = 0; i < 2; i++) { // 外层循环for (int j = 0; j < 3; j++) { // 内层循环printf("Hello World!\n");}}return 0;
}
分析代码:拆解以上循环嵌套的执行过程
第一次外层循环:i = 0; //i的初始值为0i < 2 //条件成立,进入内层循环第一次进入内层循环:【内层循环第一次:】j = 0; //j的初始值为0j < 3 //条件成立printf("Hello World!\n");//此时输出一次 Hello World!j++; //j的值变为1【内层循环第二次:】j = 1; j < 3 //条件成立printf("Hello World!\n");//此时输出一次 Hello World!j++; //j的值变为2【内层循环第三次:】j = 2; j < 3 //条件成立printf("Hello World!\n"); //此时输出一次 Hello World!j++; //j的值变为3【内层循环第四次:】j = 3; j < 3 //条件不成立,内层循环结束i++; //i的值变为1
第二次外层循环:i = 1; i < 2 //条件成立,进入内层循环第二次进入内层循环:【内层循环第一次:】j = 0; //j的初始值为0j < 3 //条件成立printf("Hello World!\n"); //此时输出一次 Hello World!j++; //j的值变为1【内层循环第二次:】j = 1; j < 3 //条件成立printf("Hello World!\n"); //此时输出一次 Hello World!j++; //j的值变为2【内层循环第三次:】j = 2; j < 3 //条件成立printf("Hello World!\n"); //此时输出一次 Hello World!j++; //j的值变为3【内层循环第四次:】j = 3; j < 3 //条件不成立,内层循环结束i++; //i的值变为2
第三次外层循环:i = 2; i < 2 //条件不成立,外层循环结束,整个循环都终止了
练习:打印乘法口诀表
#include <stdio.h>int main(void) {// 外层循环控制行数for (int i = 1; i <= 9; i++) {// 内层循环控制列数for (int j = 1; j <= i; j++) {// 打印乘法口诀表的一个项printf("%d*%d=%d ", j, i, i * j);}// 每一行结束后换行printf("\n");}return 0;
}
十四、语句跳转
- 在流程控制语句中还有一类“跳转语句”,主要用来中断当前的执行过程。
(1)break
- 当代码中遇到break时,会直接中断距离最近的循环,跳转到外部继续执行。
#include <stdio.h>int main(void) {int i = 1;while (1) { // 使用1表示无限循环printf(" 这是第%d次输出\n", i);i++;if (i > 5) {break; // 当 i 大于 5 时退出循环}}return 0;
}
结果:
(2)continue
- continue语句表示“继续”执行循环,也就是中断循环中的本次迭代,并开始执行下一次迭代。
//需求:输出1到10之间所有的整数,5不输出#include <stdio.h>int main(void) {for (int i = 1; i <= 10; i++) {if (i == 5) {continue; // 当 i 等于 5 时跳过本次循环} else {printf("这是第%d次输出\n", i);}}return 0;
}
结果: