「C系列」C 变量及常见问题梳理
文章目录
- 一、C 变量
- 1. 整数变量
- 2. 浮点数变量
- 3. 字符变量
- 4. 字符串变量(在C中,通常使用字符数组来表示字符串)
- 二、C 变量-常见问题
- 1. 变量未初始化
- 2. 变量类型不匹配
- 3. 变量作用域问题
- 4. 变量命名冲突
- 5. 变量越界访问
- 6. 变量声明位置
- 7. 变量的生命周期
- 8. 变量的命名规范
- 9. 变量类型选择不当
- 10. 指针变量使用不当
- 三、相关链接
一、C 变量
在C语言中,变量是用于存储数据的内存位置。你可以定义不同类型的变量,如整数、浮点数、字符等。以下是一些C语言中变量的定义和使用的详细案例代码。
1. 整数变量
#include <stdio.h>int main() {// 定义整数变量int a, b, sum;// 赋值a = 10;b = 20;// 计算和sum = a + b;// 打印结果printf("The sum of %d and %d is %d\n", a, b, sum);return 0;
}
2. 浮点数变量
#include <stdio.h>int main() {// 定义浮点数变量float pi = 3.14159;float radius, area;// 赋值radius = 5.0;// 计算圆的面积area = pi * radius * radius;// 打印结果printf("The area of the circle with radius %.2f is %.2f\n", radius, area);return 0;
}
3. 字符变量
#include <stdio.h>int main() {// 定义字符变量char ch;// 赋值ch = 'A';// 打印字符printf("The character is: %c\n", ch);// 打印字符的ASCII值printf("The ASCII value of the character is: %d\n", (int)ch);return 0;
}
4. 字符串变量(在C中,通常使用字符数组来表示字符串)
#include <stdio.h>int main() {// 定义字符串变量(实际上是字符数组)char greeting[50] = "Hello, World!";// 打印字符串printf("%s\n", greeting);// 修改字符串(注意:确保不要超出数组的大小)greeting[7] = 'C';printf("%s\n", greeting); // 输出 "Hello, C!"return 0;
}
注意:在C语言中,字符串是以字符数组的形式存储的,并且以null字符(\0)结尾。因此,在定义字符串时,通常要为null字符分配额外的空间。在上面的例子中,我们分配了50个字符的空间,但实际上只使用了13个字符(包括null字符)。
二、C 变量-常见问题
在使用C语言的变量时,初学者常常会遇到一些问题。下面列举了一些常见问题及其相应的案例代码,并给出了解释。
1. 变量未初始化
问题描述:在使用变量前未对其进行初始化,导致变量中存储的是不确定的值(垃圾值)。
案例代码:
#include <stdio.h>int main() {int a;printf("The value of a is: %d\n", a); // 这里的a是未初始化的,输出可能是任意值return 0;
}
解决方法:在定义变量时初始化它。
#include <stdio.h>int main() {int a = 0; // 初始化a为0printf("The value of a is: %d\n", a);return 0;
}
2. 变量类型不匹配
问题描述:将一种类型的值赋给另一种类型的变量,导致数据丢失或错误。
案例代码:
#include <stdio.h>int main() {int a = 3.14; // 尝试将浮点数赋给整数变量,小数部分会被丢弃printf("The value of a is: %d\n", a); // 输出3return 0;
}
解决方法:确保赋值时类型匹配,或者使用类型转换。
#include <stdio.h>int main() {float b = 3.14; // 使用浮点数变量来存储3.14int a = (int)b; // 如果需要转换为整数,则显式地进行类型转换printf("The value of a (after conversion) is: %d\n", a); // 输出3printf("The value of b is: %f\n", b); // 输出3.140000return 0;
}
3. 变量作用域问题
问题描述:在函数外部定义的变量(全局变量)和函数内部定义的变量(局部变量)之间可能会发生冲突,导致意料之外的结果。
案例代码:
#include <stdio.h>int x = 10; // 全局变量void func() {int x = 20; // 局部变量printf("The value of x inside func is: %d\n", x); // 输出20
}int main() {printf("The value of x outside func is: %d\n", x); // 输出10func();// 在func()之后,全局变量x的值仍然是10printf("The value of x outside func after calling func is: %d\n", x); // 输出10return 0;
}
解决方法:避免在函数内部使用与全局变量同名的局部变量,或者明确知道哪个变量正在被使用。
4. 变量命名冲突
问题描述:在不同的作用域或头文件中使用了相同的变量名,导致编译错误或链接错误。
案例代码(假设有两个不同的文件):
// file1.c
#include <stdio.h>
int x = 10;// file2.c
#include <stdio.h>
extern int x; // 声明外部变量x,假设它在file1.c中定义
int x = 20; // 错误:在file2.c中重新定义了x// ... 其他代码 ...
解决方法:确保在不同的作用域或文件中使用唯一的变量名。
5. 变量越界访问
问题描述:访问数组或其他数据结构时超出了其定义的范围,可能导致数据损坏或程序崩溃。
案例代码:
#include <stdio.h>int main() {int arr[5] = {1, 2, 3, 4, 5};printf("The value at index 5 is: %d\n", arr[5]); // 错误:越界访问,可能导致未定义行为return 0;
}
解决方法:始终确保在访问数组或其他数据结构时索引在有效范围内。
6. 变量声明位置
问题描述:在C99标准之前,变量必须在函数体(或代码块)的开始处声明。在C99及之后的版本中,可以在需要的地方声明变量,但混用这两种风格可能导致代码可读性下降。
案例代码(C90风格):
#include <stdio.h>int main() {int a, b, sum;a = 10;b = 20;sum = a + b;printf("The sum is: %d\n", sum);return 0;
}
案例代码(C99及以后风格):
#include <stdio.h>int main() {int a = 10;int b = 20;int sum = a + b;printf("The sum is: %d\n", sum);return 0;
}
7. 变量的生命周期
问题描述:变量的生命周期是指变量在内存中存在的时间。局部变量在函数执行完毕后会被销毁,而全局变量和静态变量则在整个程序执行期间都存在。
案例代码:
#include <stdio.h>int globalVar = 10; // 全局变量,生命周期为整个程序void func() {static int staticVar = 20; // 静态局部变量,生命周期为整个程序int localVar = 30; // 局部变量,生命周期为函数执行期间printf("Inside func: globalVar = %d, staticVar = %d, localVar = %d\n", globalVar, staticVar, localVar);
}int main() {printf("Before func: globalVar = %d\n", globalVar);func();printf("After func: globalVar = %d, staticVar (not accessible here) = ?, localVar (not accessible here) = ?\n", globalVar);return 0;
}
8. 变量的命名规范
问题描述:虽然C语言没有强制的命名规范,但遵循一定的命名规范可以提高代码的可读性和可维护性。
推荐规范:
- 变量名应使用有意义的名称。
- 变量名可以使用小写字母、数字和下划线,但通常以小写字母开头。
- 避免使用与C语言关键字同名的变量名。
9. 变量类型选择不当
问题描述:选择了不适当的变量类型来存储数据,可能导致数据溢出、精度损失或其他问题。
案例代码:
#include <stdio.h>int main() {unsigned int age = -1; // 错误:尝试将负数赋值给无符号整数,可能导致意外的结果printf("Age: %u\n", age); // 输出可能不是-1,而是非常大的数return 0;
}
10. 指针变量使用不当
问题描述:指针变量是C语言中非常强大的工具,但如果不当使用,可能导致内存泄漏、野指针、空指针解引用等问题。
案例代码(野指针):
#include <stdio.h>int main() {int *ptr;printf("%d\n", *ptr); // 错误:ptr未初始化,指向未知的内存地址return 0;
}
在使用指针时,务必确保它们被正确初始化,并且在不再需要时释放其指向的内存(如果适用)。
三、相关链接
- Visual Studio Code下载地址
- Sublime Text下载地址
- 「C系列」C 简介
- 「C系列」C 基本语法
- 「C系列」C 数据类型
相关文章:
「C系列」C 变量及常见问题梳理
文章目录 一、C 变量1. 整数变量2. 浮点数变量3. 字符变量4. 字符串变量(在C中,通常使用字符数组来表示字符串) 二、C 变量-常见问题1. 变量未初始化2. 变量类型不匹配3. 变量作用域问题4. 变量命名冲突5. 变量越界访问6. 变量声明位置7. 变量…...
<网络安全VIP>第二篇《工业控制软件》
1 PLC PLC,(Programmable Logic Controller),可编程逻辑控制器(PLC)是种专门为在工业环境下应用而设计的数字运算操作电子系统。 2 DCS 四、DCS的发展趋势 一、DCS的基本定义 DCS是分布式控制系统(Distributed Control System)的英文缩写,在国内自控行业又称之为集…...
微服务:Rabbitmq中的不同交换机的使用Fanout、Direct、Topic(消息队列中间件)
文章目录 发布订阅Fanout 交换机Direct 交换机Topic 交换机通配符规则 发布订阅 在这里插入图片描述 Fanout 交换机 Fanout 交换机会将收到的消息路由到每一个跟其绑定的queue上。 我们做一个交换机,两个队列,两个消费者分别连接两个队列。 定义交换…...
数据结构单链表的前插法实现
单链表的前插法实现可以通过以下步骤进行: 创建一个新的节点,并将要插入的元素存储在新节点的数据域中。 将新节点的指针域指向原链表的头节点。 将原链表的头节点指向新节点。 具体代码实现如下所示: class Node:def __init__(self, da…...
Cocos Creator开发学习路线
1.JavaScript与TypeScript程序设计 由于可以跨平台发布,同时要能支持h5的游戏,cocos creator选择了JavaScript与TypeScript来做为它的开发语言,所以我们要先学习JavaScript与TypeScript。TypeScript是基于JavaScript的一个语法糖,运行的时候被编译为JavaScript,所以我们要…...
C语言:IO操作
引言 I/O操作是一切实现的基础。IO即为input &output 标准IO(stdio) FILE类型贯穿始终,FILE是由typedef定义出来的 vii /usr/include/asm-generic/errno-base.h (errno定义的位置) /usr/include/x86_64-linux-gnu/bits/types/struct…...
算法 | 刷题日记
1.递归通常是用栈来实现的 递归在其本质上是通过函数调用栈(Call Stack)来实现的,而不是队列(Queue)。当你调用一个函数时,该函数的局部变量、参数和返回地址会被压入(push)到一个由…...
微信小程序登录接口
微信小程序登录,实现思路分析: 用户触发登录操作:用户在微信小程序中点击“登录”按钮,触发登录流程。调用微信登录接口:小程序端调用微信提供的登录接口(如wx.login),获取临时登录…...
VBA实战(Excel)(5):介绍一种排列组合算法
1. 需求场景 有多个条件,条件个数不定,每个条件有若干种情况,情况个数不定,输出所有条件可能的情况的排列组合。 2.举例 假设第一次有5个情况要填,第一个条件20种情况,第二个5种,第三个40种&…...
迭代器的使用
参考: 生成器迭代器next函数 迭代器的使用 说到迭代器就必须先要提一下可迭代对象(iterable),可迭代对象是能够逐一返回其成员项的对象。可迭代对象包括序列类型(如list、str、tuple)和非序列类型&#…...
安卓手机APP开发___广播概述
安卓手机APP开发___广播概述 目录 概述 关于系统广播 系统广播所发生的更改 接收广播 清单声明的接收器 上下文注册的接收器 对进程状态的影响 发送广播 通过权限限制广播 带权限的发送 带权限的接收 安全注意事项和最佳做法 概述 Android 应用可以通过 Android …...
【封装】Unity切换场景不销毁物体
在切换场景时,如果物体不需要销毁,可以直接使用下方脚本 代码 public class DontDestroyLoader : MonoBehaviour{ //所有不销毁的物体预制体[SerializeField] private GameObject[] dontDestroyPrefabs;//实例化预制体public void Load(){foreach (var …...
基于学习的决策树
基于学习的决策树概述 决策树是一种监督学习方法,广泛应用于分类和回归任务中。基于学习的决策树模型通过学习数据中的特征来构建树状结构,帮助做出决策。以下是对基于学习的决策树的详细介绍,包括其基本概念、工作流程、构建算法、优势和挑…...
godot.bk2
1.$node_name 其实 就是 get_node 的语法糖 2.场景内部用get_node,场景外部用信号 这是自定义信号的绑定,如果是内置信号,直接右键点击链接到一个函数即可 3.场景切换和摄像头一直居中 4.class_name命名一个类,extends继承&…...
STM32 IIC 使用 HAL 库操作eeprom
在STM32上通过I2C接口(注意:在标准STM32库中,I2C接口通常被写为"I2C"而不是"IIC")与EEPROM芯片通信时,你需要遵循I2C通信协议,并使用STM32的HAL库或标准外设库(如果适用&am…...
YOLOv8+PyQt5海洋船只检测(可以重新训练,yolov8模型,从图像、视频和摄像头三种路径识别检测)
1.效果视频:海洋船只检测yoloV8检测(https://mbd.pub/o/bread/mbd-ZpaYk55r)_哔哩哔哩_bilibili资源包含可视化的海洋船只检测系统,可对于高空拍摄到的海洋图片进行轮船检测,基于最新的YOLOv8训练的海洋船只检测模型&a…...
PCL 高阶多项式曲线回归拟合(二维)
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 高阶多项式曲线回归(Polynomial Regression)是一种线性回归模型的扩展,它允许数据拟合一个非线性的曲线。虽然多项式本身是非线性的,但我们可以通过引入新的变量(例如,原始变量的平方、立方等)来将问题转化为…...
深入理解 Python3 函数:从基础语法到高级应用
Python3 函数是构建模块化代码的基本单位,允许我们将代码组织成独立的、可重用的块。本文将详细介绍 Python3 函数的基本语法、常用命令、示例、应用场景、注意事项,并进行总结。 基本语法 在 Python 中,函数的定义使用 def 关键字…...
03_初识Spring Cloud Gateway
文章目录 一、网关简介1.1 网关提出的背景1.2 网关在微服务中的位置1.3 网关的技术选型1.4 补充 二、Spring Cloud Gateway的简介2.1 核心概念:路由(Route)2.2 核心概念:断言(Predicate)2.3 核心概念&#…...
python数据分析——线性模型
参考资料:活用pandas库 1、简单线性回归 线性回归的目标是描述响应变量(或“因变量”)和预测变量(也称“特征”、“协变量”、“自变量”)之间的直线关系。本例中将讨论tips数据集中的total_bill对tip的影响。 # 导入…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...
