C语言变量与常量

news2024/10/6 16:28:52

跟着肯哥(不是我)学C语言的变量和常量、跨文件访问、栈空间
栈空间还不清楚,期待明天的课程内容

C变量

变量(Variable)是用于存储和表示数据值的名称。
主要包括四个环节:定义、初始化、声明、使用
在我刚学C语言的时候,看的网课就专门强调了定义、声明和初始化。
在看这次学习营内容的时候,我对这些内容也已经很模糊了。
变量的定义是指在使用前对变量进行声明和初始化的过程。
也就是说,存在包含关系:

关于声明和初始化,我还记得当初学的时候,老师专门强调了这俩不是一回事。

变量定义

定义包括三部分:变量类型、变量名和初始值(可选)

  • 如果没有初始值,那就是声明
  • 如果有初始值,那就是初始化

变量类型(Variable Type)指定了变量所存储数据的类型和大小。

也就是我们熟知的intdouble那些东西。
根据昨天的学习内容,布尔类型的关键字不是bool,而是_Bool。(我在此之前都以为是bool)。‍

变量名(Variable Name)是给变量起名称,用于在程序引用该变量:由字母、数字、下划线组成,首字符不能是数字,不能与C语言内置关键字重名。

sizeof是一个关键字,不是运算符,也就是说它不是函数,它是在编译时就计算出结果的而不用等待运行时。
C语言内置关键字是不包含malloc的。因为学数据结构的时候经常用到,我之前以为它是的。

初始值(Initial Value)是可选的,用于给变量赋予一个初始值。如果在定义时没有提供初始值,变量将有一个未知的、未初始化的值。此时,变量的值是不确定的,需要在使用前对其进行赋值。

为了避免未初始化带来的问题,建议是:

  • 初始化:单文件内使用时
  • 声明:在跨文件定义、使用变量时

变量作用域

块作用域、函数作用域、文件作用域、全局作用域。
内层的作用域会隐藏外层的作用域。
下面这个例子除了文件作用域都用上了:
image.png
变量还有个“先声明,后使用”的问题。平时写代码的时候,只要在使用之前定义,就不会出问题。
在学着给51单片机写代码的时候,就出现问题了:变量的定义要放在整个代码块的最前面,否则无法通过编译。

int main() {
    int a=0;
    a=1;
    int b=0;
    b=1;
    return 0;
}

上面的代码在C98老版本之前时无法通过编译的。
正确做法应该是把可能用到的定义,一起放到前面:

int main() {
    int a=0;
    int b=0;
    a=1;
    b=1;
    return 0;
}

在老版本,即使是for循环括号里的第一个参数,也不能定义变量。现在的版本是允许的。
根据我做题的经验,这也是件好事,提醒自己一个良好的代码规范。在做算法题的时候,如果在for内定义变量,可能会出现频繁的申请释放,导致运行时间较长。

C常量

常量的值在程序执行过程中不能改变,是不可变的;这也是与变量的最大区别。

常量使用

常量使用方法有两种:直接使用、定义后使用

无需定义,直接使用:

int a = 1;
int b = 2;
int c;
c = a + b + 10; // 这个10其实就是一个常量

10是常量这件事情,初学的时候当耳旁风了。现在回头专门说明这么一件事,才回想起来。

常量定义

与变量定义类似,不同的是常量定义需要用const关键字修饰。
这种方式将常量定义为具有特定类型和常量性质的变量,并使用const关键字标识。

const float PI = 3.14159;

这种方法定义的常量具有类型,可以直接参与表达式的计算和类型检查。
之前不理解为什么要有常量,使用很不方便。而且已经有define了,为什么还要有const。或许支持类型检查就是原因之一。
还有一种很少在课本上出现的定义方式:枚举enum
image.png
可以看出,枚举实际上也是一个int类型。
无论是const还是enum,都要遵循“先声明后使用”的原则。

常量的作用

避免魔法数

通过使用常量来表示特定的数值或字符,可以避免在代码中直接使用未经解释的“魔法数”。
我也是第一次听说这个词,意思是难以理解的数字。
image.png

优化内存和存储

