引言
本篇文章主要介绍常量与变量、字符串、转义字符三个方面内容,知识较为基础,不会深入讲解,适合初学者
一.常量与变量
在生活中,有些值是不变的,如一个人的姓名,性别,圆周率等 有些值是可变的,如一个人的身高,年龄,体重等。
在C语言中,我们把不变的值用常量表示,变化的值用变量表示。
1.1定义变量的方法
int age = 150;
float weight = 45.5f;
char ch = 'w';
1.2变量的命名
- 只能由字母(包括大写和小写)、数字和下划线( _ )组成。
- 不能以数字开头。
- 长度不能超过63个字符。
- 变量名中区分大小写的。
- 变量名不能使用关键字。
1.3变量的分类
- 局部变量
- 全局变量 通俗来说,定义在某个大括号内部的就是局部变量,在大括号外部定义的就是全局变量 下面看看这段代码
#include <stdio.h>
int global = 2019;//全局变量
int main()
{
int local = 2018;//局部变量
//下面定义的global会不会有问题?
int global = 2020;//局部变量
printf("global = %d\n", global);
return 0;
}
实际上global变量的定义并没有问题,代码能运行,结果是2022
总结:
当局部变量和全局变量同名的时候,局部变量优先使用。
1.4变量的作用域和生命周期
- 作用域:一段程序代码中所用到的名字并不总是有效/可用 的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
- 局部变量的作用域:变量所在的局部范围。
- 全局变量的作用域:整个工程。
如何理解全局变量的作用域是整个工程?
我在同一个工程中建立了add.c和test.c两个源文件,将g_val这个全局变量定义在add.c中,但是当我在test.c中使用这个变量时编译器却会报错:"g_val:未声明的标识符"
g_val不是一个全局变量吗?不是整个程序中都可以用吗?为什么会报错呢?
其实这个问题很好解决,只需用到一个extern关键字
extern是外部的意思,用extern声明g_val这个外部符号,告诉编译器这个编译器在外部,到外面去找它。
//声明外部符号
extern int g_val;
int main()
{
printf("%d\n", g_val);
return 0;
}
- 生命周期:变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
- 局部变量的生命周期:进入作用域生命周期开始,出作用域生命周期结束。
- 全局变量的生命周期:整个程序的生命周期。
3.5常量
常量分为以下四种:
-
字面常量 比如 100 是整型字面值 ‘w’ 是字符字面值 3.14 是浮点型的字面值 "abcdef" 是字符串常量
-
const 修饰的常变量 用
const关键字修饰变量后,变量具有了常属性,值不能被修改,但它本质上还是一个变量。修饰的变量在C语言中只是在语法层面限制了变量不能直接被改变,但它本质上还是一个变量的,所以称它为常变量 -
#define 定义的标识符常量
#include <stdio.h>
int main()
{
#define MAX 100
printf("max = %d\n", MAX);
return 0;
}
打印结果是100。在程序编译之前,也就是预处理这一步时,代码中的MAX这个符号就被替换成了100。
- 枚举常量 这里不做介绍,后续的学习会详细讲解
二.字符串
"hello,world"
这种由双引号引起来的一串字符称为字符串字面值,或者简称字符 字符串的结束标志是一个 \0 的转义字符(不用自己写,会默认加在字符串末尾)。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。
'\0'对于字符串来说非常重要
#include <stdio.h>
//下面代码,打印结果是什么?为什么?
int main()
{
char arr1[] = "bit";
char arr2[] = {'b', 'i', 't'};
char arr3[] = {'b', 'i', 't', '\0'};
printf("%s\n", arr1);
printf("%s\n", arr2);
printf("%s\n", arr3);
return 0;
}
第一个和最后一个结果都是bit
第二个输出一堆乱码,”烫烫烫“
这是因为第一个字符数组使用一个字符串来初始化的,系统会自动在末尾添加‘\0’,打印时从字符串首开始,依次向后打印,直到遇见‘\0’停止打印;
而第二个使用三个字符来初始化数组的,末尾不会自动添加'\0',所以计算机会一直往后找,直到找到’\0‘;
第三个手动在末尾添加’\0’,所以也没问题
三.转义字符
假如我们要在屏幕上打印一个目录: c:\code\test.c 应该如何实现代码?
#include <stdio.h>
int main()
{
printf("c:\code\test.c\n");
return 0;
}
而实际运行结果是这样的:
其实这和转义字符有关。
转义字符,顾名思义就是转变的意思,下面看一些常见的转义字符
| 转义字符 | 释义 |
|---|---|
| \? | 在书写连续多个问号时使用,防止他们被解析成三字母词 |
| ' | 用于表示字符常量' |
| \“ | 用于表示一个字符串内部的双引号 |
| \\ | 用于表示一个反斜杠,防止它被解释为一个转义序列符。 |
| \a | 警告字符,蜂鸣 |
| \b | 退格符 |
| \f | 进纸符 |
| \n | 换行 |
| \r | 回车 |
| \t | 水平制表符 |
| \v | 垂直制表符 |
| \ddd | ddd表示1~3个八进制的数字。 如: \130 |
| \xdd | dd表示1~2个十六进制数字。 如: \X30 |
下面来详细介绍其中的几个
-
- '\?', 在书写连续多个问号时使用,防止他们被解析成三字母词
例如我想打印
(Are you ok??)必须写成
- '\?', 在书写连续多个问号时使用,防止他们被解析成三字母词
例如我想打印
printf("(Are you ok\?\?)");
因为??)是一个三字母词,对应],必需在‘?’前使用斜杠使它转义
- 2. '\\'表示一个反斜杠,常用于书写文件路径
printf("c:\\net\\nest.c");
-
- '\ddd',其中ddd表示1~3个八进制的数字 如'\130',130一个八进制数字,转换为十进制就是88,‘\130’表示的就是88这个ASCII码值对应的字符,也即字符‘X’ \Xdd的用法和这个类似
以上就是本次的全部内容了,有不对的地方欢迎大家批评指正。