C语言初学者必看篇一(数据类型,常量变量,转义字符),甘货满满,还请耐心看完。

前言

Helllo,大家好,我是传火者。

        在绝大多数人开始接触并选择C语言作为他的第一门计算机语言时,无论是在学校还是一些学习网站尤其是自学,通常采用的都是模块化的教学或者学习方式。由于C语言不同模块之间又存在较多的关联。在开始学习时,我们时常会有这样那样的困惑,不明白为什么要这么做,也不知道哪些内容是重点,哪些只需要了解即可,导致很多初学者学习起来事倍功半。

       为了能够快速,高效,深入地学习C语言,我们需要对C语言的总体知识有些大概地了解,初步地认识。这也是我创作本专栏内容的初衷。好了,废话不多讲,下面就由我来带领大家在知识的海洋中尽情遨游吧!


目录

数据类型

C语言内置基本数据类型

注意:

为什么要有这么多数据类型?

变量常量

变量

变量定义的一般形式:                    

重点:

推荐编程写法:

注意:

数据类型(char)知识补充:

重点:

​编辑

变量的命名

局部变量和全局变量

局部变量:

全局变量:

重点:

建议:

常量

字面常量

const修饰的常变量

​编辑

注意:

#define定义的标识符常量

重点:

枚举(enum)常量(初学仅需认识)

注意:

转义字符

关于转义字符 '\?': 

关于转义字符 '\''

关于转义字符 '\\'

​编辑

关于转义字符 '\ddd'

关于转义字符 '\xdd'

字符串

关于转义字符 '\"'

关于转义字符 '\0'


数据类型

C语言内置基本数据类型

数据类型大小(字节)输入输出格式
char字符数据类型1%c
short短整型2%hd
int整型4%d
long长整型>=4%ld
long long更长整形8%lld
float单精度浮点型4%f
double双精度浮点型8%lf

字符型用来描述字符或者字符串,整形用来描述整数,浮点型用来描述小数,double描述的小数精度高于float。

仅供了解:在C99语法的C语言中还引入了:

数据类型
_bool
long double

注意:

C语言没有专门的字符串类型!

为什么要有这么多数据类型?

这个问题主要有两点:

在回答其一之前,请同学们先想一想,我们为什么要学习编程,发展编程呢?

当然是为了解决现实生活中的实际问题嘛。现实生活中的的数据多种多样,C语言丰富的数据类型使得它能够充分,有效地表达各种各样的数据。

其二与内存的有效使用有关。内存是有限且珍贵硬件资源,为了合理的使用内存,我们将同一类型的数据又划分成不同大小的数据类型,以此来保证内存可以被合理的分配给不同大小的数据。

(有关内存的知识会在后面学到,这里同学们只需知道为什么要有这么多数据类型即可。)

变量常量

在现实生活中,有些值通常是固定不变的,如:性别,身份证号等,而有些值是可以改变的,如:年龄,身高,薪资等。

在C语言中,我们把在程序运行过程中值不能被改变的量称为常量,值可以改变的量称为变量。

下面我们一一进行介绍:

变量

变量定义的一般形式:                    

如:

char ch;
int a;
float b;
double c;

​

当然,我们也可以一次定义多个变量,变量中间用逗号(英文)隔开:

char ch1,ch2,ch3;
int a, b, c;

关于变量定义,我们可以这样理解:

当我们在定义一个变量时,就相当于我们告诉操作系统,我们需要你给我们分配一块内存空间,用来存放变量,变量名就是这块分配给我们的内存空间的名字,而这块内存空间的大小则由数据类型名决定,如:int a;指就是我们向操作系统申请一块大小为4个字节的内存空间用来存放整形变量,这块空间的名字就是a

重点:

在定义的变量没有被赋值前,变量里面存放的是随机值,如:我们对下面这段代码进行调试:

int main()
{
	int a;
	return 0;
}

第一次运行: 

 第二次运行:

推荐编程写法:

通过以上两次运行的调试,我们不难看出,在变量没有初始化和赋值前,里面存放的是一个随机值。