定义为常量的代码可能会直接纳入以Flash为存储媒介的ROM中,从而节省了宝贵的RAM空间。(肯哥原话)
期待即将学到的RAM/ROM的内容。

define

包括我看的网课跟实体书,讲常量的时候都会把#define作为一种常量定义方式。
#define的本质是文本替换,是一个宏定义的行为,并不是定义变量的行为

多文件编写

之前了解的多文件只是:头文件放结构体定义和函数声明,一个源文件放具体的函数定义,在用到这些函数的其他源文件中直接包含头文件即可。
但不清楚怎么共享变量。虽然了解过extern,但感觉这样耦合度太高,很容易出问题。
下面是肯哥讲的利用头文件共享变量的方式:

下面是肯哥原话

全局变量、常量:全局变量是在一个文件中定义,但在其他文件中声明的变量。通过在其他文件中使用extern关键字声明该变量,就可以在其他文件中访问该全局变量。需要注意的是,全局变量对于整个程序是可见的,因此需要小心处理全局变量的使用,以防止命名冲突或意外修改。
头文件:可以头文件来共享变量的定义和声明。在一个头文件中定义变量,然在多个文件中包含该头文件,以实现对变量的访问。,应在一个文件中进行变量的实际定义,而在其他文件中只进行声明。
例如,在共享变量的头文件中声明一个变量:

// shared.h
extern int x // 只声明变量x
// 可以在其他文件中包含该头文件,以便访问变量x

然后,在一个源文件中定义该变量:

// file1.c
#include "shared.h"
int x = 10;

在其他源文件中包含头文件,即可访问(使用)该变量:

// file2.c
#include "shared.h"
// 可以在该文件中访问变量x

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1221619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

gorm的简单操作

1. 什么是orm ORM全称是:Object Relational Mapping(对象关系映射),其主要作用是在编程中,把面向对象的概念跟数据库中表的概念对应起来。举例来说就是,我定义一个对象,那就对应着一张表,这个对象的实例&a…

LabVIEW编程开发NI-USRP

LabVIEW编程开发NI-USRP 可编程性是SDR的关键特性,它使人们能够将无线电外围设备转换为先进的无线系统。USRP是市场上最开放、最通用的SDR,可帮助工程师在主机和FPGA上使用各种软件开发工具构建系统。 有多种选项可用于对基于SDR的系统的主机进行编程。…

wpf devexpress Property Gird管理集合属性

Property Grid允许你添加,浏览和编辑集合属性

【2022改良版】学法减分助手PRO小程序源码

【2022改良版】学法减分助手PRO小程序源码 ,交管推出个学法减分,每个驾驶员可以把被扣的6分,以看视频答题的形式学习回来,然后答题这个一共二十道题每道题60秒, 有好多人不会,用咱们的小程序就可以模拟练习…

鸿蒙开发|鸿蒙系统项目开发前的准备工作

文章目录 鸿蒙项目开发的基本流程介绍鸿蒙项目开发和其他项目有什么不同成为华为开发者-注册和实名认证1.登录官方网站 鸿蒙项目开发的基本流程介绍 直接上图,简单易懂! 整个项目的开发通过4个模块进行:开发准备、开发应用、运行调试测试和发…

Typora for Mac:打造全新文本编辑体验

Typora for Mac是一款与众不同的文本编辑器,它不仅拥有直观易用的界面,还融合了Markdown语法和富文本编辑的功能,为用户带来了前所未有的写作和编辑体验。 一、简洁明了的界面设计 Typora for Mac的界面简洁明了,让用户可以专注…

解决更换NodeJs版本后npm -v返回空白

一、问题描述 win11电脑上输入cmd进入控制台,输入 node --version 有正常返回安装的nodejs的版本号 再输入 npm -v 返回空白。正常情况应该是要返回版本号。 二、问题背景 最近准备学习vue,在不久前已经安装了NodeJs和python。运行了好几个开源项…

2023年11月15号期中测验判断题(Java)

1-1 局部变量可以与成员变量重名。 正确答案:T 解释: 局部变量可以和成员变量重名,通常,为了区分局部变量和成员变量,会使用this关键字(C称this指针,python是self关键字)来特别声…

vim模式用法总结

