0008—常量和变量

目录

一、变量

1.1 定义变量的方法

1.2 变量的分类

1.3 使用变量

1.4 变量的作用域

1.5 变量的生命周期

二、常量

2.1 字面常量

2.2 const修饰的常变量

2.3 define定义的标识符常量

2.4 枚举常量

三、练习


一、变量

生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等等)。

有些值是可变的(比如:年龄,体重,薪资)。

不变的值,C语言中用常量的概念来表示,变得值C语言中用变量来表示。

1.1 定义变量的方法

int age = 150;
float weight = 45.5f;
char ch = 'w';

创建变量的基本方法:

#include <stdio.h>
int main() {char name = 'A';short age = 25;int high = 180;float weight = 88.5;age = 26;printf("%d\n",age);return 0;
}

1.2 变量的分类

变量:用来描述可变的量。

  • 局部变量
  • 全局变量

常量:用来描述不变的量。

(1)全局变量和局部变量

#include <stdio.h>
int global = 2019;//全局变量
int main()
{int local = 2018;//局部变量//下面定义的global会不会有问题?int global = 2020;//局部变量printf("global = %d\n", global);return 0;
}
int b = 20;//全局变量:范围更广
int main() {int a = 10;//局部变量:范围小return 0;
}

定义:

#define _CRT_SECURE_NO_WARNINGS 2
int num2 = 20;//全局变量:定义在{代码块}之外的变量
int main()
{int num = 10;//局部变量:定义在{代码块内部的变量}return 0;
}

 (2)同一范围内,变量只能定义一次。重复定义,编译器会报错。

同时出现相同变量

#define _CRT_SECURE_NO_WARNINGS 2
#include <stdio.h>
int a = 100;
int main()
{int a = 10;//局部变量的名字建议不要相同,容易误会,产生bug//当局部变量与全局变量相同的时侯,局部变量优先printf("%d\n",a);//10return 0;
}

  (3)全局变量和局部变量名字相同(冲突),但是局部优先使用。

#include <stdio.h>
int a = 20;
int main() {int a = 10;printf("a=%d",a);//a=10//a= 是加的修饰return 0;
}

全局变量的使用

#define _CRT_SECURE_NO_WARNINGS 2
#include <stdio.h>
int a = 100;//全局变量在哪里都可以使用
int main()
{printf("%d\n",a);//100return 0;
}

(4)如果局部没有,就会向外去找变量。

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

 建议:不要将局部变量和全局变量的名字写成一样的。

局部变量的含义

  • 放在main函数里面的是局部变量,但是不一定所有的局部变量都会放在main函数里面,放在其他地方也可能是局部变量。
  • 放到{里面的变量都是局部变量},放到{}以外的变量是全局变量。

总结:

  • 上面的局部变量global变量的定义其实没有什么问题的!
  • 当局部变量和全局变量同名的时候,局部变量优先使用。

1.3 使用变量

计算两个数的和。

变量的使用(计算两个数相加)。

(1)使用前,建议变量初始化。

代码一:

#include <stdio.h>
int main()
{int num1 = 0;int num2 = 0;int sum = 0;printf("输入两个操作数:>");scanf("%d %d", &num1, &num2);sum = num1 + num2;printf("sum = %d\n", sum);return 0;
}
//这里介绍一下输入,输出语句
//scanf
//printf

scanf:输入函数

printf:输出函数

代码二:固定数字的相加。

#include <stdio.h>
int main()int a = 10;//向内存申请4个字节的空间int b = 25;int sum = 0;printf("%d\n",sum=a+b);//35return 0;
}

代码三:不固定数字相加。

#define _CRT_SECURE_NO_WARNINGS 2
#include <stdio.h>
int main()
{//计算两个数的和int num1 = 0;int num2 = 0;int sum = 0;//输入数据使用scanf输入函数//文件操作前不能保存下来,每次都要打开,打开才开始执行程序scanf("%d%d",&num1,&num2);//&取地址符号,把输入的数字保存到地址符所指向的地址中//int sum = num1 + num2;sum = num1 + num2;//这样写也行printf("sum = %d\n",sum);return 0;
}

在C++里面哪里需要int sum = 0;的值就可以在哪里编写。

C语言语法规定,变量要定义在当前代码块的最前面。

报错原因分析:

解决方法一:仅仅是VS的解决办法,其他编译工具也不能这样做。

解决方法二:不推荐

解决方法三:一劳永逸的办法

一定要拖回去,不然会有Bug,即创建源文件时,找不到C++文件。如下图所示:

1.4 变量的作用域

作用域:作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用 的 而限定这个名字的可用性的代码范围就是这个名字的作用域。

  • 局部变量的作用域是变量所在的局部范围。
  • 全局变量的作用域是整个工程。

变量的作用域:名字哪里可以使用,哪里就是它的作用域。

局部变量的作用域:

int main() {int a = 10;{int b = 20;printf("a=%d\n",a);//a=10int c = 30;printf("c=%d\n", b);//b=20}printf("b=%d", b);	//报错,b是未声明的标识符return 0;
}

全局变量的作用域分为三种情况:

情况一:

int a = 10;
int main() {{printf("a=%d\n",a);}printf("a=%d", a);	return 0;
}

 情况二:函数内部打印

int a = 10;//全局变量在一个工程中到处都可以使用//写一个简单的函数
void test() {printf("a=%d\n", a);//a=10
}
int main() {test();//调用函数return 0;
}

情况三:其他文件中使用

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

作用域作用于主函数内部:

局部变量的作用域:

#include <stdio.h>
int main()
{int num = 0;printf("num = %d\n",num);//该num的范围(作用域)就是主函数内部   //输出num = 0return 0;
}
#include <stdio.h>
int main()
{{int num = 0;//作用域仅限制于该函数体的{}}//printf("num = %d",num);  不能使用的return 0;
}
#include <stdio.h>
int main()
{{//局部变量的作用域:就是作用域局部变量的{}内部int num = 0;//作用域仅限制于该函数体的{}printf("num = %d", num);  //能使用的   //输出num = 0}return 0;
}
#include <stdio.h>
int main()
{int num = 0;//作用域所在的代码块,局部变量的作用域是变量所在的范围{printf("num = %d", num); //num = 0}return 0;
}

 全局变量的作用域:

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

全局变量的作用域范围真大,在哪里都可以使用:

#include <stdio.h>
int global = 2023;//全局变量的作用域是整个工程,任何地方都可以使用
void test()//定义一个test函数
{printf("test() = %d\n", global);//test() = 2023
}
int main()//main函数从开始到结束就是整个程序的生命周期
{test();//调用函数printf("global = %d\n",global);//global = 2023return 0;
}

 引用外部文件也可以当成全局变量来使用:

include是用来声明头文件的,一个文件内容是很多的。

extern仅仅是用来声明外部符号。 

1.5 变量的生命周期

变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段:

  • 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
  • 全局变量的生命周期是:整个程序的生命周期。

一个人的生命周期:出生到死亡。

局部变量的生命周期。

人的生命周期:从出生到死亡。

变量的生命周期:变量什么时候存在,什么时候不存在;什么时候生命开始,什么时候生命结束。

全局变量的生命周期:程序运行,就一直在。

局部变量的生命周期:

#include <stdio.h>
int main()
{{//变量a进入{生命周期开始int a = 10; //{里面都活着呢}printf("a = %d\n",a);//ok可以使用//出去{}也没在了,也不能使用。生命周期结束}//printf("a = %d\n", a);//error不可以使用return 0;
}

全局变量的生命周期:

  • 全局变量的生命周期和main函数的生命周期是一样的。
  • main函数的生命周期又是程序的生命周期。

二、常量

C语言中的常量和变量的定义的形式有所差异。

C语言中的常量分为以下以下几种:

  • 字面常量
  • const 修饰的常变量
  • #define 定义的标识符常量
  • 枚举常量

生活中不变的量就是常量。姓名、性别、血型等。变化的量叫做变量,不变化的量叫做常量。

数值常量(可以进行+-*/):整型常量、实型常量。

字符常量:字符常量(‘a’)、字符串常量("abcd")。

2.1 字面常量

字面常量:字面上就能知道,直观用肉眼就能知道,不能被改动。

int main() {30;3.14;//一个浮点数常量'w';//一个字符常量"abc";//一个字符串常量return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{int num = 4;//3 = 5;不能把常量赋值给另外一个常量3;//字面常量232323;3.14;return 0;
}

2.2 const修饰的常变量

(1)具有常量的属性,常属性,不能被改变。

(2)在C语言中,const修饰的a,本质是变量,但是不能直接修改,有常量的属性。

可以打印出来:

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

 打印不出来了:

#include <stdio.h>
int main() {const int a = 0;a = 30;//报错,左值指定const常对象,不能被修改,编译器不让你改//此时,a具有常量的属性,常属性printf("%d\n",a);//30return 0;
}
int main() {int a = 10;a = 20;//a是变量const int b = 30;//b是常变量b = 40;//报错return 0;
}
#include <stdio.h>
int main()
{//const指的是常属性(常量的属性)const int num = 23;//num就是const修饰的常变量  num本质上还是一个变量,只是具有常属性而已printf("%d\n",num);num = 566;//error 左值指定的const对象,表达式必须1是可修改的左值printf("%d\n",num);return 0;
}

 总结:在C语言中,const修饰的a,本质是变量,但是不能直接修改,有常量的属性。

证明是常变量:

#include <stdio.h>
int main()
{int arr[10] = { 0 };//ok 创建数组的正确方式int n = 10;//int arr[n] = { 0 };//error 创建数组的错误方式  应输入常量表达式//const int n = 10;//errorreturn 0;
}

2.3 define定义的标识符常量

可以打印:

#include <stdio.h>
//定义一个符号MAX,值为100。以后遇到MAX,就是100。
//MAX是一个标识符,标识一个符号的。类似学号和姓名绑定。
#define MAX 100//MAX是没有类型的,也可以定义为字符串、其他符号等。
#define STR "abcdef"
int main() {printf("%d\n", MAX);//100int a = MAX;printf("a=%d\n", MAX);//a=100//%s是打印字符串的printf("ret=%s\n", STR);//ret=abcdefreturn 0;
}

#define定义的标识符常量(符号常量) : 

#include <stdio.h>
//#define 定义的标识符常量  define定义
#define MAX 10//定义了符号MAX MAX=10  MAX就是一个标识符常量
#define PI 3.14//命令行,其值不可以在后面直接赋值(例如:PI = 5 错误赋值,违背了符号常量的性质)
#define PI 4//但是可以这样进行赋值int main()
{int arr[MAX] = {0};//不会报错,说明MAX是一个常量printf("%d\n",MAX);//10return 0;
}

 define定义的标识符常量,也是不能改的:

#include <stdio.h>
#define MAX 100
int main() {MAX = 300;//报错,左操作数必须为左值return 0;
}

2.4 枚举常量

枚举常量:一一列举

  • eg. 性别枚举出来就是:男、女、保密
  • eg. 三原色:红、黄、蓝
  • eg. 星期:1,2,3,4,5,6,7
  • 枚举关键字:enum

创建一个Color类型的颜色变量,叫c,并予赋值为RED:

//定义枚举类型,关键词是enum,只是一个类型,不会开辟空间
//定义enum Color 这样的枚举类型
enum Color {//Color未来取值可能有如下三种(三原色),这三个取值就是列举出来的枚举常量RED,GREEN,//一般define定义的符号、枚举常量,可习惯的写为大写。BLUE//未来可能取到的值,枚举出来的
};
int main() {//printf("ret=%s\n", STR);enum Color c = RED;//使用enum Color类型创建变量,向内存申请并开辟空间return 0;
}

枚举常量不能被修改:

enum Sex {MALE,FAMALE,SECRET//枚举常量
};
int main() {enum Sex name = MALE;MALE = 10;//报错return 0;
}
#include <stdio.h>
enum Sex
{MAL,//枚举常量————不可改变FEMAL,SECRET//枚举常量
};
int main()
{printf("%d\n",MAL);//0printf("%d\n",FEMAL);//1printf("%d\n",SECRET);//2enum Sex s = MAL;//该人是男生return 0;
}

 枚举常量是有值的,0、1、2、3、4……

是可以打印出来的。

#include <stdio.h>
enum Color
{//一一列举出来red,yellow,//枚举常量blue
};
int main()
{printf("red\n",red);//redenum Color color = blue;//该颜色是蓝色color = yellow;//枚举类型创建出来的变量是可以改变的,用变量接后可以改printf("该颜色是: %d", color);//该颜色是: 1//blue = 9999;  枚举常量直接不能修改。本身改变不了return 0;
}

枚举常量是有值,从0开始,1、2、3、4…… 

案例展示:

#include <stdio.h>
//举例
enum Sex
{MALE,FEMALE,SECRET
};
//括号中的MALE,FEMALE,SECRET是枚举常量
int main()
{//字面常量演示3.14;//字面常量1000;//字面常量//const 修饰的常变量const float pai = 3.14f;   //这里的pai是const修饰的常变量pai = 5.14;//是不能直接修改的!//#define的标识符常量 演示#define MAX 100printf("max = %d\n", MAX);//枚举常量演示printf("%d\n", MALE);printf("%d\n", FEMALE);printf("%d\n", SECRET);//注:枚举常量的默认是从0开始,依次向下递增1的return 0;
}

注意:上面例子上的 pai 被称为 const 修饰的常变量, const 修饰的常变量在C语言中只是在语法层面限制了 变量 pai 不能直接被改变,但是 pai 本质上还是一个变量的,所以叫常变量。

三、练习

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

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

    相关文章

    【Vue】在Vue3中使用Echarts的示例 两种方法

    文章目录 方法一template渲染部分js部分方法一实现效果 方法二template部分js or ts部分方法二实现效果 贴个地址~ Apache ECharts官网地址 Apache ECharts示例地址 官网有的时候示例显示不出来&#xff0c;属于正常现象&#xff0c;多进几次就行 开始使用前&#xff0c;记得先…

    [Deepseek-自定义Ollama 安装路径+lmStudio 简易安装]

    ollama 先下载 https://ollama.org.cn/download 使用 发现报错 检查路径 自己的路径! 再用 .\OllamaSetup.exe /DIRE:\MySoftware\Ollama 删除掉 多余模型 ollama delete <model_name> 例如 ollama delete deepseek-r1:1.5b 下载 ollama run deepseek-r1:1.5b…

    Linux 内核模块 | 加载 / 添加 / 删除 / 优先级

    注&#xff1a;本文为 “Linux 内核模块加载 / 添加 / 删除 / 优先级” 相关文章合辑。 机翻&#xff0c;未校。 未整理去重。 How Linux Kernel Boots? Linux 内核如何启动&#xff1f; Last Updated: 26 Apr, 2023 Many processes are running in the background when …

    鸿蒙UI(ArkUI-方舟UI框架)- 使用文本

    返回主章节 → 鸿蒙UI&#xff08;ArkUI-方舟UI框架&#xff09; 文本使用 文本显示 (Text/Span) Text是文本组件&#xff0c;通常用于展示用户视图&#xff0c;如显示文章的文字内容。Span则用于呈现显示行内文本。 创建文本 string字符串 Text("我是一段文本"…

    ubuntu20使用tigervnc远程桌面配置记录

    一、安装tigervnc sudo apt install tigervnc-common sudo apt install tigervnc-standalone-server二、增加配置文件 安装完后新增配置文件&#xff1a;vim ~/.vnc/xstartup #!/bin/sh #Uncomment the following two lines for normal desktop: #unset SESSION_MANAGER #ex…

    如何使用el-table的多选框

    对el-table再次封装&#xff0c;使得功能更加强大&#xff01; 本人在使用el-table时&#xff0c;因为用到分页&#xff0c;导致上一页勾选的数据在再次返回时&#xff0c;没有选中&#xff0c;故在原有el-table组件的基础之上再次进行了封装。 1.首先让某些不需要勾选的列表进…

    【银河麒麟高级服务器操作系统】系统日志Call trace现象分析及处理全流程

    了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://document.kylinos.cn 服务器环境以及配置 系统环境 物理机/虚拟机/云…

    杭州某小厂面试

    问的都是基础知识&#xff0c;主要是三个部分&#xff1a;计网&#xff0c;数据库&#xff0c;java。计网答得挺好&#xff0c;数据答得一般&#xff0c;Java答得一坨。 目录 1.TCP/IP协议的5层模型 2.3次握手和4次挥手 3.操作系统中的进程和线程的区别 4.lunix top 命令看…

    k8s网络插件及基础命令

    一、k8s的cni网络插件 1.k8s的内部网络模式 pod内的容器与容器之间的通信。一个节点上的pod之间的通信&#xff0c;docker0网桥直接通信。不同节点上的pod之间的通信&#xff1a;通过物理网卡的ip地址和其他节点上的物理网卡的设备进行通信&#xff0c;然后把流量转发到指定的…

    Zookeeper是如何解决脑裂问题的?

    大家好&#xff0c;我是锋哥。今天分享关于【Zookeeper是如何解决脑裂问题的&#xff1f;】面试题。希望对大家有帮助&#xff1b; Zookeeper是如何解决脑裂问题的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Zookeeper 通过多种机制来解决脑裂&…

    判断您的Mac当前使用的是Zsh还是Bash:echo $SHELL、echo $0

    要判断您的Mac当前使用的是Zsh还是Bash&#xff0c;可以使用以下方法&#xff1a; 查看默认Shell: 打开“终端”应用程序&#xff0c;然后输入以下命令&#xff1a; echo $SHELL这将显示当前默认使用的Shell。例如&#xff0c;如果输出是/bin/zsh&#xff0c;则说明您使用的是Z…

    web直播弹幕抓取分析 signature

    声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言 最近遇到太多难点了卡了很久&am…

    使用Deepseek搭建本地知识库-Cherry Studio

    Cherry Studio 支持多模型服务的 Windows/macOS GPT 客户端 GITHUB&#xff1a;CherryHQ/cherry-studio CSDN资源&#xff1a;cherry studio Cherry Studio 是一个支持多模型服务的桌面客户端&#xff0c;为专业用户而打造&#xff0c;内置 30 多个行业的智能助手&#xff0c…

    Node.js 环境配置

    什么是 Node.js Node.js 是一个基于 Chrome V8 JavaScript 引擎的 JavaScript 运行时环境&#xff0c;它允许你在服务器端运行 JavaScript。传统上&#xff0c;JavaScript 主要用于浏览器中的前端开发&#xff0c;而 Node.js 使得 JavaScript 也能够在服务器上执行&#xff0c;…

    面向对象程序设计-实验2

    题目1 6-1 使用动态内存分配的冒泡排序。 代码清单&#xff1a; #include <iostream> using namespace std; int* bubble_sort(int n);/* 对长度为n的数组执行冒泡排序 */ int main() { int n; cin >> n; int* a bubble_sort(n); for (int i 0; i < n; i)…

    集成Google Maps页面提示[For development purposes only]解决方案

    问题描述 填写Google Maps JavaScript API密钥之后(https://console.cloud.google.com/apis/credentials/key/2fb9924f-4dc6-4e77-b26f-085b67f48ae0?inv=1&invt=Abo68g&project=deft-velocity-450208-t8),加载Google Maps JavaScript API会出现这样的显示: 问题…

    深浅拷贝~

    深浅拷贝&#xff1a;直接赋值给的是地址&#xff0c;如果修改赋值后的变量&#xff0c;实际上连同原变量的值一并修改了。 浅拷贝 展开运算符 {...obj} 拷贝对象 Object.assign(新&#xff0c;旧) 深拷贝 递归&#xff1a;自己调用自己 以下实际是浅拷贝 递归调用处理数组问题…

    PySpark学习笔记5-SparkSQL

    sparkSql的数据抽象有两种。 一类是data set适用于java和Scala 一类是data frame适用于java&#xff0c;Scala&#xff0c;python 将r d d转换为data frame #方式一 df spark.createDataFrame(rdd,schema[name,age]) #方式二 schema Structtype(). add(id,integertype(),nu…

    【医院绩效管理专题】2.绩效管理:医院发展的核心驱动力

    医院成本核算、绩效管理、运营统计、内部控制、管理会计专题索引 一、引言 在当今医疗行业快速发展的背景下,医院管理面临着日益复杂的挑战。绩效管理作为医院管理的核心组成部分,对于提升医院运营效率、优化医疗服务质量以及实现可持续发展具有举足轻重的作用。它不仅是医…

    unity学习32:角色相关1,基础移动控制

    目录 0 应用商店 1 角色上新增CharacterController 组件 1.1 角色上新增CharacterController 组件 1.2 如果没有这个则会报错​编辑 2 速度 2.1 默认速度 2.2 修改速度为按时间计算 2.2 movespeed&#xff0c; 3 测试移动的代码 3.1 CharacterController 变量的声明…