ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

数据与关键字、标识符

2026/9/15 20:54:19 拓冰建站 浏览量
数据与关键字、标识符 编程与数据我们编程的目的就是对输入的数据进行特定处理然后得到有效的输出数据。这一过程非常像数学中的函数总结对数据的先描述再组织是编程的核心之一一、 常量的意义意义防止程序运行过程中被意外修改增强代码的稳定性、安全性和可读性。稳定性确保关键值如圆周率π、配置参数不变。安全性避免在复杂逻辑中误修改重要数据。可读性给魔法数字起一个有意义的名字如#define MAX_SIZE 100。维护性修改常量值只需修改一处定义提高代码可维护性二、 全局与局部变量的本质区别全局变量与局部变量的区别表面上是声明/定义的位置不同函数内/外但其本质是存储位置的不同这直接导致了它们作用域和生命周期的天差地别。三、 数据的存储位置程序运行时数据主要存储在以下几个内存区域栈区 (Stack)存储内容局部变量、函数参数、函数调用地址等。特点由系统自动分配和释放效率高但空间有限。行为函数执行时局部变量在栈上创建函数结束时它们被自动销毁。堆区 (Heap)存储内容通过动态内存分配函数malloc,calloc,realloc申请的空间。特点空间巨大分配和释放需由程序员手动控制使用free。行为如果只申请不释放会导致内存泄漏。静态区/数据段 (Static Storage/Data Segment)存储内容全局变量、static静态变量、字符串常量等。特点在程序开始时分配程序结束时才释放。默认初始化为0。四、 作用域 vs. 生命周期这是两个极易混淆但至关重要的概念作用域 (Scope)指的是变量在代码中的可访问范围。它是一个空间上的概念。问题我在第50行写的代码能访问这个变量吗生命周期 (Lifetime)指的是变量在程序运行时的存在时间。它是一个时间上的概念。问题函数调用结束后这个变量占用的内存还在吗重要关系生命周期覆盖作用域。一个变量只要在它的生命周期内并且在它的作用域中就可以被访问。一个变量离开了作用域比如函数返回并不意味着它的生命周期一定结束例如static局部变量。听到这儿大部分同学可能已经觉得有些云里雾里了。别急因为这俩本来就是进阶的拓展内容不是咱们今天的硬性任务。大家课后感兴趣可以自己去死磕一下一旦你真正搞懂了它们你对这节内容的掌握绝对会有一个质的飞跃。学习嘛往往就是这种感觉——‘山重水复疑无路柳暗花明又一村’。五、 关键字 (KeyWord) 与数据类型 (DataType)关键字是C语言预先定义的、具有特殊含义的单词我们不能用它们来命名变量或函数如int,if,return。数据类型是一种特殊的、用于声明变量和常量的关键字。它决定了数据占用的内存大小如int通常占4字节。数据的解释方式同样的二进制数int和float解释出来值不同。数据可执行的操作如 取模运算%只能用于整型。类比数学中的数分为“常量”、“变量”又可细分为整数、小数等。C语言的数据类型就是为计算机世界的“数”进行更精细的分类如整型(int)、字符型(char)、浮点型(float,double)。注意不同类型之间可以相互赋值但可能会发生隐式类型转换导致精度丢失或值改变例如将float赋给int小数部分会被截断。六、 标识符 (Identifier) 与命名规则标识符就是给变量、函数、常量等起的名字是我们在编程中的“命名”。命名规则必须遵守只能由字母A-Z, a-z、数字0-9、下划线_组成。第一个字符必须是字母或下划线不能是数字。不能与C语言的关键字重名。区分大小写age和Age是两个不同的变量。命名规范良好习惯见名知意int student_age;VS.int a;(差)。常用风格蛇形命名法student_name(C语言常用)小驼峰命名法StudentName常量通常全大写#define MAX_SIZE 100七、 字符与ASCII编码为了理解字符型(char)必须引入ASCII编码的概念。本质计算机中所有数据都以数字形式存储。字符也不例外。ASCII码规定了一个整数与一个字符的对应关系例如整数65代表大写字母A因此字符型可以看作一种特殊的整型它可以参与整数运算。扩展知识转义字符以反斜杠\开头表示特殊字符\n换行符\t制表符\\反斜杠本身\、\单引号、双引号\0空字符字符串结束标志八、sizeof与strlensizeof它是一个运算符编译时就确定结果。功能计算变量或数据类型在内存中所占的字节数。sizeof(array)计算整个数组的大小。strlen它是一个库函数#include string.h运行时才计算。功能计算字符串的长度即从起始地址到第一个\0字符串结束符之前的字符个数。strlen(string)不包含结束符\0。关键区别char str[100] Hello; printf(%zu, sizeof(str)); // 输出 100计算的是数组的总容量 printf(%zu, strlen(str)); // 输出 5计算的是字符串的实际长度九、 常量与变量的定义1. 常量的定义及初始化使用#define宏定义#define PI 3.14159 // 注意末尾没有分号 #define MAX_N 100 #define GREETING Hello, World!在编译前预处理器会将代码中所有PI直接替换为3.14159。使用const修饰变量const double pi 3.14159; const int max_n 100;定义了一个“只读变量”其值在运行时不能被修改。2. 变量的定义及初始化定义为变量分配内存空间。int age; // 定义了一个整型变量age初值是随机的 double salary;初始化在定义的同时赋予一个初始值。int count 0; // 定义并初始化 char grade A;赋值操作符表示将等号右边表达式的值存入等号左边变量所标识的内存空间中。count 10; // 将10这个值放入count对应的内存中 grade B; // 将B的ASCII码值放入grade对应的内存中注意 是赋值不是数学中的“等于”。数学中的等于是 。十、 格式化输入/输出C语言通过标准库函数scanf和printf进行输入输出它们通过格式控制字符串来指定数据的类型和格式。1. 输出函数printfprintf(格式控制字符串, 输出项列表);常用格式控制符%d以十进制输出 int%c输出 char%f输出 float/double%lf输出 double (推荐)%s输出字符串%p输出指针地址%zu输出 sizeof 的返回值类型 (size_t)示例int a 10; char c X; double d 3.14; printf(a%d, c%c, d%.2f\n, a, c, d); // 输出a10, cX, d3.142. 输入函数scanfscanf是一个不太安全的输入函数因为它在写入时不会检查该scanf(格式控制字符串, 变量地址列表);关键必须提供变量的地址使用取地址运算符。常用格式控制符同上。示例int age; double height; printf(请输入年龄和身高); scanf(%d %lf, age, height); // 注意height是double用%lf printf(年龄%d, 身高%.2f\n, age, height);注意scanf读取字符串时变量是字符数组名本身即地址无需。char name[20]; scanf(%s, name); // 正确name已是地址 // scanf(%s, name); // 错误name写法多余且类型不匹配补充内容利用%m.n修饰占位符在C语言的格式化输入/输出中%m.n是极为重要的格式修饰符它允许我们精确控制输入/输出的格式基本语法结构%[flags][width][.precision]specifier其中flags标志字符如-, , 0, #等width指定最小字段宽度.precision指定精度对于不同类型有不同含义specifier类型说明符如d, f, s等一、字段宽度 (width) - 控制输出的最小宽度1. 基本用法int num 123; printf(%5d, num); // 输出 123右对齐宽度5 printf(%-5d, num); // 输出 123 左对齐宽度5 printf(%05d, num); // 输出 00123用0填充2. 动态指定宽度int width 8; printf(%*d, width, num); // 相当于 %8d二、精度 (.precision) - 控制输出的精度1. 浮点数精度控制double pi 3.1415926535; printf(%.2f, pi); // 输出 3.14保留2位小数 printf(%8.3f, pi); // 输出 3.142宽度8保留3位小数 printf(%.0f, pi); // 输出 3不保留小数2. 字符串精度控制char str[] HelloWorld; printf(%.5s, str); // 输出 Hello只输出前5个字符 printf(%10.5s, str); // 输出 Hello宽度10只输出5字符3. 整数精度控制最小数字位数int num 42; printf(%.5d, num); // 输出 00042至少5位用0填充 printf(%5.3d, num); // 输出 042宽度5至少3位三、scanf中的格式控制1. 基本输入控制int age; float height; char name[50]; // 基本输入 scanf(%d, age); // 读取整数 scanf(%f, height); // 读取浮点数 scanf(%s, name); // 读取字符串不包含空格 // 同时读取多个值 scanf(%d %f %s, age, height, name);2. 宽度限制 - 防止缓冲区溢出char city[20]; // 限制最多读取19个字符留一个位置给\0 scanf(%19s, city); // 对于带有空格的字符串输入 char full_name[50]; scanf( %49[^\n], full_name); // 读取一行最多49个字符3. 扫描集 (scanset) - 精确控制输入内容char vowels[10]; // 只接收元音字母 scanf(%[aeiouAEIOU], vowels); // 排除某些字符 char no_digits[50]; scanf(%[^0-9], no_digits); // 读取直到遇到数字 // 结合宽度限制 char limited[10]; scanf(%9[^\\n], limited); // 最多读取9个非换行符4. 跳过特定输入int day, month, year; // 输入格式: DD-MM-YYYY scanf(%d-%d-%d, day, month, year); // 跳过不想要的输入 int important_value; scanf(%*s %*s %d, important_value); // 跳过前两个字符串只读取第三个五、特殊技巧和注意事项1.printf标志组合使用int num 123; printf(%-10d, num); // 输出 123 左对齐显示正负号 printf(%#010x, num); // 输出 0x0000007b显示0x前缀用0填充2.scanf与printf的差异printf中的.precision在scanf中不起作用scanf中的width表示最大读取宽度而不是最小显示宽度scanf对于字符串输入会自动添加终止符\0十一、 自定义数据类型结构体 (struct)结构体其实就是把多个不同类型的数据“打包”组合成一个全新的复合类型。为什么要学结构体呢因为前面咱们学的那些“整型、浮点型、字符型”想去描述现实生活中的复杂事物还是稍显匮乏。现实中的很多东西往往很难靠单一的数据类型就描述清楚这时候结构体就应运而生了。结构体虽然不是咱们本次培训的核心但绝对是你们以后做项目时的常客。现在不展开讲不是因为它不重要一是时间确实有限二是我始终认为认识结构体最好的办法还是靠自己课下实践、亲自探究。所以这里咱们只抓最基础的内容带大家先入个门。// 定义结构体类型 struct Student { int id; char name[50]; float score; }; // 声明结构体变量 struct Student s1; struct Student s2 {1001, 张三, 95.5}; // 访问结构体成员 s1.id 1002; strcpy(s1.name, 李四); s1.score 88.5; // 结构体指针 struct Student *ptr s1; printf(学号%d\n, ptr-id); // 使用-访问成员类型重定义 (typedef)使用typedef为现有类型创建别名简化复杂类型的声明。// 为基本类型创建别名 typedef long long ll; typedef long double ld; // 为结构体创建别名 typedef struct { int x; int y; } Point; // 使用别名 ll count 10; Point p1 {0, 0};十二、 强制类型转换强制类型转换允许显式地将一种数据类型转换为另一种类型。基本语法结构(目标类型)表达式使用案例int a 10, b 3; double result; // 整数除法 result a / b; // 3.0整数除法 result (double)a / b; // 3.333...强制转换后为浮点除法 // 指针类型转换 int x 100; void *ptr x; int *int_ptr (int*)ptr; // 将void指针转换为int指针 // 字符与整数转换 char c A; int code (int)c; // 65ASCII码注意事项1.精度丢失大类型转小类型可能导致数据丢失double d 3.99; int i (int)d; // i 3小数部分被截断2.符号问题有符号与无符号类型转换需谨慎int i -1; unsigned int u (unsigned int)i; // 很大的正数3.指针转换不同类型的指针转换可能导致未定义行为内容总结本节涵盖了C语言中数据的基础概念从存储本质到具体使用是理解程序如何运作的基石。后续内容将基于这些概念展开。