深入理解C语言中的变量和常量

变量和常量

    • 1. 前言
    • 2. 预备知识
      • 2.1 printf和%d
      • 2.2 \n
      • 2.3 scanf
      • 2.4 scanf在vs中报错
      • 2.5 extern
      • 2.6 数组的初始化
    • 3. 变量和常量的区别
    • 4. 变量
      • 4.1 定义变量的方法
      • 4.2 变量的分类
        • 4.2.1 局部优先
      • 4.3 变量的使用
      • 4.4 变量的作用域
        • 4.4.1 局部变量的作用域
        • 4.4.2 全局变量的作用域
      • 4.5 变量的生命周期
        • 4.5.1 局部变量的生命周期
        • 4.5.2 全局变量的生命周期
    • 5. 常量
      • 5.1 字面常量
      • 5.2 const修饰的常变量
      • 5.3 #define定义的标识符常量
      • 5.4 枚举常量

在这里插入图片描述

1. 前言

大家好,我是努力学习游泳的鱼。本文会带你进入变量和常量的大门,带你进一步了解C语言的奥秘。

2. 预备知识

2.1 printf和%d

#include <stdio.h>int main()
{int a = 100;printf("a = %d\n", a);return 0;
}

这段代码会输出a = 100
因为a = %d中,%d表示打印整数,会被直接替换成a的值,即100

2.2 \n

\n是一个转义字符,表示换行。

2.3 scanf

scanf是C语言的库函数,对应的头文件是stdio.h
printf相反,scanf用来完成从键盘中输入数据的操作,
使用时注意在变量名前面加上&,这点初学者容易忘记。

#include <stdio.h>int main()
{int a = 0;scanf("%d", &a); // 注意不能漏掉&return 0;
}

2.4 scanf在vs中报错

如果你使用的是visual studio系列的编译器,需要在程序的第一行加上一行代码才能使用scanf

#define _CRT_SECURE_NO_WARNINGS 1

如果你不嫌麻烦可以每次都加上这行代码。
如果你不想每次都写这行代码,可以在vs的安装路径找到newc++file.cpp文件,在里面加上这行代码即可。当然你也可以研究一下scanf的替代函数scanf_s,不过我不建议这么做。
第一步:找到newc++file.cpp
可以使用everything进行查找点这里下载
但是你直接打开的话是修改不了的,因为权限不够。这有两种解决方法。
解决方法一:把文件拖到桌面,修改后再放回去。
解决方法二:复制文件路径,管理员权限打开记事本,再打开文件路径就行了

2.5 extern

extern是用来声明外部符号的。任何变量或函数使用前都要先声明或者定义,如果这个函数或者变量在其他文件内,则可以使用extern声明。

2.6 数组的初始化

这里只需要明白,下面代码方括号里的10必须是个常量(不变的量)就行了。

int arr[10] = {0};

3. 变量和常量的区别

会改变的量,叫做变量。
不会改变的量,叫做常量。

4. 变量

4.1 定义变量的方法

类型+名字(+初始化)

int age = 10;
char ch = 'w';

4.2 变量的分类

变量分为全局变量和局部变量。
定义在大括号外部的变量叫做全局变量。
定义在大括号内部的变量叫做局部变量。

int b = 1000; // 全局变量 - 定义在大括号外面int main()
{int a = 100; // 局部变量 - 定义在大括号里面return 0;
}
4.2.1 局部优先

当全局变量和局部变量的名字冲突时,局部优先

#include <stdio.h>int a = 1000; // 全局变量int main()
{int a = 100; // 局部变量printf("a = %d\n", a);return 0;
}

这里局部变量的a和全局变量的a名字冲突了,但是输出结果是a = 100

不建议把全局变量和局部变量的名字取成一样的!

4.3 变量的使用

写一个代码,完成两个整数的相加

#include <stdio.h>int main()
{int num1 = 0;int num2 = 0;int sum = 0;// 输入scanf("%d %d", &num1, &num2);// 求和sum = num1 + num2;// 输出printf("sum = %d\n", sum);return 0;
}

4.4 变量的作用域

一个变量哪里可以使用,哪里就是它的作用域。

4.4.1 局部变量的作用域

局部变量的作用域是变量所在的局部范围。