因此,以上两种写法无疑是不太好的,很可能会使我们编写的程序出现bug。所以,我们应该在定义变量的同时就对其进行初始化,让一切仅在我们的掌握之中。(规范,良好的编程习惯更是成为一名优秀的程序员,进大厂拿高薪的必备准则,在这里我向大家推荐一本书《高质量C++/C编程指南》作者:林锐,讲述的就是编程的规范写法。希望大家都能养成良好的编程习惯,利己利他。)那么如何进行初始化呢?很简单,那就是在对变量进行定义的时候就为它赋一个初值,如下:

char ch1 = '0';
char ch2 = 0;
int a = 0;
float b = 0.0f;
double c = 0.0;

注意:

在C语言中,为了区分,对字符变量初始化和赋值时,需要用单引号将字符引起来0.0默认的数据类型是double,因此当我们对float型的变量进行初始化或赋值时,需要在数值后面加上f来表示这是float型数据

相信细心的小伙伴一定已经发现,我在上面的代码中对字符变量ch2初始化时,并没有用单引号将0引起来,这是为什么呢?下面我来补充一段相关的char类型知识来解答大家的疑问。

数据类型(char)知识补充:

对于计算机而言,能够识别的是二进制,那么对于字符:'A','S',',','2','d','0'等该怎么在计算机中表示和存储呢?后来,人们想到了一种方式,既然计算机只能识别二进制数,字符不方便存储,那么就给每个字符编个号,字符编号总可以当成数值存储吧,人们就给A编号65,a编写97,依此类推,把键盘上所有能敲出来的字符都编了一个唯一的号,这种编码方式就被叫做ASCII编码,而每一个字符都有一个编号,这个编号就叫做ASCII码值,因此字符与它们对应的ASCII码值就组成了ASCII码表,如下:

重点:

也就是说,字符数据在内存中存储的其实是它的ASCII码值, 相当于数值的存储,即实质上char类型本质上也与short,int,long,long long一样都是整型,它们在内存中的存储方式相同。下面我们举例说明:

#include<stdio.h>
int main()
{
	char ch1 = 'a';
	char ch2 = 97; //字符'a'的ASCII码值是97
	int a = 97;
	int b = 'a';//数值97对应的字符是'a'
	printf("%c %c %c %c\n", ch1, ch2, a, b);
    //printf函数的作用是打印,将在本章函数中详细讲解。%c是指以字符形式打印变量,\n是换行符
	printf("%d %d %d %d\n", ch1, ch2, a, b);//%d是指以十进制整数打印变量
	return 0;
}

运行结果:

分析:从这段代码我们可以看出,字符变量ch1整型变量b存的都是字符'a',变量ch2整型变量a存的是都是数值97,当以字符(%c)形式打印变量时,它们的打印结果都是 a ;当以十进制整数(%d)形式打印变量时,它们的结果都是97,而97就是字符'a'的ASCII码值,以及我们可以用数值对char型变量进行初始化,用字符对int型变量进行初始化,由此可以看出,char型实质上就是整型数据类型

变量的命名

标准规定:

1.只能由字母(包括大写和小写),数字和下划线(_)组成。

2.不能以数字开头。

3.长度不能超过63个字符。

4.变量名区分大小写,即用大写字母命名的变量和用小写字母命名的变量不是同一变量。

5.作用域相同的变量名字不能相同,否则会引发重定义错误。

6.变量名不能使用关键字(后面会讲)。

建议:

在解决实际问题时,变量的命名最好要有实际意义,如当创建一个变量表示年龄时,用age作为变量名,以此类推。让变量名具有特殊的含义。这是一个好的编程习惯。

局部变量和全局变量

局部变量:

局部变量,顾名思义,就是在局部可以使用的变量。局部变量的作用域就是包含他的大括号内部,它的生命周期就是从进入它的作用域开始,到出它的作用域结束。下面我们举例说明:

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

将上面这段代码放到编译器中编译时会报一个这样的错误:

我们明明已经创建了变量b,为什么编译器会报一个变量b未声明的错误呢?很简单,因为变量b是一个局部变量,它的作用域是包含它的那对大括号,当程序开始运行到进入变量b的作用域后,变量b自动创建,当程序运行出变量b的作用域后,变量b自动销毁,操作系统回收分配给变量b的内存空间。依此类推,局部变量a的作用域就是整个main()函数内部,生命周期是main()运行结束。因此,我们说局部变量是有生命的,它的生命周期就是从程序执行进入它的作用域后开始,到出它的作用域后结束。如下:

