【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… 元。 你能精确对应的只有前几位,后面总是会有换算产...
【C语言】屎山代码补救
屎山代码补救我写过一个屎山代码 - Hexo,一直不愿意面对。这不要期末了吗,我找了 重庆没电大学 的C语言往年真题开始刷结果您猜怎么着,我碰见一个题目,恰好就是我屎山代码的解药!直接看吧: 123456789101112131415161718#include<stdio.h>void Fun(int x);void main() { int a = 12; printf("%d=", a); Fun(a);}void Fun(int x) { int i; for (i = 2; i < x; i++) { if (x % i == 0) { printf("%d * ", i); Fun(x / i); return; } } printf("%d", x);} 这个代码利用递归调用,很好地实现了质因数分解,仅仅只花了18行这里的return很有趣 😊,试试将return注释掉,运行一下看吧👉v...
【C语言】一维数组地址
一维数组地址一维背景123假设有int a[5],请问表示数组a中首元素的地址是什么?A: aB: &a 答案: a 深究数组地址:一、取地址运算符 &1int a; 如果 a 是一个 int 类型的变量,那么 &a 的结果类型是 int \*(读作:指向 int 的指针) 怎么理解 & 符号?你可以把它当成一个动作 。 a:代表“** 变量里的值**”(在这个房间里住着谁?)。 &a:代表“** 变量的地址**”(这个房间的门牌号是多少?)。 &a是一个地址,是什么类型的?是 int * 而不是 int虽然“地址”看起来像是一串数字(比如 6422300),在物理上它确实是个整数,但在 C 语言的规则里,它属于指针类型 。 二、怎么打印地址?用什么符号打印?新知识: %p就像用 %d 来打印整数(d ecimal),用 %f 来打印小数(f loat)一样: %p 是专门用来打印指针(Pointer)/地址 的占位符。 它有什么特别的? 如果你用 %d 打印地址,它会显示成一个很长很乱的负数或整数。而 ...


