变量和常量
- 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;
}