全局变量:

全局变量,顾名思义,就是全局都可以使用的变量,即它的作用域是整个工程,它的生命周期是整个程序的生命周期。如下:

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

运行结果:

重点:

局部变量名可以和全局变量名相同,而不会引发重定义错误,且当局部变量名和全局变量名相同时,局部变量优先!示例如下:

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

运行结果: 

建议:

虽然局部变量可以和全局变量重名,但我并不推荐这种写法,要尽量做到局部变量和全局变量名字不同。且由于全局变量谁都可以使用,谁都可以修改,因此它并不安全,所以要做到尽可能少的使用全局变量!

常量

字面常量

字符常量:‘1‘,’k',‘@’,‘[','<','.'等。

整型常量:1,2,-5,40,500等。

浮点型常量:0.4,0.65,5.2,8.5f等。

const修饰的常变量

const是C语言的一个关键字,被const修饰的变量不可被更改,此时的变量就具有了常属性,如下:

没有被const修饰时:

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

运行结果:

 被const修饰时:

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

报错:

注意:

虽然此时变量a具有了常量不可更改的属性,但在C语言中,它本质上还是一个变量,而不是常量(在C++中是常量),因此我们称它为常变量。如何证明呢?在不支持C99语法的C语言编译器中,指定数组(后面会讲)大小的值只能是常量或者常量表达式,因此我们举例说明:

#include<stdio.h>
int main()
{
	const int a = 0;
	int arr[5] = { 0 };
	int arr1[4+3] = { 0 };
	int arr2[a];
	return 0;
}

错误:

由此可见,变量a即使被const修饰而具有了常属性,但在C语言中,它实质上还是一个变量。

仅供了解:即使在支持c99语法的编译器中变量可以作为数组的指定大小,但是此变长数组不能进行初始化。

#define定义的标识符常量

注意:#define 和#include是C语言预处理指令,不是关键字!

示例如下:

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

运行结果:

如何说明MAX是常量而不是和const修饰的变量一样是常变量呢?如图:

可以看到,MAX的值既不能更改,又可以为数组指定大小,因此MAX的实质是常量。

重点:

#define的作用就是相当于给数值5改了个名字叫做MAX。举一个不太恰当的例子:就像有一个人名叫二狗,小名狗蛋,无论是叫二狗还是叫狗蛋,都是指一个人,这就是常量;而变量就相当于重名,即使名字(值)相同,但实质上并不是一个人。这是可能会有小伙伴这么想,这#define岂不是在脱了裤子放屁,多此一举吗?我直接用5不就行了?为什么还要专门给5改个名字?原因有二:其一是数值并没有实际的含义,并不能直观表达我们所要表达的意思,因此我们对它重命名,让它具有实际的含义,更能确切表达我们内心的想法;其二是当你想要对你所写的一段代码中的所有数值5改成数值10时,你需要要对每个数值5都进行修改,而采用了#define定义标识符常量的方法后,只需要在定义把标识符常量的值从5改成10即可改变,示例如下:

未采用#define定义标识符常量:

修改变量值为10:

 采用#define定义标识符常量:

修改变量值为10:

枚举(enum)常量(初学仅需认识)

所谓枚举(enum),即一一列举,那为什么要有怎么个东西呢?因为在我们的生活中,有一些值是可以一一列举的,如:性别:男,女,保密。因此我们定义一个枚举类型SEX(性别)

,此枚举类型有三个取值:MALE,FEMALE,SECRET,且枚举类型SEX的取值十进制默认从0开始 。示例如下:

注意:

枚举类型enum SEX的三个取值是常量,不能被修改!如下:

转义字符

顾名思义,转义字符就是转变意思的字符,它们实质上还是一个字符。为什么要有转义字符呢?是因为我们键盘上有很多字符很难输入,如:换行,回车等,因此我们就在普通字符前面加上一个\,转变它的意思,就像在'n'前面加上\使它从普通的字符'n'转变成一个换行符'\n'   大家可以在前面的SACII码表中一一找到这些转义字符,罗列如下:

