「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的影响。 # 导入…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...