前面我们讲了什么是C语言、第一个C语言程序、数据类型,接下来我们再来学习一点新的东西,同样,知识也是点到为止,对C语言有一个初步的了解。
变量、常量
在我们日常生活中,通常有一些值是不变的(类如:圆周率、性别,身份证号码、血型...等等)
还有一些值是可变的(比如:年龄、体重、薪资)
在C语言中用常量来表示这些不变的值,用变量来表示这些可以改变的值。
1.1定义变量的方法:
数据类型 + 变量名 = 对其进行赋值;
inta=0;//这里对其赋值0,表示对a进行初始化//一个人的年龄intage=18; //一个人的身高floathigh=1.75f;//这里要注意:在VS编译器里面小数类型默认是double类型//在其后面加上f将其改变为float类型//表示一个字母charch=‘A’;
1.2变量的命名:
- 只能由字母(包括大写和小写)、数字和下划线(_) 组成。
- 不能以数字开头。
- 长度不能超过63个字符。
- 变量名中区分大小写的。
- 变量名不能使用关键字。(这里的关键字在后文中会有介绍)
注:变量的命名要有实际意义
1.3变量的分类:
- 局部变量
- 全局变量
局部变量指的是在一个函数内部定义的变量;
全局变量也称做外部变量,指的是函数外部定义的变量,可以被本程序所有对象或者函数引用。
变量要定义在当前代码块的最前面。
intc=30; //全局变量intmain() { inta=10; //局部变量intb=20; //局部变量printf("a=%d\n", a ); printf("b=%d\n", b ); printf("c=%d\n", c ); return0; }
1.3.1:特别注意:
当局部变量和全局变量的名称冲突时,会发生什么呢?
我们用代码来验证一下
inta=20; //全局变量intmain() { inta=10; //局部变量printf("a=%d", a); return0; }
当全局变量和局部变量的名称发生冲突时,优先编译局部变量。(当我们给变量命名的时候,尽量不要发生命名冲突的情况)
这里可以看到,当局部变量和全局变量命名发生冲突时,优先编译的是局部变量。
1.3.2:变量的使用:
当我们创建一系列的变量时,我们要使用所创建的变量,该怎么使用呢?
在使用之前我们来了解一些新的知识:
(1).输入输出语句:
scanf 函数可用于输入,printf 函数可用于输出
(2).基本语法
scanf ("%d %d", & x, & y);
我们这里假设我们输入的数为整形,所以打印整形需要的是%d,假设我们所要输入的是两个数,后面就跟&x,&y,这里x和y表示所要输入的值,要注意 & 表示取地址的意思,当我们输入一个数,我们要把它存起来,就需要取它的地址进行储存。
我们用代码来演示一下
求两个数的和:
intmain() { inta=0; intb=0; intsum=0; printf("请输入两个整数\n"); //输入scanf("%d %d", &a, &b); //这里注意:%d %d,表示在后面输入两个数的时候,中间要用空格隔开//计算 //如果这里是 %d,%d,则输入两个数的时候中间要加上,sum=a+b; //输出printf("sum=%d", sum); return0; }
这个代码很好的给我们演示了两个数的相加,以及scanf函数的使用
注:在VS这种编译器里面会对scanf函数进行警告,VS会感觉scanf函数不安全,它会建议我们使用scanf_s来替换scanf,但是,scanf_s只是VS里面所提供的,当我们将代码转移到其他编译器里面的时候,将不能编译,所以,scanf_s只能在VS里面使用,无法体现代码的跨平台性,那我们要解决这个问题,只需在我们的代码的第一行,#define _CRT_SECURE_NO_WARNINGS 1 ,就可以解决scanf函数警告。
1.4变量的作用域和生命周期:
作用域:
作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的而限定这个名字的可用性的代码范围就是这个名字的作用域。
1. 局部变量的作用域是变量所在的局部范围,也就是它只能在它所在的这个局部范围内起作用。
2. 全局变量的作用域是整个工程,只要是在这个工程里面,它都可以起作业。
生命周期:
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
2. 全局变量的生命周期是:整个程序的生命周期。
1.5常量:
C语言中的常量和变量的定义的形式有所差异。
C语言中的常量分为以下以下几种:
- 字面常量
- const 修饰的常变量
- #define 定义的标识符常量
- 枚举常量
1.5.1字面常量:
intmain() { 3.14;//浮点型常量55;//整型常量'a';//字符常量return0; }
简而言之就是直接在代码块里面写出的常量。
1.5.2const修饰的常变量:
intmain() { constintnum=10; printf("%d\n", num);//10return0; }
const修饰的常变量之后,被const修饰的这个变量则在后面不能被修改,但是它在本质上还是一个变量,只是不能被改变了,并不能说是被const修饰之后就变为常量了,所以才叫做常变量。
1.5.3#define定义的标识符常量:
intmain() { //MAX = 200;//errprintf("%d\n", MAX); //100return0; }
#define定义的标识符常量也是不可以被修改的,在这个代码中,如果要修改MAX的值,则会出现错误。
1.5.4枚举常量:
可以一 一列举,但不可以改变的常量(比如,三原色,性别...等等)
枚举关键字-enum
列出三原色:
enumColor{ RED, GREEN, BULE}; intmain() { enumColorcolor=RED; return0; }
我们来将枚举常量打印出来:
enumColor{ RED, GREEN, BLUE}; intmain() { enumColorcolor=RED; printf("%d\n", RED); printf("%d\n", GREEN); printf("%d\n", BLUE); return0; }
我们可以看到,枚举常量的默认值是从0开始的,一次向下递增1的。
字符串、转义字符、注释
2.1字符串:
"hello world.\n"
在C语言中:像这种由双引号引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
'A'
在C语言中:由一个单引号引起来的叫一个字符。
//%s - 打印字符串//%c - 打印字符
用代码来表示字符串和字符:
intmain() { charch='a'; //表示字符chararr[] ="abcdef"; //表示字符串return0; }
所以字符串有两种表示方法:
chararr1[]="abcdef"; chararr2[]= {'a','b','c','d','e','f','\0'};
第一种表示方法:在这个字符串的最后面默认有一个\0
第二种表示方法:在这个字符串的最后面要加上\0
我们再来了解一个新的概念:\0
字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串的内容。
当我们知道了\0,我们来打印字符串看看效果:
intmain() { chararr1[] ="abc"; //这种默认有\0,所以打印到c就停止打印chararr2[] = {'a', 'b', 'c'}; //这种后面如果不加\0,则会有什么效果呢?printf("%s\n", arr1); printf("%s\n", arr2); return0; }
我们可以看到,我们的字符串arr2中只有abc,但是为什么后面还有这么多奇怪的数字呢?
那是因为,我们没有加\0,所以,当打印字符串的时候,在打印完c之后没有遇到\0,所以就会一直打印一串随机的值,直到遇到\0才会停止打印,所以,在打印完c之后,再打印的值我们无法知道,是一串随机的值,arr1中的字符串后面默认就有一个\0,所以在打印完c之后,就会停止打印。
intmain() { chararr1[] ="abc"; chararr2[] = {'a', 'b', 'c','\0'}; printf("%s\n", arr1); printf("%s\n", arr2); return0; }
当在arr2中加上\0之后,我们打印的值就是我们所要的值。
当我们打印字符串的时候,打印到\0就停止
当我们求字符串长度的时候,也是要找到\0,统计的是\0之前出现的字符串个数
用代码求字符串的长度:
当我们求字符串长度的时候要用到库函数strlen
在使用strlen函数时,要引用头文件#include<string.h>
intmain() { intlen1=0; intlen2=0; chararr1[] ="abc"; chararr2[] = { 'a', 'b', 'c','\0' }; len1=strlen(arr1); len2=strlen(arr2); printf("%d\n", len1); printf("%d\n", len2); return0; }
可以看到arr1和arr2的长度都是3,这也就说明了在计算字符串长度时,也是遇到\0就停止计算,也就是说strlen函数在计算字符串长度时,只统计\0之前的字符串个数。如果不加\0,那得到的结果就是一个随机值。
2.2转义字符:
假如我们要在屏幕上面打印一个目录:c:\code\test.c
那我们该如何写代码呢?
intmain() { printf("c:\code\test.c\n"); return0; }
当我们运行起来的结果却大不相同
那这是为什么呢?
是因为\后面跟的某一些字母、数字、符号合起来表示的是一种转义字符的意思,转义字符顾名思义就是转变意思,那我们来看一下常见的转义字符:
转义字符 |
释义 |
\? |
在书写连续多个问号时使用,防止他们被解析成三字母词 |
\' |
用于表示字符常量' |
\'' |
用于表示一个字符串内部的双引号 |
\\ |
用于表示一个反斜杠,防止它被解释为一个转义序列符 |
\a |
警告字符,蜂鸣 |
\b |
退格符 |
\f |
进纸符 |
\n |
换行 |
\r |
回车 |
\t |
水平制表符 |
\v |
垂直制表符 |
\ddd |
ddd表示1~3个八进制的数字 |
\xdd |
dd表示2个十六进制数字 |
我们了解了转义字符,我们再来打印一个目录:c:\code\test.c
intmain() { printf("c:\\code\\test.c\n"); //我们这里使用\\将\c,\t原本的意思转变return0; }
当我们使用\\将\c,\t的意思转义,我们就可以打印目录。
2.2.1\ddd的意思:
\ddd是一个转义字符,表示的意思:ddd转化为10进制时所表示的ASCII码值,其中ddd表示1~3个八进制的数字。
我们用一段代码来表示一下:
\137----137是一个8进制的数字,转化为10进制是95,95所表示的ASCII码值是 _
intmain() { chara=0; a='\137'; //\137是一个字符所以放在''里面printf("%c\n", a); //打印字符用%creturn0; }
这里要注意:\ddd,这里面的一定是8进制的数字,8进制的数字要小于8,比如:\138,这就是两个字符:\13 和8,所以打印的时候打印的是13转化为10进制所对应的ASCII码值和8.
2.2.2\xdd的意思:
\xdd是一个转义字符,表示的意思是dd转化为10进制所表示的ASCII码值,其中dd表示2个十六进制数字。
我们来打印一下\x78
这里的78是一个16进制的数,转化为10进制是120,120所表示的ASCII码值是x
intmain() { chara=0; a='\x78'; printf("%c\n", a); return0; }
注:ASCII码值所表示的数的范围是有限的0~127,如果转化过后的值超过这个范围将不会打印出想要的结果。
说到这里,我们再来看一串代码:
//使用strlen函数要包含头文件intmain() { chararr[] ="c:\test\628\test.c"; intlen=strlen(arr); //计算arr字符串的长度printf("%d\n", len); return0; }
我们来计算一下这一串字符的长度,各位读者可以想一想这个结果是多少
这个字符串的结果是14,我们来一起看一下:
画的图有点挫,我们来将就的看一下,\t是一个转义字符算作一个字符,\62是类似于\ddd类型的转义字符也算作一个字符(这里的8不属于8进制的数字,所以是一个单独的字符)
注释
1. 代码中有不需要的代码可以直接删除,也可以注释掉
2. 代码中有些代码比较难懂,可以加一下注释文字
intAdd(intx, inty) { returnx+y; } /*C语言风格注释int Sub(int x, int y){return x-y;}*/intmain() { //C++注释风格//int a = 10;//调用Add函数,完成加法printf("%d\n", Add(1, 2)); return0; }
注释有两种风格:
C语言风格的注释 /*xxxxxx*/
缺陷:不能嵌套注释
C++风格的注释 //xxxxxxxx
可以注释一行也可以注释多行(建议使用C++注释风格)
伙计们,本篇的分享就到此结束,感谢各位阅览,如果有什么不足或者是看不懂的地方可以留在评论区,感谢大家!