变量的作用域和生命周期
作用域
作用域可以理解为起作用的范围,只有在固定区域代码才有效。
一个代码段 {}就是一个作用域,如果将变量a限定在一个作用域内,就只能在这个作用域内操作,如果超出作用域范围,就会报错。
局部变量的作用域就是就是变量所在的局部范围,也就是{}内部。
全局变量的作用域是整个工程。
在工程中创建add.c文件,在其中创建一个变量b,赋初值为50,然后在test.c文件中调用变量b,发现报错,原因是我们没有声明变量b,用extern关键字声明一下即可。声明的意思可以理解为打招呼,给程序说一声我们这里有个变量b。
声明变量b后即可正常调用变量b。
生命周期
常量
前面介绍过变量,变量即使赋予了初值后期也可以变更,常量反之,常量是不可以改变的量,C语言中,常量大概有如下几种:
字面常量
字面常量顾名思义就是字面上的常量。
int main()
{
'a';
10;
10.5;
}
如上都属于字面常量。
const修饰的常变量
const修饰的量本身是变量,在const修饰过后变为了常量,所以称为常变量。通常情况下用于我们创建了一个变量后,后期不想随意变更,所以可以加上一个const修饰,使其变为常变量。
在没有用const修饰前可以随意变更。
在const修饰过后,不能随意变更。
之所以称为常变量,本质上仍是变量,在用const修饰过后在变量上增加了一个常属性,使其不可修改,但本质仍是变量。
在我们创建数组的时候,指定数组内部元素个数一定是常量,我们将变量n用const修饰后,此时的n具有常属性,可我们发现仍然不可以创建数组,报错原因使我们使用了变量来创建数组。
由此可以看出,即使用const赋予了常属性,但本质上仍是变量。
#define定义的标识符常量
可以用define来定义一个量,以便后期使用,但定义后的值为常量,不可更改。
用define定义的M可以用来创建数组,说明M是一个常量。
字符串
C语言中由一串字符组成的,称为字符串
C语言中 %d是用来打印整形,%s是用来打印字符型。
字符串的结束标志是 \0,\0作为字符串的结束标志,但不算在字符串的长度中。
strlen可以计算字符串的长度。
从上面代码可以看出arr2都是按照我们想的显示出来,为什么arr1就会出现乱码,而且长度为15呢?
打开监视窗口可以看到,arr1尾部没有\0作为结束标志,这就会导致程序在内存中继续运行,直到找到\0才会停止,所以在arr1中的abc后面就会出现乱码的现象。
监视窗口中arr2的尾部有\0作为结束标志,所以可以正常运行。
想要改进上述arr1中的情况,只需要在arr1数组的尾端加上\0:
转义字符
在前面的程序中我们在printf函数中见过\n这样的字符,但是在程序中也没有显示出来,实际上在C语言中,这是转义字符,其作用就是转变意思的作用。
上面的代码并没有按照我们想的样子展现出来,这是因为在字符串中有一些转移字符,改变了原有意思。下面的表格将汇总常见的转义字符:
在这里需要详细说明的是\ddd转义字符与 \xdd转移字符,\ddd是八进制数字,如何看待他所表达的意思?是要将这个8进制数字先转换为10进制数字,然后对照其ASCALL码表,来查看对应表示。
例如\130 130为8进制数字,要先转变为10进制数字,为0*8^0+3*8^1+1*8^2 = 88,此时的10进制数字为88,对应ascall码的为x
下面的16进制数字和8进制同理,将16进制转化为10进制,在对照ascall表寻找。
选择语句和循环语句
在初识C阶段只是简单的介绍其用法,不做过多解读。
选择语句基本的时if,else语句,可以实现单分支语句和多分支语句。
循环语句包括while循环,for循环,以及dowhile循环。这里只简单的介绍while循环
当我们符合循环条件时,会一直循环,直到跳出循环。