转义字符释义
\n 换行
\0字符串结束标志
\r 回车
\? 在书写连续多个问号时使用,防止他们被解析成三字母词
\' 用于表示字符常量'
\"用于表示一个字符串内部的双引号
\\ 用于表示一个反斜杠,防止它被解释为一个转义序列符。
\a 警告字符,蜂鸣
\b 退格符
\f 进纸符
\t 水平制表符
\v垂直制表符
\ddd d d d表示1~3个八进制的数字。 如: \130 表示字符X
\xddd d表示2个十六进制数字。 如: \x30 表示字符0

相信大家对于\n已经不陌生了,它的作用就是换行,下面我们重点介绍 '\?' ,' \'',  '\\' , '\ddd',  '\xdd' ,' \" ', '\0' 这几个字符,剩余字符大家可以自行尝试,去体会它们的作用。

关于转义字符 '\?': 

在早期时,??)是一个三字母词,其等价于 ],因此在有些编译器上我们想打印这样一段内容时:printf("(are you ok??)")   在有些编译器上就会把??)解析成],导致打印出来这样的结果:(are you ok?],为了防止??)被解析成三字母词,就诞生了转义字符'\?',当我们这样打印时:printf("(are you ok\??)")  就会打印出:(are you ok??) 如图:

关于转义字符 '\''

因为当我们要给一个字符变量赋值或者修改时,我们需要用 ' ' 将字符引起来,而当我们想赋值 ' 给字符变量时,会导致它和前 ' 结合成一对 ' '  后 '  落单,从而导致编译错误,导致我们无法赋值 ' 给字符变量,如下图:

因此我们需要用\将其转义,让它不要和前 ' 结合,如下:

此时,字符 ' 就可以顺利赋值和打印。 

关于转义字符 '\\'

当我们不想让转义字符被解析成转义字符时,就可以用\将其转义会正常的字符,下面我们举例说明:

如图,当我们不想让字符 '\n' 被解析成转义字符换行符,就想让它表示为普通的 '\'和 'n' 时,就可以用转义字符 '\\' 达到目的:

关于转义字符 '\ddd'

此处的d并不是指字符 'd',而是指八进制的数字,就像我们日常生活中小时采用24进制,星期才有7进制,月份采用30或31进制,转义字符 '\ddd'表示的就是一个八进制数,示例如下:

将十进制数 83 4 39 转换为8进制时分别对应的数字是:123(8进制) ,4(8进制) ,47(8进制),因此我们可以看出,转义字符 '\ddd' 表示的是八进制数。

关于转义字符 '\xdd'

此转义字符与 '\ddd' 类似,下面我们直接举例说明:

将十进制的 35 4 71 转换为16进制时分别对应的数字是:23(16进制)4 (16进制)71(16进制)。因此转义字符 '\xdd'表示的是16进制数。

在介绍转义字符 '\"'   和  '\0' 之前,我们先引入一个概念:字符串。

字符串

像 "hello world" 这样用" "引起来的一串字符称为字符串字面值,简称字符串。而字符串的结束标志是 ' \0'   在" "末尾自动隐藏有一个 ‘\0’   在计算字符串长度时 '\0'是结束标志,不算作字符串内容 (在后面数组的讲解中会详细介绍) 。

关于转义字符 '\"'

与前面的转义字符 '\''同理,当我们想在字符串中输出字符 " 时,会与字符串的 " "冲突,如下:

因此我们用 \ 对 " 转义,让它不要与前 " 结合,如下:

关于转义字符 '\0'

'\0'是字符串的结束标志,当识别到 '\0' 时,就认为字符串已经结束,即使 '\0' 后面还有内容,也不会理会,示例如下:

总结:

本期内容主要对数据类型,常量变量,转义字符的相关知识进行了初步的认识,剩余内容如(数组,函数,操作符等)会在下期进行介绍,希望我的内容能对你有所帮助,如有错误,还请指正。

(如果帮到你的话,还请点个赞吧0.0)

  • 44
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值