变量还有两个重要的属性:作用域(scope)和生命周期(life cycle)
作用域指的就是这个变量程序哪里可以用,哪里不能使用。局部变量的作用域是定义它的那个代码块,在这个代码块中可以使用,离开这个代码块就无法使用;全局变量的作用域是整个工程文件,比如一个工程中有两个2个.c文件
int main()
{
extern int globalNumber0;
printf("%dn",globalNumber0);
return 0;
}
int globalNumber0 = 11011;
这里加的extern 是一个声明,是针对外部符号的,用来告诉编译器变量globalNumber0已经定义了,因为globalNumber0的定义与使用不是在同一个.c文件中的,如果不声明的话,编译器会报错。
| 定义 | 声明 |
| 只能定义一次 | 可以有多次声明 |
| 直接定义,有无声明均可 | 只能声明定义过的变量 |
比如这样的代码就可以正常编译,但如果删掉定义编译器就会报错:
int globalNumber0 = 11011;
#includeint main() { extern int globalNumber0; extern int globalNumber0; extern int globalNumber0; extern int globalNumber0; printf("%dn",globalNumber0); return 0; }
生命周期是指变量从创建到销毁的时间段。局部变量的生命周期 == 其作用域的周期,进入其作用域就创建,离开作用域就销毁;全局变量的生命周期 == 程序的周期。
| 字面常量 | 就是直接写出的数字字母之类,如: 1,2,3,a,b…… |
| #define定义的标识符常量 | #define name value 如: #define MAX 255 |
| 枚举常量 | 可以一一列举,如性别、月份、RGB三原色等,形如: enum name { …… }; enum为枚举关键字 比如: enum Tricolor { RED, GREEN, BLUE }; |
| ----------------------------------------------------------------------------------------------------------- | |
| const修饰的常变量 | const variableType = variableValue;严格来说,这不是常量,而是一个具有常属性的变量。与上面三种真正意义上的常量(不可修改)相比,const修饰的常变量虽然不能直接重新给它赋值,但可以用指针等方法修改它的值,且在C89/C90标准下,也不能用于指定数组的大小 |
需要注意的是枚举常量不可改变是指定义的常量本身({}中的内容),而用枚举常量创建的常量可以修改,比如这个程序可以通过编译,输出为
0
1
#includeenum Tricolor { RED, GREEN, BLUE }; int main() { enum Tricolor light = RED; printf("%dn",light); light = GREEN; printf("%dn",light); //RED = 1; return 0; }
但这个程序会报错
#includeenum Tricolor { RED, GREEN, BLUE }; int main() { RED = 1; return 0; }
字符串
C语言中没有单独定义字符串类型,它是用一串标记好的字符表示的。
被双引号""(double quote)引起的一串字符叫做字符串字面值(string literal),简称字符串。字符串以 为结束标志, 是一个转义字符,计算字符串长度时 为结束标志,不算内容。
比如:"abcd","1234","Hello,world"和""(空字符串)
字符串可以存放在字符数组中,它与直接存字符相比多一个 作为结束标志
#includeint main() { char arr0[] = {"Hello"}; char arr1[] = {'H','e','l','l','o'}; printf("%s ",arr0); printf("%dn",sizeof(arr0) ); printf("%s ",arr1); printf("%dn",sizeof(arr1) ); return 0; }
输出结果为
Hello 6
Hello…(这里会有一些随机值) 5
可以看出arr0的大小要比arr1多一个byte,因为arr0除了需要存Hello外还要在结尾存放一个 作为结束的标志,所以arr0的大小 == 字符数+1 。 的存在,让计算机在以字符串%s形式读取时能知道在哪里停止。而arr2没有存储 ,计算机就会一直读取后面的数据,知道读到 ,但是后面的数据我们没有进行处理,它们是随机的,因此arr1的Hello后面会跟随着一串长度不定的随机值。
如果在arr1后面加上一个0,它的输出就会与arr0相同,因为 的值 == 0(ASCII)
char arr1[] = {'H','e','l','l','o',0};
计算机上的数据是以二进制的形式存储的,为了能够存储字符,人们将不同的字符用特定的数字表达,如A是65、a是97,这种编码方式叫ASCII编码。
在计算字符串长度时,C语言标准库里提供了strlen函数,strlen(arr0)可以输出字符串长度注意引用string.h文件,根据之前的理论,可以推断出结果
#include#include int main() { char arr0[] = {"Hello"}; char arr1[] = {'H','e','l','l','o'}; printf("%dn",strlen(arr0) ); printf("%dn",strlen(arr1) ); return 0; }
输出结果为
5
5<=的随机数
转义字符
转变其他字符原来意思的字符
比如说'n'是一个普通字符,但在它前面加上一个,n就表示换行,成了一个字符,不是单纯的和n; t是水平制表符(效果与键盘上的Tab键相同)
| 转义字符 | 释义 |
| ? | 连续书写多个问号,防止被解析成三字母词trigraph,如:??)就可以表示] |
| ' | 表示字符常量 |
| " | 表示字符串内的双引号 |
| \ | 表示一个反斜杠,防止被解析成转移序列符 |
| a | 发出警告蜂鸣声 |
| b | 退格符 |
| f | 进纸(换页)符 |
| n | 换行 |
| r | 回车 |
| t | 水平制表符(效果与键盘上的Tab键相同) |
| v | 垂直制表符 |
| ddd | 表示1~3个8进制数,如:12 == 十进制的10,111 == 十进制的73 |
| xdd | 表示2个16进制数,如:11 == 十进制的17,57 == 十进制的87 |
| ?在一些新的编译器中已经被移除了,这些编译器不再识别三字母词 | |



