深入理解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个样本应该是处于一种相似的状态。 以下是一个苹果和梨的识别任务。 图上会出现一个未…

深入Spring Boot核心技术:代码实战解析

第一章&#xff1a;揭开Spring Boot自动配置的面纱 自动配置原理 让我们首先通过一个简化的Spring Boot应用启动类来直观感受自动配置的工作原理&#xff1a; java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.Sprin…

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

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

小脑萎缩患者生活指南:守护你的每一步

亲爱的读者朋友们&#xff0c;今天我们要聊一聊一个特殊但非常重要的群体——小脑萎缩患者。在这个充满挑战的旅程中&#xff0c;我们将一起探索如何用爱和智慧为患者打造一个更加安全、舒适的生活环境。 小脑萎缩是指小脑细胞逐渐减少&#xff0c;导致小脑体积缩小的一种病症…

全量知识系统问题及SmartChat给出的答复 之16 币圈生态链和行为模式

Q.42 币圈生态链和行为模式 我认为&#xff0c;上面和“币”有关的一系列概念和技术&#xff0c;按设计模式的划分 &#xff0c;整体应该都属于行为模式&#xff0c;而且应该囊括行为模式的所有各个方面。 而行为又可以按照三种不同的导向&#xff08;以目的或用途为导向、过…

互联网摸鱼日报(2024-03-04)

互联网摸鱼日报(2024-03-04) 36氪新闻 Sora来了&#xff0c;你又焦虑了吗&#xff1f; 最前线&#xff5c;安踏首家球鞋集合店落地北京三里屯 一位中国遥感科学家&#xff0c;决定“跨界”拯救濒危动物野骆驼 | 最前线 本周双碳大事&#xff1a;工信部等七部门发文推动制造…

mirthConnect忽略HTTPS SSL验证

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

LeetCode每日一题【c++版】- leetcode 225.用队列实现栈

题目描述 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素…

Python中按指定数量分割列表字符串的方法

引言 处理列表数据时&#xff0c;有时我们需要将一个包含长字符串的列表分割成按照特定长度的小字符串的多个列表。这在文本处理、批量数据处理或者当我们需要将数据分块进行并行处理时非常常见。Python作为一个强大的编程语言&#xff0c;提供了很多方便的方法来实现这一功能…

CV论文--2024.3.4

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

使用ssh密钥提交、拉取代码的介绍

网络世界中的数据并不安全 网络中无时无刻有大量的数据传输&#xff0c;传输过程中需要经过各种网络设备和物理媒介你的数据可能会在传输的某一个环节被一个“中间人”拦截&#xff0c;造成泄密&#xff0c;甚至会篡改你的数据&#xff0c;让你发出错误的信息 SSH 为 Secure …

MySQL 5.5、5.6、5.7的主从复制改进

主从复制面临的问题 MySQL一直以来的主从复制都是被诟病,原因是: 1、主从复制效率低 早期mysql的复制是通过将binlog语句异步推送到从库。从库启动一个IO线程将接收到的数据记录到relaylog中;另外启动一个SQL线程负责顺序执行relaylog中的语句实现对数据的拷贝。 这里的…

如何用Elementor创建WordPress会员网站

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

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

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

与字体有关的CSS

隐藏多余字体 text-overflow: ellipsis &#xff08;多余文本显示省略号&#xff09; 需要配合overflow使用 -webkit-box-orient: vertical; display: -webkit-box; -webkit-line-clamp: number &#xff08;超出多少行显示省略号&#xff09; 强制显示一行 whi…

.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; 方向一…

linux时间校准(ntpdate)

在Linux中&#xff0c;可以使用ntpdate命令来进行时间校准。 首先&#xff0c;打开终端并输入以下命令安装ntpdate工具 yum install ntpdate 然后&#xff0c;运行以下命令来同步系统的时间与网络上的NTP服务器 ntpdate time.nist.gov 若要设置定期自动更新时间&#xff0c;可…

CSS中如何解决 1px 问题?

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