一、作用域:
变量的作用域指某一变量在程序中可以被访问的一定区域。在作用域之外,该变量将不可被访问。
位于一对花括号内的语句被称为一个代码块。代码块内的变量的作用域为该花括号范围。如下面的语句在编译时将报错。因为a被定义的范围是在内部的花括号内,在此花括号外,变量a无法被访问。
int main()
{
{
int a = 10;
}
printf("%d",a);
}
全局变量:定义在花括号外,即int main(){}这个花括号外的变量,称为全局变量,该变量在整个工程中都可以被访问。
局部变量:在花括号内,只在它作用域内可以被访问的变量。
extern关键字:
有一个常见的问题,就是如果想在不同的.c文件中使用同一个变量并传递其值,可以使用全局变量。但前提是需要在主函数的.c文件中使用extern关键字声明。
如下面的这个片段是在含有主函数的.c文件中:
extern int g_val;
int main()
{
printf("&d",g_val);
}
下面这个片段则是在其他需要使用g_val这个变量的.c文件中,在该文件中给其赋值,在上面的程序中将打印出100。
int g_val = 100;
二、生命周期:
变量的创建和销毁之间的时间段称为生命周期。
- 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
- 全局变量的生命周期是:整个程序的生命周期。
三、常量:
C语言中的常量和变量的定义的形式有所差异。
C语言中的常量分为以下以下几种:
1.字面常量
2.const 修饰的常变量
3.#define 定义的标识符常量
4.枚举常量
#include <stdio.h>
//枚举举例
enum Sex
{
MALE,
FEMALE,
SECRET
};
//括号中的MALE,FEMALE,SECRET是枚举常量
int main()
{
//字面常量演示
3.14;//字面常量
1000;//字面常量
//const 修饰的常变量
const float pai = 3.14; //这里的pai是const修饰的常变量
//#define的标识符常量 演示
#define MAX 100
printf("max = %d\n", MAX);
//枚举常量演示
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
return 0;
}
const 关键字修饰的变量将具有常属性,其值不能被改变,一开始声明的时候是多少就是多少。比如上面代码中,pai的值在整个程序执行过程中都将保持3.14,如果你想要更改pai的值,如pai = 100;这个语句将会报错。
枚举常量的关键字为enum,该声明与结构体很相似。枚举常量的值是从0开始的,上面代码最后输出MALE,FEMALE,SECRET的值为0,1,2。如果一开始在enum中给MALE赋值为2的话,则输出以此为2,3,4。
四、字符串+转义字符+注释:
(一)字符串
1.字符串就是零个或多个字符,并且以一个NUL字节结尾,即“\0”结尾。字符串由双引号括起来“”,字符由单引号‘’括起来。
2.字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。
3.头文件“string.h”包含了使用字符串函数所需的原型和声明,最好能引用它。
4.打印字符串:printf("%s",“abc”);
5.strlen()函数可以返回某字符串的长度,当然,是不包括\0的长度,如“abc”使用strlen(“abc”);返回的长度就是3。
代码举例:可以看到,因为arr2中没有字符串的结束标志\0,因此编译器或取其内容和长度时,除了访问’a’‘b’'c’3个字符之外,又继续向后访问,而之后的地址不可知,因此内容出现乱码,长度出现随机值15,而非3。在添加结束标志\0后的arr3中,则无此现象。
(二)转义字符
1.转义字符:
字符集(Character Set)为每个字符分配了唯一的编号,我们不妨将它称为编码值。在C语言中,一个字符除了可以用它的实体(也就是真正的字符)表示,还可以用编码值表示。这种使用编码值来间接地表示字符的方式称为转义字符(Escape Character)。
转义字符以\或者\x开头,以\开头表示后跟八进制形式的编码值,以\x开头表示后跟十六进制形式的编码值。对于转义字符来说,只能使用八进制或者十六进制。
字符 1、2、3、a、b、c 对应的 ASCII 码的八进制形式分别是 61、62、63、141、142、143,十六进制形式分别是 31、32、33、61、62、63。下面的例子演示了转义字符的用法:
char a = '\61'; //字符1
char b = '\141'; //字符a
char c = '\x31'; //字符1
char d = '\x61'; //字符a
2.常用转义字符表:
3.转义字符的长度:
注意,转义字符也是有长度的,但字符串的结束标志\0却不算做长度。
\t这样的算一个字符长度。
//程序输出什么?
#include <stdio.h>
int main()
{
// \62被解析成一个转义字符
printf("%d\n", strlen("c:\test\628\test.c"));
return 0;
}
在上面的代码块中,程序输出的值为14.原因是所有转义字符算作一个长度。\t \62 \t这三个转义字符算作3个长度。而8没有被包含进\628的原因是这是一个8进制转义字符,而8进制是不可能出现8的。
(三)注释
注释是用来解释复杂代码的。
//和/* */