一、常量是什么?
在程序运行过程中,值不能被改变的量。
eg:数字1、2、3、0.1、3.14和字母’a’、‘b’、”hello“等
常量的分类:
(1)整型常量:
整数。如1、2、3、10000、0、-100、0x8A等
可以是十进制、八进制或十六进制的常量。前缀指定基数:0x或0X表示16进制,0表示八进制,不带前缀则默认表示10进制。
整数常量也可以带一个后缀,后缀是U和L的组合,U表示无符号整数(unsigned),L表示长整数(long),后缀可以是大写,也可以是小写,U和L的顺序任意。
(2)实型常量:
有两种表示形式
①十进制小数形式:由数字和小数点组成。如123.456、-12.34等
②指数形式:由于计算机输入或输出时无法表示上标和下标,所以规定以字母e或E代表以10为底的指数,注意:e和E之前必须要有数字,且e和E后面必须为整数,不能写成e4、12e2.5.
正确表示:12.34e3(表示12.34*10^3)、-67.89e-16 (表示-67.89 *10 ^16)等
(3)字符常量:
有两种形式的字符常量
①普通字符常量:用单引号括起来的一个字符
如‘a’、‘B’、‘3’、‘#’。不能写成‘ab’或‘12’,注意单引号只是一个界限符,字符是指用单引号括起来的符号,不包括单引号。字符型在内存中是以ASCII码形式存储的,例如字符‘a’的ASCII码的十进制为97,在存储单元中存放的是97的二进制形式。
ASCII码 是 American Standard Code for Information Interchange 的缩写
83-53H-S
②转义字符:以字符\开头的字符序列
\n换行
\t水平制表符tab
'单引号
"双引号
\x十六进制形式
十六进制的转义字符 ‘\x56’ :x后面的十六进制数最多两个,最少一个
(4)字符串常量
用一对双引号括起来的若干个字符
如“ABC”、“123”等,用双引号把若干个(0个、1个、更多)字符括起来,字符串不包括双引号。注意不能写成‘abc’、‘123’,单引号内只能包含一个字符,表示字符常量;双引号内可以包含一串字符,表示字符串常量。
(5)地址常量
每一个常量、变量、数组的地址在程序运行期间是不能够被改变的,称为地址常量。
二、define 和 const
宏定义
PI也是常量,数值为3.1415;注意:在进行宏定义时,没有分号结束标记
const
定义语法:const 类型名 变量名 = 变量值
- #include <stdio.h>
- #define PI 3.1415 // 常量
- int main(void)
- {
- const int r = 3; // 只读变量
- float s = PI * r * r; // 圆的面积 s = PI x 半径的平方
- float l = 2 * PI * r; // 圆的周长 l = 2 * PI * r
- printf("圆的周长为:%.2f\n", l); // 指定小数点后保留2位, 对第3位做,4舍五入
- printf("圆的面积为:%.2f\n", s); // 指定小数点后保留2位
- return 0;
- }
复制代码
三、变量是什么?
变量:在程序运行中,值可以改变的量。
变量代表一个有名字的、具有特定属性的一个存储单元,可以用来存储数据,也就是变量的值。
变量必须先定义后使用。命名规则应符合标识符命名规则。
理解变量、变量定义、变量声明
变量:本质上是程序可操作的存储区的名称。C语言中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中。
变量定义:告诉编译器在何处创建变量的存储,以及如何创建变量的存储。变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表。
变量声明:向编译器保证变量以指定的类型和名称存在。这样编译器在不需要知道变量完整细节的情况下也能继续进一步编译,变量声明只在编译时有它的意义,在程序链接时编译器需要实际的变量声明。
变量声明有两种情况:
①需要建立内存空间的。例如:int a在声明的时候就已经建立了存储空间。
②不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。
除非有extern关键字,否则都是变量的定义。
标识符命名规则
①只能由字母、数字、下划线组成,并且数字不能作为开头。(字母是区分大小写的)
#¥特殊字符不能作为标识符
②不允许是关键字,同一个作用域范围内定义的标识符不允许重名。
③工程实践中:通常常量使用大写、变量使用小写。大小写严格区分
变量的作用域
C语言中的变量,按照作用域的范围可分为两种, 即局部变量和全局变量。作用域是变量可以被访问的区间。
局部变量
局部变量也称为内部变量。局部变量是在一个函数内部或一个代码块中定义的变量,只能在被函数和代码块范围内有效。 离开该作用域后再使用这种变量是非法的。
- void test()
- {
- int b = 20; // b是一个局部变量,在test函数内有效
- }
-
- int main()
- {
- int a = 10; // a是一个局部变量,在main函数内有效
- test();
-
- //块作用域的可见范围是从定义处到包含该定义的块的末尾;块是用花括号“{}”括起来的代码区域,定义在块中的变量具有块作用域。
- {
- int c = 30; //c也是一个局部变量,在大括号内有效
- }
- }
复制代码
主函数main中定义的变量a也只能在主函数内有效,虽然主函数调用了test函数,但a并不在test函数内有效,主函数也不能使用test函数内定义的b变量。
允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。虽然允许在不同的函数中使用相同的变量名,但是为了使程序明了易懂,不提倡在不同的函数中使用相同的变量名。
形式参数也是局部变量。
在一个函数内部,用大括号括起来的一段代码块,叫做程序块。在程序块中定义的变量,也是只在本程序块中才有效的。离开本程序块,就无效,释放内存单元。
全局变量
全局变量也称为外部变量,它是在函数外部定义的变量。 它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。 只有在函数内经过说明的全局变量才能使用。全局变量的说明符为extern。 但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。
- int test(int x, int y)
- {
- int z;
- z = x > y? x : y;
- return z;
- }
-
- int main()
- {
- extern int a, b;
- printf("%d\n", test(a, b));
- }
-
- int a = 10, b = 2;
复制代码
static修饰的全局变量不能被其他文件所访问,只能限制于本文件中访问。成为静态外部变量。
四、c语言中常见的关键字
数据类型关键字
| 关键字 | 说明 |
|---|
| char | 声明字符变量 |
| double | 声明双精度变量 |
| float | 声明浮点型变量 |
| int | 声明整型变量 |
| short | 声明短整型变量 |
| long | 声明长整型变量 |
| unsigned | 声明无符号类型变量 |
| signed | 声明有符号类型变量 |
| struct | 声明结构体变量 |
| union | 声明共用体或联合数据类型 |
| void | 声明函数无返回值或无参数,声明无类型指针 |
| enum | 声明枚举类型 |
控制语句关键字
| 关键字 | 说明 |
|---|
| for | 遍历循环 |
| do | 其后紧跟循环体 |
| while | 条件循环或死循环 |
| break | 跳出当前循环 |
| continue | 终止本次循环,开始下次循环 |
| if | 条件语句 |
| else | 条件语句否定分支 |
| goto | 无条件跳转语句 |
| switch | 用于多条件判断语句 |
| case | 多条件判断语句分支 |
| default | 开关语句的其它分支 |
| return | 函数返回语句 |
存储类型关键字
存储类定义C程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。
| 关键字 | 说明 |
|---|
| auto | 声明自动变量,所有局部变量默认的存储类 |
| extern | 用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用extern时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。 当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用extern来得到已定义的变量或函数的引用。【extern是用来在另一个文件中声明一个全局变量或函数】 |
| register | 用于定义存储在寄存器中而不是RAM中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个word),且不能对它应用一元的’&‘运算符(因为它没有内存位置) |
| static | 指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用static修饰局部变量可以在函数调用之间保持局部变量的值。 static修饰符也可以应用于全局变量。当static修饰全局变量时,会使变量的作用域限制在声明它的文件内。 |
其他关键字
| 关键字 | 说明 |
|---|
| const | 声明只读变量 |
| sizeof | 计算数据类型长度(字节数) |
| typedef | 给数据类型取别名 |
| volatile | 所修饰的对象不能被编译器优化 |