常量与变量
一、常量
在整个程序中,值不会发生变化的数据。
在C语言中,常量不能被赋值,只有变量才能被赋值。
1、整型常量
整型常量:用于表示整数值,可以使用十进制、八进制、十六进制等形式表示。
例如:
int num1 = 10; // 十进制整型常量
int num2 = 012; // 八进制整型常量
int num3 = 0xA; // 十六进制整型常量
2、字符型常量
字符型常量:用于表示单个字符,使用单引号(‘’)表示。
例如:
char ch = 'A'; // 字符型常量
3、浮点型常量
浮点型常量:用于表示实数值,包括单精度浮点数和双精度浮点数。
(1)、一般形式:
例如:
float num4 = 3.14; // 单精度浮点型常量
double num5 = 2.718; // 双精度浮点型常量
(2)、指数形式:
[+/-]M.N<e/E>[+/-]T
- M:整数部分(1位数)
- N:小数部分
例如:
3.145e+10 == 3.145 * 10^10
-1.23e-8 = -1.23 * 10^(-8)
345.12 == 3.4512 * 10^2 == +3.4512e+2
4、字符串常量
(1)、字符串常量:用于表示多个字符组成的字符串,使用双引号(“”)表示。
(2)、字符串特点:任意一个字符串的末尾都有一个隐藏字符–空字符(‘\0’)
(3)、空字符是字符串的结束标志
例如:
char str1[] = "Hello"; // 字符串常量
//"Hello" == 'H','e','l','l','o','\0'
5、标识符常量
(1)、标识符常量:通过#define指令定义的常量,使用时直接替换为对应的值。
(2)、定义的一般形式:#define 标识符 常量表达式 ---- 宏定义
例如:
#define N 100 // 标识符常量
#define STR "hello world"
int num6 = N; // 使用标识符常量
//N == 100
printf(STR);
//STR == hello world
注意:常量表达式最终结果可以是整型常量、字符型常量、浮点型常量、字符串常量
二、变量
变量在程序中,值可以发生变化的数据。
变量在使用之间必须事先定义声明。
1、变量的定义
变量的定义在使用之前,需要先定义变量,包括变量的类型和名称。
例如:
int num7; // 定义整型变量
char ch2; // 定义字符型变量
float num8; // 定义单精度浮点型变量
2、变量定义的一般形式
(1)、变量定义的一般形式:包括类型说明符和变量名,可以使用关键字、标识符和运算符。
(2)、<存储类型> <数据类型> 变量名;
存储类型:auto、register、extern、static
auto
(1)、auto(自动存储类型):
内存空间由系统自动分配和回收,关键字auto可省略。
适用于在函数中定义的局部变量。
auto int a;//等价于 int a;
register
(2)、register(寄存器存储类型):
声明为寄存器存储类型的变量会加载到寄存器中运行,提高程序运行效率。
注意:不一定能成功申请到寄存器。
适用于对访问速度要求较高的变量。
extern
(3)、extern(外部调用存储类型):
用于在一个文件中调用另一个文件中的非静态全局变量。适用于多个文件之间共享数据的情况。
static
(4)、static(静态存储类型):
用于修饰局部变量和全局变量,限制其作用域或延长其生命周期。
适用于需要在函数调用间保持数据持久性的变量。
数据类型可以是基本数据类型(如int、char、short、float等)或用户自定义数据类型(如数组、结构体等)。
例如:
3、变量的初始化
初始化:在定义的同时赋初值
int a = 10;
int a = 10, b, c = 20; // int a = 10, int b, int c = 20
4、变量的赋值
int a = 10;
a = 20;
注意:赋值运算时,赋值符号两边的数据类型要一致
5、局部变量和全局变量
局部变量
(1)、局部变量:定义在函数或代码块内部的变量。
(2)、特点:
- 1、内存空间由系统自动分配和回收。
- 2、生命周期:限于函数或代码块内部。
- 3、作用域:在函数或代码块内。
(3)、局部变量在其所在的函数或代码块内可以被访问和修改,但在外部无法访问。
(4)、局部变量的作用范围通常较小,仅在其定义的函数或代码块内有效,不会与其他函数或代码块中的同名变量产生冲突。
全局变量
(1)、全局变量:定义在函数外部或在多个函数之间共享的变量。
(2)、特点:
- 1、内存空间在程序运行期间一直存在
- 2、生命周期延长到整个程序运行期间
- 3、作用域在整个程序内部,可以被任何函数访问和修改。
- 4、如果一个全局变量定义之后没有赋值,该全局变量的初始值默认为0
全局变量在不同函数之间共享数据,但也因此可能导致数据被多个函数同时修改而产生错误。因此,全局变量的使用应当谨慎,避免滥用。
三、 强制数据类型转换
1、显示类型转换
1、显示类型转换:通过某种方法或者格式强制进行转换
一般用于将高类型转换为低类型。
一般形式:(转换的新类型)表达式;
例:
int a = 3;
float b = 4.12;
a = (int)b; //将b的类型暂时转换为int给a赋值,取整而不是四舍五入
//a == 4
注意:强制类型转换不会修改原本数据的值
2、隐式类型转换
2、隐式类型转换:自动转换
用于将低类型转换为高类型,编译器会自动进行转换。
例:
int a = 3;
float b = a; // 将a的值自动转换为float类型赋值给b
// b == 3.0
需要注意的是,隐式类型转换可能会导致数据精度丢失或错误的结果,因此在进行类型转换时应当谨慎使用,确保转换结果符合预期。