数据类型与变量:C语言的核心概念
C语言提供了丰富的数据类型来描述生活中的各种数据。使用整型类型来描述整数,字符类型来描述字符,浮点型类型来描述小数。所谓“类型”,是相似数据的共同特征,编译器只有知道了数据的类型,才知道如何操作数据。
本文主要探讨C语言的内置数据类型,包括字符型、整型、浮点型、布尔类型等,并介绍它们的长度、取值范围以及变量的使用。
1.数据类型概述
1.1 字符型
char //character
[signed] char //有符号的
unsigned char //⽆符号的
1.2 整型
整形-integer->int 整形
short int-短整型
long int-长整型
long long int-更长的整形
//这里的int可以省略
1.3 浮点型
float-单精度浮点型
double-双精度浮点型
long double-更大取值范围的浮点型
1.4 布尔类型
C语言最初并未为布尔值单独设置类型,而是使用整数`0`表示假,非零值(一切非零,而不单单指的1)表示真。C99标准引入了布尔类型,专门用于表示真假值。布尔类型的使用需要包含头文件`<stdbool.h>`,其变量的取值为`true`或`false`。
#define bool _Bool
#define false 0
#define true 1
代码展示:
_Bool flag = true;
if (flag)
printf("i like C\n");
①true/非零数时打印“I like c”
②false/0时不打印
1.5. 数据类型的长度
每种数据类型都有自己的长度,使用不同的数据类型可以创建不同长度的变量,变量长度的不同会导致存储数据范围的差异。
1.5.1 sizeof操作符
`sizeof`是一个关键字兼操作符,用于计算操作数的类型长度,单位为字节。它可以作用于类型、变量或表达式。如果操作数是表达式,可以省略括号。`sizeof`的计算结果是`size_t`类型,其具体类型由系统决定,可能是unsigned int、unsigned long或unsigned long long。
sizeof( 类型 )
sizeof 表达式
在不同系统中,`sizeof`的返回值类型可能不同,这可能影响程序的可移植性。因此,C语言引入了类型别名`size_t`,以统一表示`sizeof`的返回值类型。
代码展示:
#include <stdio.h>
int main()
{
int a = 10;
printf("%zd\n", sizeof(a));
printf("%zd\n", sizeof a);//a是变量的名字,可以省略掉sizeof后边的()
printf("%zd\n", sizeof(int));
printf("%zd\n", sizeof(3 + 3.5));
return 0;
}
1.5.2数据类型长度示例
在VS2022 X64配置下,输出如下:
| 数据类型 | 长度(字节) |
|----------------|--------------|
| char | 1 |
| short | 2 |
| int | 4 |
| long | 8 |
| long long | 8 |
| float | 4 |
| double | 8 |
| long double | 16 |
想亲自试试的可以用下面的代码:
#include <stdio.h>
int main()
{
printf("%zd\n", sizeof(char));
printf("%zd\n", sizeof(_Bool));
printf("%zd\n", sizeof(short));
printf("%zd\n", sizeof(int));
printf("%zd\n", sizeof(long));
printf("%zd\n", sizeof(long long));
printf("%zd\n", sizeof(float));
printf("%zd\n", sizeof(double));
printf("%zd\n", sizeof(long double));
return 0;
}
在VS2022 X64配置下的输出:
1 1 2 4 4 8 4 8 8
1.5.2 `sizeof`中表达式不计算
#include <stdio.h>
int main()
{
short s = 2;
int b = 10;
printf("%d\n", sizeof(s = b+1));
printf("s = %d\n", s);
return 0;
}
`sizeof`在编译时根据表达式的类型确定结果,而表达式的执行则在程序运行期间完成。因此,在运行期间,`sizeof`不会执行表达式,而是直接根据类型返回结果。
2. `signed`和`unsigned`
C语言使用`signed`和`unsigned`关键字修饰字符型和整型类型:
- `signed`:表示类型带有正负号,可包含负值。
- `unsigned`:表示类型不带正负号,仅表示零和正整数。(可以省略int)
对于`int`类型,默认为`signed int`,因此关键字`signed`通常省略。但`unsigned`关键字必须明确声明,以表示变量仅存储非负整数。
例如:
- 16位的`signed short int`取值范围为`-32768~32767`,最大值为`32767`。
- 16位的`unsigned short int`取值范围为`0~65535`,最大值为`65535`。
在32位系统中,`signed int`的取值范围可参考`limits.h`中的定义。
2.1 字符类型
字符类型`char`也可以设置为`signed`或`unsigned`。但C语言规定,`char`类型默认是否带有正负号由当前系统决定。这意味着`char`可能等同于`signed char`,也可能等同于`unsigned char`。这与`int`不同,`int`默认等同于`signed int`。
3. 数据类型的取值范围
C语言提供了丰富的整型和浮点型数据类型,每种类型都有自己的取值范围。为了确保代码的可移植性,建议使用`limits.h`和`float.h`中的常量来获取当前系统上的数据类型极限值。
3.1 整型取值范围
`limits.h`文件中定义了整型类型的取值范围:
3.2 浮点型取值范围
`float.h`文件中定义了浮点型类型的取值范围,包括精度、最大值和最小值等。
4. 变量
4.1 变量的创建
变量是C语言中用于存储可变值的容器,而常量则是不变的值。变量的创建语法如下:
```c
类型名 变量名;
data_type name;
| |
| |
数据类型 变量名
int age; //整型变量
char ch; //字符变量
double weight; //浮点型变量
变量在创建的时候就给⼀个初始值,就叫初始化。
int age = 18;
char ch = 'w';
double weight = 48.0;
unsigned int height = 100;
4.2 变量的分类
- **全局变量**:在大括号外部定义的变量,其作用范围较广,可在整个工程中使用。
- **局部变量**:在大括号内部定义的变量,其作用范围仅限于所在的局部区域。
#include <stdio.h>
int global = 2023;//全局变量
int main()
{
int local = 2018;//局部变量
printf("%d\n", local);
printf("%d\n", global);
return 0;
}
#include <stdio.h>
int n = 1000;
int main()
{
int n = 10;
printf("%d\n" n);//打印的结果是多少呢?
return 0;
}
4.3变量存储区域
全变量和局部变量存储区域(栈区 堆区 静态区)
局变量是存放在内存的栈区
全局变量是存放在内存的静态区
动态内存分配在内存的堆区