C语言变量与常量

跟着肯哥(不是我)学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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springcloud新闻发布系统源码

开发技术: jdk1.8,mysql5.7,nodejs,idea,vscode springcloud springboot mybatis vue elementui 功能介绍: 用户端: 登录注册 首页显示搜索新闻,新闻分类,新闻列表…

IDEA 集成 Docker 插件一键部署 SpringBoot 应用

目录 前言IDEA 安装 Docker 插件配置 Docker 远程服务器编写 DockerFileSpringBoot 项目部署配置SpringBoot 项目部署结语 前言 随着容器化技术的崛起,Docker成为了现代软件开发的关键工具。在Java开发中,Spring Boot是一款备受青睐的框架,然…

二分查找和二分答案

【深基13.例1】查找 题目描述 输入 n n n 个不超过 1 0 9 10^9 109 的单调不减的(就是后面的数字不小于前面的数字)非负整数 a 1 , a 2 , … , a n a_1,a_2,\dots,a_{n} a1​,a2​,…,an​,然后进行 m m m 次询问。对于每次询问&#x…

高济健康:数字化科技创新与新零售碰撞 助推医疗产业优化升级

近日,第六届中国国际进口博览会在上海圆满落幕,首次亮相的高济健康作为一家专注大健康领域的疾病和健康管理公司,在本届进博会上向业内外展示了围绕“15分钟步行健康生活圈”构建进行的全域数字化升级成果。高济健康通过数字化科技创新与新零…

Allure集成Testng

目录 前言 介绍 安装 集成Testng 查看allure报告 前言 本节我们会介绍如何安装allure,allure集成testng生成测试报告。 介绍 Allure是一个用于测试报告生成的开源框架,它支持多种测试框架,包括JUnit、TestNG、Cucumber等。Allure的目…

excel 自动向下填充数据

问题 excel里的数据是合并的 拆分之后 想自动填充下边的数据 看了好几种方式都不行 用代码实现 package com.alibaba.cainiao.controller;import org.apache.poi.ss.usermodel.*;import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOExceptio…

使用FP8加速PyTorch训练

现代的人工智能硬件架构(例如,Nvidia Hopper, Nvidia Ada Lovelace和Habana Gaudi2)中,FP8张量内核能够显著提高每秒浮点运算(FLOPS),以及为人工智能训练和推理工作负载提供内存优化和节能的机会。 在这篇文章中,我们将介绍如何修…

【Linux】线程控制

文章目录 线程的概念Linux下的进程Linux下的线程进程再理解Linux线程和接口的认识代码验证二级页表 页表线程的优点线程的缺点线程异常 线程的用途进程和线程的关系线程控制线程线程ID和LWP线程等待线程终止线程分离 线程ID及进程地址空间布局 线程的概念 我们知道&#xff0c…

全新小权云黑系统

小权云黑管理系统 V1.0 功能如下: 1.添加骗子,查询骗子 2.可添加团队后台方便审核用 3.在线反馈留言系统 4.前台提交骗子,后台需要审核才能过 5.后台使用光年UI界面 6.新增导航列表,可给网站添加导航友链 7.可添加云黑类型收录 8.…

基于STC12C5A60S2系列1T 8051单片的IIC总线器件模数芯片PCF8591实现模数转换应用

基于STC12C5A60S2系列1T 8051单片的IIC总线器件模数芯片PCF8591实现模数转换应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍IIC总线器件模数芯片PCF8591介绍通过I…

注解方式优雅的实现 Redisson 分布式锁

1前言 日常开发中,难免遇到一些并发的场景,为了保证接口执行的一致性,通常采用加锁的方式,因为服务是分布式部署模式,本地锁Reentrantlock和Synchnorized这些就先放到一边了,Redis的setnx锁存在无法抱保证…

asp.net健身会所管理系统sqlserver

asp.net健身会所管理系统sqlserver说明文档 运行前附加数据库.mdf(或sql生成数据库) 主要技术: 基于asp.net架构和sql server数据库 功能模块: 首页 会员注册 教练预约 系统公告 健身课程 在线办卡 用户中心[修改个人信息 修…

Modbus RTU 使用教程(modbus教程、modbus协议)

参考文章:这节课带你吃透Modbus通信协议 文章目录 Modbus RTU 使用教程第1部分:Modbus RTU 协议概述什么是Modbus RTU协议Modbus RTU的特点工作原理 第2部分:硬件和软件要求硬件要求软件要求 第3部分:Modbus RTU数据结构数据帧格式…

android适配鸿蒙系统开发

将一个Android应用迁移到鸿蒙系统需要进行细致的工作,因为两者之间存在一些根本性的差异,涉及到代码、架构、界面等多个方面的修改和适配。以下是迁移工作可能涉及的一些主要方面,希望对大家有所帮助。北京木奇移动技术有限公司,专…

各品牌PLC元件在modbus内区域

1台达: 输出在0区, 040961是在 0区 0xA000~0xA0FF 【Y0~Y377】 输入在1区,124577是在 1区 0x6000~0x60FF 【X0~X377】 M寄存器0区,0000001是 0区,0x000~0x1FFF 【M0~M8191】 D寄存器4区,400000…

CTFhub-RCE-过滤运算符

检查网页源代码发现如果用户输入 || (逻辑或操作符) 或者是 & (按位与操作符),就不会执行。直接进行测试,在 URL 后输入本地 IP 进行 ping 命令测试,发现可以正常回显。检查网页源代码发现如…

2018年五一杯数学建模B题商业银行人民币贷款规模分配及盈利问题解题全过程文档及程序

2019年五一杯数学建模 B题 商业银行人民币贷款规模分配及盈利问题 原题再现 商业银行贷款投放的简单模型是:从客户端吸收存款,缴存法定准备金(法定准备金率:大型金融机构15.5%,中小金融机构12%;法定准备金…

Spring Boot Actuator:自定义端点

要在Spring Boot Actuator中实现自定义端点,可以按照以下步骤进行操作: 1.创建一个自定义端点类 该类需要使用Endpoint注解进行标记,并使用Component注解将其作为Spring Bean进行管理。 package com.example.highactuator.point;import lo…

flowable消息事件

一&#xff1a;启动事件 定义消息。 引用消息。 <startEvent id"msgStart" name"消息启动事件" isInterrupting"true"><messageEventDefinition messageRef"myMsgStart"></messageEventDefinition> </startE…

机器学习第6天:线性回归模型正则化

文章目录 机器学习专栏 正则化介绍 岭回归 岭回归成本函数 核心代码 示例 Lasso回归 Lasso回归损失函数 核心代码 弹性网络 弹性网络成本函数 核心代码 结语 机器学习专栏 机器学习_Nowl的博客-CSDN博客 正则化介绍 作用&#xff1a;正则化是为了防止模型过拟合…