【C语言】数组初始化
数组初始化正确答案是:第二个选项(可在程序编译阶段得到初值0)以下是详细解析: static 关键字的作用: 在 C 语言中,使用 static 修饰的变量(无论是局部变量还是全局变量)存储在静态存储区 。 静态存储区的变量拥有静态存储期 (Static Storage Duration),这意味着它们在程序的整个运行期间都存在。 默认初始化规则: 对于静态存储期的变量(包括 static 局部变量和所有全局变量),如果在定义时没有显式地赋初值,编译器会自动将它们初始化为 0 (对于数值型)或 NULL (对于指针)。 因此,数组 a 中的所有元素都会被自动初始化为 0。这排除了选项 “不能得到确定的初值”。 初始化的时机(编译 vs 运行): 在 C 语言的理论和传统教学考试中,静态变量的初始化被认为是在“编译阶段”完成的 。 这意味着编译器在生成可执行文件时,就已经为这些变量分配了空间并在数据段(如 .bss 段或 .data 段)中记录了初始值。这与局部自动变量(auto)不同,后者是在程序运行进入函数、在栈上分配内存时才进行初始化的(即“运行时”)。 那没...
【C语言】格式化输出
格式化输出一、输出整数时在 printf 函数中,% 和 d 中间的那个数字(例如 %2d、%5d)代表最小输出宽度(Minimum Field Width) 。简单来说,就是**“给这个数字预留几个坑位”** 。具体规则如下,分两种情况: 1. 数字长度 < 设定宽度(补空格)如果实际数字的位数少于 你设定的宽度,C 语言会在左边补空格 ,让它凑够宽度(默认右对齐)。 例子 :printf("start%5dend", 123); 数字 :123(3 位) 设定 :%5d(5 位) 结果 :start 123end (注意123 前面有两个空格,凑成了 5 位) 2. 数字长度 ≥ 设定宽度(按原样输出)这是新手最容易误解的地方:如果实际数字的位数多于 或等于 你设定的宽度,C 语言不会截断数据 ,而是自动突破限制 ,完整打印出所有数字。 例子 :printf("start%2dend", 12345); 数字 :12345(5 位) 设定 :%2d(2 位) 结果 :start12345end (为了保证数据正确,宽度限制失...
【C语言】八进制
八进制先看题目:答案 :A以下是详细的解题步骤分析: 解题思路1. 理解变量赋值: 代码语句:char x = 040; 在 C 语言中,以数字 0 开头的数字表示八进制(Octal) 数。 我们需要先算出它的十进制值: 八进制 040 = $4 \times 8^1 + 0 \times 8^0 = 32$(十进制)。 所以,变量 x 此时存储的数值是十进制的 32 。 2. 执行位运算: 代码表达式:x << 1 这是左移运算符(Left Shift) ,将二进制位向左移动 1 位。 在数学上,左移 1 位等同于乘以 2: $32 \times 2 = 64$(十进制)。 或者从二进制角度看: 32 的二进制是 0010 0000 左移一位变成 0100 0000(即十进制的 64)。 3. 格式化输出: 代码语句:printf("%o\n", ...) 格式控制符 %o 表示以八进制 形式输出整数。 现在的运算结果是十进制的 64 ,我们需要将其转换回八进制: $64 \div 8 ...
【C语言】结构体
结构体从4个阶段理解第一阶段:为什么要用结构体?想象一下,你要编写一个程序来管理学生信息 。每个学生有:姓名、年龄、分数。如果不使用结构体,你可能需要这样定义变量: 1234567char name1[20] = "Zhang San";int age1 = 18;float score1 = 85.5;char name2[20] = "Li Si";int age2 = 19;float score2 = 92.0; 痛点: 数据零散 :name1 和 age1 在逻辑上属于同一个人,但在代码中它们是毫无关系的独立变量。 管理困难 :如果有100个学生,你得定义300个变量,甚至建立3个独立的数组。一旦要通过函数传递一个学生的信息,你需要传3个参数。 解决方案: 我们需要一种机制,能够把不同类型的数据 (char, int, float)打包到一个“盒子”里。这个“自定义的盒子类型”,就是结构体(Structure) 。 第二阶段:结构体的定义与创建结构体的学习分为两步:先画图纸 (定义类型),再盖房子 (定义变量)。 1. ...
【C语言】二维数组地址
二维数组地址一、思考答案: a 二、二维数组地址的表示方法假设我们定义了一个二维数组: 12int a[3][4]; // 3行4列,系统分配了 3*4=12 个连续的整数空间 第一层:行地址 (a) 含义 :a 被视为一个行指针 。它指向二维数组的第0行 (即把一整行看作一个单位)。 类型 :int (*)[4] (指向包含4个整数的数组的指针)。 步长(+1的效果) :如果你执行 a + 1,地址会跳过整整一行 (跳过 4 个 int,即 16 字节),直接指向第1行的起始位置。 第二层:列地址/首元素地址 (a[0] 或 *a) 含义 :a[0] 代表第0行的一维数组名 。数组名代表首元素地址。所以它指向第0行第0个元素 。 类型 :int * (指向单个整数的指针)。 步长(+1的效果) :如果你执行 a[0] + 1,地址只会跳过一个元素 (跳过 1 个 int,即 4 字节),指向 a[0][1]。 理解*a :a表示首行的地址,*a解地址解出来的就是这一行的元素,自然而然就来到的这一行的首地址 有: 12int a[3][4];int b[4]; ...
【C语言】自编strcmp的标准写法
自编strcmp的标准写法背景我自己写的strcmp函数比较笨,闹出笑话是小事,真的不会写才是大事所以我决定纠正一下: 代码实现:123456789101112131415// 自定义字符串比较函数int MyStrcmp(char *s, char *t) { // 当s和t指向的字符相等时,继续循环 while (*s == *t) { // 如果当前字符是结束符 '\0',说明两个字符串同时结束且完全相等 if (*s == '\0') { return 0; } // 指针后移,比较下一个字符 s++; t++; } // 循环结束说明遇到了不相等的字符,返回两者的差值 return *s - *t;} 巧妙地运用了指针,指针的移动反正非常标准,你就学吧
【C语言】写出最短的代码
写出最短的代码背景:今天我在学校练习系统里面遇到了一个实验题 123456(语言: C)第六章实验题:编写函数计算1-1/3+1/5-1/7+…的值,直至最后一项的绝对值<0.001提示:输出结果的最后两位是97输入:无输出提示:"result="输出格式:"%f" 代码实现我非要使用递归调用,这是我第一次写的代码: 123456789101112131415161718#include <stdio.h>#include <math.h>float Function() { static int count = 1, i = 1; i = (abs(i) + 2) * pow(-1, count++); if (fabs(1.0 / i) < 1e-3) { return 1.0 / i; } else { return 1.0 / i + Function(); }}int main(void) { printf("...
【C语言】指针的定义
指针的定义定义一个指针:1char *p 1char*p 哪个写法正确?两个写法在语法上都是完全正确的。 编译器根本不在乎空格放在哪里,它甚至允许你写成 char*p(中间没空格)。但是,学习C语言,应该使用第一种写法: ✅ 推荐写法:char *p;为什么?这里有一个 C 语言中非常著名的**“视觉陷阱”** 。 1. 为什么 char* p 容易坑人?如果你习惯写 char* p,你的大脑会认为 char* 是一个整体(一种叫“字符指针”的数据类型)。当你只定义一个变量时,没问题: 1char* p; // 没问题,p 是指针 但是 ,当你一行定义两个变量时,陷阱就出现了: 1char* p, q; 你的直觉可能告诉你:p 和 q 都是指针。 实际情况是: p 是指针 (char *) q 仅仅是一个普通的字符 (char) 😱 因为在 C 语言的语法规则里,\* 号是跟变量名绑定的,不是跟类型名绑定的。 2. 为什么推荐 char *p ?这种写法更符合 C 语言的底层逻辑: 1char *p; 这句话的意思是:\*p 是一个 char。 (翻译...
【C语言】C语言规范
C语言规范一、花括号{}的省略 省略花括号的唯一核心原则 是: 核心原则:控制语句下方只有「一条语句」时当 if、else、for、while 或 do...while 的控制范围内只有紧随其后的第一条语句 时,花括号 {} 可以省略。 二、缩进(tab)影不影响运行完全不影响。在 C 语言中,换行符、空格、Tab(制表符) 统称为“空白字符”(Whitespace)。对于编译器(翻译代码给电脑听的程序)来说,这些全是透明的,它根本不在乎 。缩进(按 Tab)的核心作用是表现逻辑的层级关系 。 如果不缩进: 就像读一篇没有标点、没有段落的文章,你很难一眼看出来哪个 if 管着哪行代码,哪个括号匹配哪个括号。 缩进后: 你一眼就能看出:“哦,这行 printf 是属于 for 循环里面的子动作”。 坚持缩进: 虽然不影响运行,但一定要养成层级对齐的好习惯 。这是程序员的“脸面”。通常只要遇到 {,下一行就开始缩进(按一次 Tab)。遇到 },缩进就退回一级。使用自动格式化工具: 你不需要手动敲空格对齐。绝大多数写代码的软件都有“一键排版”功能: VS Code: 按 Shi...
【C语言】float和double的爱恨情仇
float和double的爱恨情仇 特性 float (单精度) double (双精度) 内存占用 4 字节 (32 bit) 8 字节 (64 bit) 有效数字 约 6 ~ 7 位 约 15 ~ 16 位 精度评价 够用,但容易有误差 非常准 ,默认推荐 C语言写法 float x = 1.23f; double x = 1.23; 输入/输出 %f %lf (输入时必须用, 输出可用%f) 一、为什么是“约 6~7 位”?C 语言很严谨,但**“二进制”和“十进制”无法完美互译** 。底层逻辑: float 在计算机里有 23 个二进制位 用来存有效数字。 2 的 23 次方是 8,388,608。 你看,838万 这是一个 7 位数 。这意味着 float 能把大部分 7 位以内的整数分得清清楚楚。 但是,一旦超过这个范围,或者涉及到某些特定的小数,二进制位就不够用了。 比喻: 这就好比用“美元”去换“人民币”。 你有 1.00 美元。 汇率算下来可能是 7.234567… 元。 你能精确对应的只有前几位,后面总是会有换算产...

