当前位置: 首页 > news >正文

【C语言】变量和常量

目录

1. 变量

1.1 变量的分类

1.1.1 局部变量

1.1.2 全局变量

1.2 变量的使用——声明、赋值、初始化

1.3 变量的作用域和生命周期

1.3.1 作用域

1.3.2 生命周期

2. 常量

2.1 字面常量

2.2 常变量(const常量)

2.3 简单的宏(对象式宏)

2.4 枚举常量


1. 变量

大多数程序在产生输出之前往往需要执行一系列的计算,因此需要在程序执行过程中有一种临时存储数据的方法。和大多数编程语言一样,C语言中的这类存储单元被称为变量( variable)

1.1 变量的分类

1.1.1 局部变量

局部变量是{}内部定义的变量。局部变量不初始化默认为随机值。

1.1.2 全局变量

全局变量是{}外部定义的变量。全局变量不初始化默认为0。

当全局变量和局部变量名字相同的情况下局部优先,但是建议不要将全局和局部变量的名字写成一样的。

#include <stdio.h>int a = 100;//全局变量int main()
{int a = 10;//局部变量printf("a=%d\n", a);//a=10return 0;
}
#include <stdio.h>int x = 5, y = 7;//全局变量void swap()
{int z;z = x;x = y;y = z;
} int main()
{int x = 3, y = 8;//局部变量swap();printf("%d,%d\n", x, y);//3,8return 0;
}

上面代码输出结果为3,8。swap函数调用时用的是全局变量,主函数中定义的变量只在主函数中有效,因为主函数也是一个函数,它与其他函数是平行关系;输出语句这里,考虑局部优先的原则。

1.2 变量的使用——声明、赋值、初始化

#include <stdio.h>int main()
{int num1;//声明num1 = 10;//赋值:在已生成的变量中放入数值int num2 = 20;//初始化:在生成变量的时候放入数值int a, b;//一次声明多个变量时,用逗号分隔变量名a = 5;//赋值b = 15;//赋值//计算int sum = num1 + num2;int diff = a - b;//输出printf("%d %d\n", sum, diff);//30 -10return 0;
}

变量在生成的时候会被放入不确定的值。因此在声明变量时,除了有特别要求之外,一定要为其赋初始值,进行初始化。最好不要写int n;,要写成int n = 0;。

1.3 变量的作用域和生命周期

1.3.1 作用域

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

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

1.3.2 生命周期

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

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

static用来声明静态变量,改变变量的生命周期:

  • 修饰局部变量→静态局部变量

static修饰局部变量的时候,局部变量出了作用域不销毁。本质上,static修饰局部变量的时候,改变了变量的存储位置的;影响了变量的生命周期,生命周期变长,和程序的生命周期一样。

  • 修饰全局变量→静态全局变量

static修饰全局变量的时候,全局变量的外部链接属性就变成了内部链接属性。这个全局变量只能在本源文件内使用,不能在其他源文件内使用。

  • 修饰函数→静态函数

static修饰函数的时候,函数的外部链接属性就变成了内部链接属性。这个函数只能在本源文件内使用,不能在其他源文件内使用。

2. 常量

2.1 字面常量

30;   //数值常量——整数常量
3.14; //数值常量——浮点常量
'w';  //字符常量
"abc";//字符串常量

2.2 常变量(const常量)

const修饰的变量,本质是变量,但是不能直接修改,有常量的属性,称为常变量。

const float pi = 3.14f;
//float const pi = 3.14f;
pi = 5.14;//err

const修饰的常变量一旦创建后其值就不能再改变,所以必须初始化。

const int a;//err

如果利用一个变量去初始化另外一个变量,则它们是不是const都无关紧要。常变量的常量特征仅仅在执行改变常变量的操作时才会发挥作用。

int i = 42;
const int ci = i//ok
int j = ci;//ok

2.3 简单的宏(对象式宏)

#define 标识符 替换列表

宏的替换列表可以包括标识符、关键字、数值常量、字符常量、字符串字面量、操作符和排列。当预处理器遇到一个宏定义时,会做一个“标识符”代表“替换列表”的记录。在文件后面的内容中,不管标识符在哪里出现,预处理器都会用替换列表代替它。

#define MAX 100
#define STR "abcdef"#include <stdio.h>int main()
{printf("%d\n", MAX);//100int a = MAX;printf("%d\n", a);//100printf("%s\n", STR);//abcdefreturn 0;
}
#define INT_PTR int*
INT_PTR a, b;//a是int*类型,b是int类型

#define是宏定义,仅仅是直接替换。INT_PTR a, b; 进行宏替换后代码为:

int* a, b;

不是a和b都是int*类型的意思,而是a是int*类型,b是int类型。可以看成是如下代码:

int *a, b;//a是指向int类型的指针,b是int类型的变量

2.4 枚举常量

#include <stdio.h>enum Day//星期
{Mon,Tues,Wed,Thur,Fri,Sat,Sun
};
enum Sex//性别
{MALE,FEMALE,SECRET
};
enum Color//颜色
{RED,GREEN,BLUE
};int main()
{printf("%d\n", RED);//0printf("%d\n", GREEN);//1printf("%d\n", BLUE);//2return 0;
}

以上定义的enum Day、enum Sex、enum Color 都是枚举类型。{}中的内容是枚举类型的可能取值,也叫枚举常量。这些可能取值都是有值的,默认从0开始,依次递增1,当然在定义的时候也可以赋初值。

#include <stdio.h>enum Color//颜色
{RED = 1,GREEN = 2,BLUE = 4
};int main()
{printf("%d\n", RED);//1printf("%d\n", GREEN);//2printf("%d\n", BLUE);//4return 0;
}
http://www.lryc.cn/news/45091.html

相关文章:

  • 蓝桥杯-卡片换位(BFS)
  • 霍夫曼编码 | 贪心算法 2
  • async 与 await
  • MYSQL语句
  • C语言函数:内存函数memcpy()以及实现
  • ArcGIS基础:栅格分区转矢量再裁剪面图层【重分类】【栅格转面】
  • vue尚品汇商城项目-day02【11.对axios二次封装+12.接口统一管理】
  • 并发编程-2
  • 万字解析Linux内核调试之动态追踪
  • Spring Boot 各层作用与联系
  • 苦中作乐---竞赛刷题(15分-20分题库)
  • 超详细,多图,PVE安装以及简单设置教程(个人记录)
  • 茴子的写法:关于JAVA中的函数传递语法糖:lambda
  • 动态规划刷题记录(2)
  • 2023年广东省网络安全竞赛——Web 渗透测试解析(超级详细)
  • MI-SegNet阅读笔记
  • 十、MyBatis分页插件
  • EasyCVR平台国标GB28181协议设备接入时,可支持过滤通道类型
  • 玩转git的第1章节:git的理论以及操作规则
  • 【新2023Q2模拟题JAVA】华为OD机试 - 二叉树层次遍历
  • 轻松拿结果-第三部分 同欲 -第六章 有凝聚力才有战斗力
  • chatGPT 会给程序员带来失业潮吗?
  • Vue项目proxyTable跨域配置
  • ubuntu16.04搭建gitlab
  • SSMP综合案例
  • 让你的作品更出色——词云Word Cloud的制作方法(基于python,WordCloud,stylecloud)
  • axios请求拦截器
  • 四个常见的Linux技术面问题
  • 有什么适合程序员查资料的网站
  • (七)手把手带你搭建精美简洁的个人时间管理网站—实现登录与注册的前端代码【源码】