ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

【C语言】第一章:从变量到数组

【C语言】第一章:从变量到数组 系列说明在学习阶段我就开始着手C语言的笔记并发表博客本文是对我学习阶段C语言笔记的整理归纳希望和大家共同进步。什么地方有遗漏欢迎大家指出。运行环境本系列所有演示代码均在Visual Studio 2022x64环境下编写。目录初识C语言hello world 与开发环境数据类型变量与常量输入输出printf / scanf操作符分支与循环数组本章小结正文1. 初识C语言hello world 与开发环境C语言是一门面向过程的编程语言main函数是程序的入口程序总是从main函数开始执行。在 VS2022 中新建空项目添加.c源文件后即可编写代码。demo1_第一个C程序//第一个C程序hello world#includestdio.hintmain(){// 在屏幕上打印一行文字printf(hello world\n);return0;}预期终端输出hello world说明#include stdio.h是标准输入输出头文件printf的声明在其中。\n是换行转义字符。return 0;表示程序正常结束。2. 数据类型C语言为不同类型的数据提供了不同的类型数据类型决定了数据的大小与含义。类型大小64位VS2022说明char1 字节字符型也可存储小整数short2 字节短整型int4 字节整型long4 字节长整型VS中与int相同long long8 字节更长的整型float4 字节单精度浮点型double8 字节双精度浮点型sizeof是操作符不是函数用来计算一个类型或变量所占内存大小返回size_t类型用%zu打印。由于sizeof是操作符括号内的表达式不会被执行。demo2_sizeof.c —— 计算各类型大小// demo2_sizeof.c - sizeof计算各数据类型大小单位字节#includestdio.hintmain(){// sizeof 是操作符返回 size_t 类型用 %zu 打印printf(char %zu\n,sizeof(char));printf(short %zu\n,sizeof(short));printf(int %zu\n,sizeof(int));printf(long %zu\n,sizeof(long));printf(long long %zu\n,sizeof(longlong));printf(float %zu\n,sizeof(float));printf(double %zu\n,sizeof(double));return0;}预期终端输出char 1 short 2 int 4 long 4 long long 8 float 4 double 83. 变量与常量C语言中经常变化的值称为变量不变的值称为常量。变量在定义时需指定数据类型。3.1 全局变量与局部变量局部变量在大括号内部定义的变量作用域为所在的局部范围进入作用域创建、出作用域销毁。全局变量在大括号外部定义的变量作用域为整个工程生命周期与程序一致。当局部变量与全局变量同名时局部变量优先使用。demo3_variable.c —— 变量的分类与作用域// demo3_variable.c - 全局变量与局部变量、作用域、生命周期#includestdio.hintglobal300;// 全局变量在函数外部定义作用于整个工程intmain(){intlocal200;// 局部变量在函数内部定义// 局部变量与全局变量同名时局部变量优先使用intglobal100;printf(local %d\n,local);printf(global %d\n,global);return0;}预期终端输出local 200 global 1003.2 内存区域一般我们会关注内存中的三个区域栈区存放局部变量进入作用域创建出作用域销毁。堆区用于动态内存管理后续文章详解。静态区存放全局变量和 static 修饰的变量。4. 输入输出printf / scanf4.1 printf 函数printf是格式化输出函数使用%加占位符来格式化输出。占位符含义%d整型%f/%lffloat / double%c字符%s字符串%zusize_t 类型%p地址%%打印百分号%5d最少5位不足左侧补空格%-5d最少5位不足右侧补空格%.2f保留2位小数\n\t\\\\换行、制表、反斜杠、双引号、单引号转义printf的返回值是打印成功的字符个数。demo4_printf.c —— 占位符与转义字符// demo4_printf.c - printf 占位符与转义字符#includestdio.hintmain(){intn456;doubled3.14159;// 基本占位符printf(%d\n,n);// 整型printf(%.2f\n,d);// 浮点型保留2位小数printf(%5d\n,n);// 最少5位不足左侧补空格printf(%-5d|\n,n);// 最少5位不足右侧补空格printf(%%d\n);// 打印百分号printf(Tab:\tHi\n);// 制表符printf(C:\\temp\n);// 反斜杠转义// printf 的返回值是打印的字符个数链式printf(%d\n,printf(%d\n,printf(%d\n,n)));return0;}预期终端输出456 3.14 456 456 | %d Tab: Hi C:\temp 456 4 24.2 scanf 函数scanf是格式化输入函数。注意scanf需要把输入存放到地址中所以基本类型变量前要加取地址符数组名本身就是地址不加。scanf的返回值是成功读取的数据个数读取错误或遇到文件结尾返回EOF。demo5_scanf.c —— scanf 基本用法与返回值// demo5_scanf.c - scanf 基本用法与返回值#define_CRT_SECURE_NO_WARNINGS1// vs2022中使用scanf需要添加这一行代码#includestdio.hintmain(){inta0;intb0;charch0;charstr[20]{0};// 输入两个整数printf(请输入两个整数: );intretscanf(%d %d,a,b);printf(成功读取个数 %d, a %d, b %d\n,ret,a,b);// 读取单个字符前面加一个空格跳过空白字符printf(请输入一个字符: );scanf( %c,ch);printf(ch %c\n,ch);// 读取一行字符串读到换行停止用于含空格的字符串// 注意%c 读取后缓冲区残留换行%[^\n] 前加空格可跳过空白printf(请输入一行字符串: );scanf( %[^\n]s,str);printf(str %s\n,str);return0;}预期终端输出键盘依次输入10 20、A、hello world请输入两个整数: 成功读取个数 2, a 10, b 20 请输入一个字符: ch A 请输入一行字符串: str hello world说明scanf( %c, ch)中%c前的空格用于跳过输入缓冲区中残留的空白字符如换行这是读取字符时的常见处理。5. 操作符5.1 算术操作符 - * / %/两端都是整数时执行整数除法取商至少一个为浮点数时执行浮点除法。%取模求余运算只能用于整数结果符号由第一个操作数决定。5.2 赋值操作符与复合赋值创建变量时给值叫初始化之后给值叫赋值。复合赋值a 3等价于a a 3-*/%同理。5.3 自增自减a后置先使用再自增。a前置先自增再使用。a--、--a同理。5.4 关系操作符符合返回1不符合返回0。5.5 逻辑操作符逻辑与。左侧为0时短路右侧不执行。||逻辑或。左侧非0时短路右侧不执行。!逻辑取反。5.6 条件操作符三目表达式1 ? 表达式2 : 表达式3表达式1为真执行2为假执行3。demo6_operator.c —— 常见操作符// demo6_operator.c - 常见操作符算术、赋值、自增自减、逻辑短路#includestdio.hintmain(){// 算术操作符整数除法与浮点除法floatx6/4;// 两端都是整数 整数除法商为1floaty6.0/4;// 至少一个浮点数 浮点除法printf(6/4 %.1f\n,x);printf(6.0/4 %.1f\n,y);// 取模运算结果的符号由第一个操作数决定printf(11%%-5 %d\n,11%-5);printf(-11%%5 %d\n,-11%5);// 自增自减前置先自增再使用后置先使用再自增inta5;intba;// b5, a6printf(ba b%d, a%d\n,b,a);intc5;intdc;// d6, c6printf(dc d%d, c%d\n,d,c);// 逻辑短路 左侧为0右侧不执行inti0;intret(0i);// i 被短路不执行printf(短路后 i %d, ret %d\n,i,ret);return0;}预期终端输出6/4 1.0 6.0/4 1.5 11%-5 1 -11%5 -1 ba b5, a6 dc d6, c6 短路后 i 0, ret 06. 分支与循环C语言是结构化程序设计语言所有逻辑可拆解为顺序、选择、循环三种结构的组合。6.1 if 语句if根据表达式的真/假0为假非0为真决定是否执行。控制多条语句必须用大括号{}。6.2 switch 语句switch用于多值匹配表达式必须是整型case后必须是整型常量。case具有穿透性需用break终止default处理所有不匹配的情况。6.3 循环while先判断后执行适合循环次数不确定的场景。for将初始化、判断、调整集中一处最常用。do-while至少执行一次。break终止循环continue跳过本次循环剩余代码进入下一次。goto快速跳转能不用尽量不用多层循环跳出除外。demo7_loop.c —— 分支与循环综合// demo7_loop.c - 分支与循环综合3的倍数之和、质数判断、多组输入#define_CRT_SECURE_NO_WARNINGS1#includestdio.hintmain(){// 1. 计算 1~100 中 3 的倍数之和intsum0;for(inti3;i100;i3){sumi;}printf(3的倍数之和 %d\n,sum);// 2. 判断一个正整数是否为质数intn0;printf(请输入一个正整数: );scanf(%d,n);intflag1;// 假设是质数for(inti2;in;i){if(n%i0){flag0;// 能整除则不是质数break;}}if(flagn1)printf(%d 是质数\n,n);elseprintf(%d 不是质数\n,n);// 3. 多组输入读到文件结尾(EOF)为止intm0;intcnt0;while(scanf(%d,m)!EOF){cnt;}printf(共读取 %d 个整数\n,cnt);return0;}预期终端输出键盘输入7再输入5 6 7 8后按 CtrlZ 结束3的倍数之和 1683 请输入一个正整数: 7 是质数 共读取 4 个整数7. 数组数组是一类相同类型元素的集合。7.1 一维数组定义类型 数组名[常量]例如int arr[5];初始化intarr1[10]{1,2,3,4,5,6,7,8,9,10};// 完全初始化intarr2[10]{0};// 不完全初始化其余补0intarr3[]{1,2,3};// 省略长度由初始化列表决定访问下标从0开始arr[i]访问第 i 个元素。元素个数int sz sizeof(arr) / sizeof(arr[0]);特点数组元素在内存中连续存放。7.2 二维数组把一维数组作为数组的元素就构成二维数组即数组的数组。初始化先存满一行再存下一行分行初始化用{}可以省略行数但不能省略列数。二维数组元素在内存中也是连续存放的按行。demo8_array.c —— 一维与二维数组// demo8_array.c - 一维与二维数组定义、访问、内存连续存放、元素个数#includestdio.hintmain(){// 一维数组完全初始化 / 不完全初始化 / 省略长度intarr1[5]{1,2,3,4,5};intarr2[5]{1,2};// 其余补0intarr3[]{1,2,3};// 由初始化列表决定长度3// 计算元素个数intszsizeof(arr1)/sizeof(arr1[0]);printf(arr1 元素个数 %d\n,sz);// 打印一维数组元素及其地址连续存放printf(arr1 的地址: %p\n,arr1);for(inti0;i5;i){printf(arr1[%d] %p\n,i,arr1[i]);}// 二维数组分行初始化intmatrix[3][5]{{1,2},{3,4,5},{6,7}};printf(二维数组打印:\n);for(inti0;i3;i){for(intj0;j5;j){printf(%d ,matrix[i][j]);}printf(\n);}return0;}预期终端输出地址数值每次运行可能不同间隔规律相同arr1 元素个数 5 arr1 的地址: 00000057FB4FFB30 arr1[0] 00000057FB4FFB30 arr1[1] 00000057FB4FFB34 arr1[2] 00000057FB4FFB38 arr1[3] 00000057FB4FFB3C arr1[4] 00000057FB4FFB40 二维数组打印: 1 2 0 0 0 3 4 5 0 0 6 7 0 0 0变长数组C99 支持int arr[n];n为变量但VS2022 内置编译器暂不支持变长数组需用常量指定数组大小。8. 本章小结本章介绍了C语言的基础数据类型char / short / int / long / long long / float / double sizeof用于计算大小。变量与常量全局/局部变量、作用域、生命周期、内存三大区域。输入输出printf 占位符与返回值、scanf 取地址与返回值。操作符算术 / 赋值 / 自增自减 / 关系 / 逻辑 / 条件操作符。分支与循环if / switch、for / while / do-while、break / continue。数组一维/二维数组定义、初始化、连续存放、元素个数计算。声明本文为个人学习笔记基于笔者学习内容整理代码均在 VS2022 环境验证通过。
返回列表