#include <stdio.h>int main()
{{int a = 100; // 局部变量printf("%d\n", a); // 这里可以使用}printf("%d\n", a); // 这里不能使用return 0;
}
4.4.2 全局变量的作用域

全局变量的作用域是整个工程。

#include <stdio.h>int a = 100; // 全局变量void test()
{printf("test::%d\n", a); // 这里可以使用
}int main()
{test();printf("main::%d\n", a); // 这里可以使用return 0;
}

全局变量甚至可以跨文件使用,但在使用前要使用extern声明
test1.c

int a = 100; // 跨文件的全局变量

test2.c

#include <stdio.h>extern int a; // extern是用来声明外部符号的void test()
{printf("test::%d\n", a); // 可以使用
}int main()
{test();printf("main::%d\n", a); // 可以使用return 0;
}

4.5 变量的生命周期

一个变量从创建到销毁的时间段就是它的生命周期。

4.5.1 局部变量的生命周期

进作用域生命周期开始,出作用域生命周期结束。

4.5.2 全局变量的生命周期

全局变量的生命周期和程序的生命周期相同。即:与程序共存亡!

5. 常量

5.1 字面常量

直接写出来的常量就叫做字面常量。

20;
3.14;
'a'; // 字符常量
"abcdef"; // 字符串常量

字面常量可以给变量赋值或初始化。

int a = 10;
char ch = 'w';

5.2 const修饰的常变量

const是C语言的关键字,意思是常属性。

const修饰的变量,具有常属性,在语法上不能改变但本质上还是个变量
所以,我们称这种变量为常变量。

int main()
{const int a = 10;a = 20; // 不能像这样改变a的值了return 0;
}

下面证明const修饰的常变量本质是个变量。
数组初始化时方括号里必须是常量。

int arr[10] = {0};

那么const修饰的常变量能不能用来初始化数组时指定大小呢?

int main()
{const int n = 10;int arr[n] = {0}; // 这里会报错return 0;
}

答案是:不能!
由此可知,

在C语言里,const修饰的常变量只是具有常属性,但本质上是个变量,不能当做常量来处理。

5.3 #define定义的标识符常量

#include <stdio.h>#define M 100 // 这里M就是一个常量int main()
{int a = M; // M可以给变量赋值int arr[M] = {0}; // M可以在数组初始化时指定大小printf("a = %d\n", a);return 0;
}

5.4 枚举常量

C语言提供了一个关键字:enum,就是枚举的意思。

枚举,即一一列举。
生活中有些东西是可以一一列举的。比如:
性别:男,女,保密。
三原色:红色,绿色,蓝色。
星期:星期一,星期二,……,星期日。
C语言提供了枚举类型

enum Sex // enum Sex就是一个枚举类型
{// 这里的MALE,FEMALE,SECRET就是枚举常量MALE,FEMALE,SECRET
}; // 分号不能省略int main()
{enum Sex s = MALE; // 可以用枚举常量给枚举类型初始化或赋值return 0;
}

枚举常量也是有值的,默认从0开始。

#include <stdio.h>enum Color
{RED, // 0GREEN, // 1BLUE // 2
};int main()
{printf("%d %d %d", RED, GREEN, BLUE); // 输出0 1 2return 0;
}

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

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

相关文章

机器学习|KNN和Kmeans

KNN和Kmeans KNN KNN-K个最近的邻居&#xff0c;而K是可人先预设出来的。 所谓近朱者赤&#xff0c;近墨者黑。 可以选取离当前最近的K个样本来作为辅助判断&#xff0c;因为本样本和最近的K个样本应该是处于一种相似的状态。 以下是一个苹果和梨的识别任务。 图上会出现一个未…

【软件设计师】通俗易懂的去了解算法的时间复杂度

&#x1f413; 时间复杂度 常用排序的时间复杂度 时间频度 算法需要花费的时间&#xff0c;和它语句执行的次数是成正比的&#xff0c;所以会把一个算法种语句执行次数称为语句频度和时间频度、记作T(n)。 定义 时间复杂度就是找到一个无限接近时间频度T(n)同数量级的函数&am…

mirthConnect忽略HTTPS SSL验证

mirthConnect SSL忽略验证 1、下载https网站证书 点击不安全---->证书无效 2、查看mirth 秘钥库口令 在mirthConnect 的conf目录下面keystore.storepass 3、导入证书到本地 在jdk的bin目录下面执行 keytool -importcert -file "下载的网站证书路径" -keysto…

CV论文--2024.3.4

1、Deep Networks Always Grok and Here is Why 中文标题&#xff1a;深度网络总是让人摸不着头脑&#xff0c;原因如下 简介&#xff1a;本文探讨了深度神经网络&#xff08;DNN&#xff09;中一种称为"延迟泛化"或"Grokking"的现象。在接近零的训练误差…

如何用Elementor创建WordPress会员网站

在下面的文章中&#xff0c;我们将向您展示如何使用Elementor和MemberPress在WordPress中轻松构建会员网站。这篇文章将涵盖WordPress会员网站设置过程、会员资格和受保护内容创建、重要页面和登录表单设计、电子邮件通知管理、报告等。 目录 什么是WordPress会员网站&#x…

【go从入门到精通】go基本类型和运算符用法

大家好&#xff0c;这是我给大家准备的新的一期专栏&#xff0c;专门讲golang&#xff0c;从入门到精通各种框架和中间件&#xff0c;工具类库&#xff0c;希望对go有兴趣的同学可以订阅此专栏。 --------------------------------------------------------------------------…

.NET高级面试指南专题十四【 观察者模式介绍,最常用的设计模式之一】

简介&#xff1a; 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;其目的是定义了一种一对多的依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。 原理&#xff1a; 在观察者模式中…

从零开始搭建web组态

成果展示&#xff1a;by组态[web组态插件] 一、技术选择 目前只有两种选择&#xff0c;canvas和svg Canvas: 是一个基于像素的渲染引擎&#xff0c;使用JavaScript API在画布上绘制图像&#xff0c;它的优点包括&#xff1a; Canvas渲染速度快&#xff0c;适合处理大量图像和…

TIOBE 2024榜单启示:程序员如何把握未来编程趋势与机遇

程序员如何选择职业赛道&#xff1f; 程序员的职业赛道就像是一座迷宫&#xff0c;有前端的美丽花园&#xff0c;后端的黑暗洞穴&#xff0c;还有数据科学的神秘密室。你准备好探索这个充满挑战和机遇的迷宫了吗&#xff1f;快来了解如何选择职业赛道吧&#xff01; 方向一…

CSS中如何解决 1px 问题?

1px 问题指的是&#xff1a;在一些 Retina屏幕 的机型上&#xff0c;移动端页面的 1px 会变得很粗&#xff0c;呈现出不止 1px 的效果。原因很简单——CSS 中的 1px 并不能和移动设备上的 1px 划等号。它们之间的比例关系有一个专门的属性来描述&#xff1a; window.devicePix…

重构笔记系统:Docker Compose在微服务架构中的应用与优化

虽然我的笔记系统的开发是基于微服务的思想&#xff0c;但是在服务的配置和编排上感觉还是不太合理&#xff0c;具体来说&#xff0c;在开发上的配置和在生产上的配置差别太大。现在规模小&#xff0c;后面规模变大&#xff0c;估计这一块会成为系统生长的瓶颈。 因此&#xff…

跨时钟信号处理方法

1. 背景 现在的芯片&#xff08;比如SOC&#xff0c;片上系统&#xff09;集成度和复杂度越来越高&#xff0c;通常一颗芯片上会有许多不同的信号工作在不同的时钟频率下。比如SOC芯片中的CPU通常会工作在一个频率上&#xff0c;总线信号&#xff08;比如DRAM BUS&#xff09;会…

python+Django+Neo4j中医药知识图谱与智能问答平台

文章目录 项目地址基础准备正式运行 项目地址 https://github.com/ZhChessOvO/ZeLanChao_KGQA 基础准备 请确保您的电脑有以下环境&#xff1a;python3&#xff0c;neo4j 在安装目录下进入cmd&#xff0c;输入指令“pip install -r requirement.txt”,安装需要的python库 打…

猫为什么挑食?可以改善、预防猫咪挑食的主食冻干分享

现在的猫咪主人都把自家的小猫当成了心头的宝贝&#xff0c;呵护备至。最令人头疼的就是猫咪挑食不吃猫粮&#xff0c;猫为什么挑食&#xff1f;遇到这类情况怎么办呢&#xff1f;今天&#xff0c;我要分享一个既能确保猫咪不受苦&#xff0c;又能有效改善挑食问题的方法。 一、…

vue api封装

api封装 由于一个项目里api是很多的&#xff0c;随处都在调&#xff0c;如果按照之前的写法&#xff0c;在每个组件中去调api&#xff0c;一旦api有改动&#xff0c;遍地都要去改&#xff0c;所以api应该也要封装一下&#xff0c;将api的调用封装在函数中&#xff0c;将函数集…

C++实现简易版http server

mini服务器简介 mini服务器功能 1.实现了GET和POST方法的HTTP request和HTTP respond的构建和发送&#xff0c;使服务器可以完成基本通信功能。 2.使用了线程池技术&#xff0c;使服务器可以一次接收更多的链接和加快了服务器处理数据的速度。 3.实现了简易的CGI&#xff0…

【MATLAB源码-第155期】基于matlab的OFDM系统多径信道LS,LMMSE,SVD三种估计算法的比较误码率对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM&#xff08;Orthogonal Frequency Division Multiplexing&#xff0c;正交频分复用&#xff09;是一种高效的无线信号传输技术&#xff0c;广泛应用于现代通信系统&#xff0c;如Wi-Fi、LTE和5G。OFDM通过将宽带信道划分…

jmeter 按流量阶梯式压测数据库

当前版本&#xff1a; jmeter 5.6.3mysql 5.7.39 简介 JMeter 通过 BZM - Arrivals Thread Group 来模拟并发到达的用户流量、按时间加压&#xff0c;可以有效地帮助测试人员评估系统在高压力和高并发情况下的性能表现。 文章目录如下 1. 下载插件 2. 界面说明 3. 测试步骤…

云计算 2月26号 (进程管理和常用命令)

一、权限扩展 文件权限管理之&#xff1a; 隐藏权限防止root误删除 文件属性添加与查看 [rootlinux-server ~]# touch file1 file2 file3 1.查看文件属性 [rootlinux-server ~]# lsattr file1 file2 file3 ---------------- file1 ---------------- file2 ---------------- f…

UDP协议和TCP协议详解

文章目录 应用层自定义协议 传输层udp协议TCP协议1.确认应答2.超时重传3.连接管理建立连接, 三次握手断开连接, 四次挥手tcp的状态 4.滑动窗口5.流量控制6.拥塞控制7.延时应答8.携带应答9.面向字节流10.异常情况 应用层 自定义协议 客户端和服务器之间往往要进行交互的是“结构…