变量的作用域和生命周期
作用域
请看下面简单的代码:
#include <stdio.h>
void add()
{
int t = 2;
printf("%d\n", t);
}
int t = 3;
int main()
{
int t = 0;
t++;
printf("%d\n", t);
printf("hehe\n");
add();
return 0;
}
我将C语言两个大括号括起来的部分称为程序块。变量的作用域就是变量的有效范围,和数学中的函数定义域有异曲同工之妙。在程序块中,变量的作用域就是自声明变量开始到该程序块结束这段区域。虽然程序块可以嵌套,但变量的作用域并不会因程序块的嵌套而有所增大。在上文的代码中,一共定义了3个变量t,从上到下,他们的作用域分别为add函数,整个程序,main函数。再看一段伪代码
for (int i = 0; i < 10; i++)
{
......
}
在该代码中,i就只在for循环内有效,在之外则无效。
int i = 0;
for (i = 0; i < 10; i++)
{
......
}
而该代码中,i在for循环内仍然有效。
如果全局变量和局部变量同名,那么在局部变量作用域内使用变量时会优先使用局部变量。
生命周期
全局变量的生命周期是整个程序,局部变量则是进入作用域,生命周期开始;出作用域,生命周期结束。
常量
C语言常量有四种类型
字面值常量
const修饰的常变量
#define修饰的标识符常量
枚举常量
#include <stdio.h>
#define PI 3.1415
enum gender// 枚举
{
Mail,
Femail,
Unknown
};
int main()
{
56;//字面常量
const int a = 25;//const 常变量
int const b = 56;
a = 5; b = 8;
return 0;
}
编译时,它会报错:
因为const修饰的变量无法修改。
字符串
“hello world.\n”
这样由双引号引起来的一串字符被称作字符串字面值,简称字符串。字符串结束标志是转义字符‘\0’,在计算字符串长度时,‘\0’不会算作字符串内容。
虽然上文字符串没有'\0',但是C语言在存储时会自动在末尾加上'\0'。看一段代码:
#include <stdio.h>
int main()
{
char str1[] = "Hello world!";
char str2[] = { 'a', 'b', 'c' };
char str3[] = { 'a', 'b', 'c', '\0' };
printf("%s\n", str1);//%s 打印字符串的格式化符号
printf("%s\n", str2);
printf("%s\n", str3);
return 0;
}
它的结果如下:
为什么第二个和第三个打印结果不同?首先字符串可以看做一种特殊的字符数组。在初始化那两个字符数组时,我们是以字符形式进行初始化,C语言并不会自动在储存时添加'\0'。所以在打印第二个时,它会一直打印,直到遇到'\0'停止打印;第三个因为我们手动添加'\0',所以只打印abc。
转义字符
在上文我们谈到了'\0',C语言的转义字符不止这一个。转义含义是转变意思,在字符串和字符中用处很大。
上图便是C语言的所有转义字符。第二个到第四个主要在字符串中使用。例如,如果你要打印一个文件路径:
#include <stdio.h>
int main()
{
printf("D:\Lenovo\PCManager");
return 0;
}
结果如下:
为什么反斜杠会消失,实际上我也不知道,毕竟是随手写的。初步分析C语言将形如'\'+字符的形式看做转义字符,但打印的这个字符串中,两个都是无效的,因此无法作为转义字符使用,所以会打印出L和P,而单纯的反斜杠则被省略了。如果读者有更好的见解,希望在评论区告知。
5~11的转义字符主要是一些特殊作用,最后两个则可以表示字符。
字符常量
我们一般使用字符常量来给字符型变量赋值。一般由单引号括起来的单个字符被称为字符常量。字符常量由四种形式
#include <stdio.h>
int main()
{
char a = 65;//使用相应字符的ASCII码
char b = 'A';//单引号括起来的字符
char c = '\101';//转义字符8进制
char d = '\x41';//转义字符16进制
printf("%c\n", a);
printf("%c\n", b);
printf("%c\n", c);
printf("%c\n", d);
return 0;
}
结果如下:
注:使用转义字符表示字符时,一定要加单引号。
之后的知识,可以在相应章节进行讲解,现在应该可以写一个hello world吧?
这里再说一下题外话,作者当时学C语言是看《C Prime Plus》的,这本书非常的细致,但我当时看时,看到数据类型就不想看了,因为太多了!!!他讲数据类型太细腻了(以我水平来看),我觉得当时我如果看《C与指针》可能情况就不是现在这样。当然也许是作者我太懒了(〃'▽'〃)。