0.前言 我们用gcc编译文件的时候,如果发生了下面的错误,那么如何用vim打开的时候就定位到? 我们可以知道,这是第6行出现了错误; 所以我们使用vim打开的时候多输入个这个,我们就可以快速定位了 vim test.c 6…

centos7 killall命令安装、使用

安装 在线安装命 输入下面命令 yum install psmisc -y Psmisc软件包包含三个帮助管理/proc目录的程序。 安装下列程序: fuser, killall,pstree和pstree.x11(到pstree的链接) fuser #显示使用指定文件或者文件系统的进程的PID。 killall #杀死某个名字的进程,它…

【咖啡品牌分析】Google Maps数据采集咖啡市场数据分析区域分析热度分布分析数据抓取瑞幸星巴克

引言 咖啡作为一种受欢迎的饮品,已经成为我们生活中不可或缺的一部分。随着国内外咖啡品牌的涌入,新加坡咖啡市场愈加多元化和竞争激烈。 本文对新加坡咖啡市场进行了全面的品牌门店数占比分析,聚焦于热门品牌的地理分布、投资价值等。通过…

react antd下拉选择框选项内容换行

下拉框选项字太多,默认样式是超出就省略号,需求要换行全展示,选完在选择框里还是要省略的 .less: .aaaDropdown {:global {.ant-select-dropdown-menu-item {white-space: pre-line !important;word-break: break-all !important;}} } html…

CTF-PWN-堆- 【off-by-one】

文章目录 堆的off-by-one利用思路Asis CTF 2016 b00ks libc 2.31IDA源码main输入名字creat函数dele函数edit函数print函数reeditor name函数 思路exp思路 堆的off-by-one off-by-one指的是单字节缓冲区溢出(off-by-one 是可以基于各种缓冲区的,比如栈、…

Java编程中,异步操作流程中,最终一致性以及重试补偿的设计与实现

一、背景 微服务设计中,跨服务的调用,由于网络或程序故障等各种原因,经常会出现调用失败而需要重试。另外,在异步操作中,我们提供接口让外部服务回调。回调过程中,也可能出现故障。 这就要求我们主动向外…

Redis篇---第二篇

系列文章目录 文章目录 系列文章目录前言一、为什么 使用 Redis 而不是用 Memcache 呢?二、为什么 Redis 单线程模型效率也能那么高?三、说说 Redis 的线程模型前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这…

最新自动定位版本付费进群系统源码

更新内容: 1.在网站首页增加了付款轮播功能。 2.新增了城市定位功能,方便用户查找所在城市的相关信息。 3.对域名库及支付设置进行了更新和优化。 4.增加了一种图模板设置模式,简化了后台模板设置流程。 5.此外还进行了前后台的其他优化…

音频类型转换工具-可执行文件exe/dmg制作

朋友车载音乐需要MP3格式,想要个批量转换工具 准备工作 brew install ffmpeg --HEAD或者官网下载安装ffmpeg并配置环境conda install ffmpeg 或者pip install ffmpeg-python 音频类型转换程序.py文件 exe文件在windows下打包,dmg在macos下打包&#…

Springboot更新用户密码

UserController PatchMapping("/updatePwd")//RequestBody注解&#xff0c;mvc框架才能自动的去读取请求体里的json数据&#xff0c;转换成map集合对象public Result updatePwd(RequestBody Map<String,String> params){//1.校验数据String oldPwd params.get…

IIC协议保姆级教学

目录 1.IIC协议概述 2.IIC总线传输 3.IIC-51单片机应用 1.起始信号 2.终止信号 3.应答信号 4.数据发送 4.IIC-32单片机应用 用到的库函数&#xff1a; 1.IIC协议概述 IIC全称Inter-Integrated Circuit (集成电路总线)是由PHILIPS公司在80年代开发的两线式串行总线&am…

将 ONLYOFFICE 文档编辑器与 Node.js 应用集成

我们来了解下&#xff0c;如何将 ONLYOFFICE 文档编辑器与您的 Web 应用集成。 许多 Web 应用都可以从文档编辑功能中获益。但是要从头开始创建这个功能&#xff0c;需要花费大量时间和精力。幸运的是&#xff0c;您可以使用 ONLYOFFICE——这是一款开源办公套件&#xff0c;可…