C语言基础入门:数据类型、变量声明与创建详解
C语言往期系列文章目录
往期回顾:
- C语言是什么?编程界的‘常青树’,它的辉煌你不可不知
- VS 2022 社区版C语言的安装教程,不要再卡在下载0B/s啦
- C语言入门:解锁基础概念,动手实现首个C程序
- C语言概念之旅:解锁关键字,字符,字符串的秘密,揭秘语句和注释,程序员的宝藏
文章目录
- C语言基础入门:数据类型、变量声明与创建详解
- C语言往期系列文章目录
- 前言回顾
- 一、数据类型
- 1.1 数据类型介绍
- 1.2 内置类型和自定义类型
- 1.2.1 字符类型
- 1.2.2 整型类型
- 1.2.3 浮点型类型
- 1.2.4 布尔类型
- 1.3 signed 和 unsigned
- 1.4 数据类型的取值范围
- 二、变量
- 2.1 变量的创建
- 2.2 变量的初始化
- 2.3 变量的分类
- 2.4 全局变量和局部变量的存储位置
- 总结
前言回顾
C语言,经典且强大,广泛应用于各领域,稳居语言排行榜前列。作为编译型语言,C语言需编译器将源码转为可执行文件,VS 2022是我们的首选工具。在C语言之旅中,我们首先构建了程序基础框架,包括项目、源文件和头文件。main函数作为程序入口,是编程的起点。随后,我们学习了printf函数,它功能强大,便于控制台文本输出。同时,初步了解了C语言的关键字和库函数。
在字符处理上,我们探讨了ASCII编码,每个字符都有独特的二进制表示。字符串由字符组成,用双引号括起。此外,还学习了转义字符,它们能表示一些特殊含义的字符。接下来的博客将深入C语言的变量、数据类型和操作符等内容,一起来踏上充满挑战的C语言学习之旅吧。
本期相关文章:
C语言中的常量变量,数据类型,操作符
本期内容:
一、数据类型
1.1 数据类型介绍
在我们日常生活中,信息无处不在,它们以各种各样的形式存在。比如,当我们去超市购物时,商品的价格通常以数字形式展示,如“苹果每斤5元”;而当我们查看天气预报时,温度则可能以“25℃”这样的数字加单位的组合形式出现。此外,我们还会遇到如“红色苹果”、“绿色蔬菜”这样的描述,它们通过文字或颜色来传达信息。
C语⾔提供了丰富的数据类型来描述生活中的各种数据。数据类型是编程语言中用于定义变量存储数据的方式和范围的重要概念。在C语言中,数据类型不仅决定了变量可以存储哪些值,还影响了这些值在程序中的运算方式和结果。所谓“类型”,就是相似的数据所拥有的共同特征,编译器只
有知道了数据的类型,才知道怎么操作数据。
1.2 内置类型和自定义类型
C语言使用整型类型来描述整数,使用字符类型来描述字符,使用浮点型类型来描述小数。
我们将数据类型分为,内置数据类型和自定义数据类型。
1.2.1 字符类型
以超市购物为例,商品的价格“5元”在C语言中可以被定义为一个整型(int)或浮点型(float/double)变量,具体取决于是否需要表示小数点后的数值。而“红色苹果”中的“红色”则可以被定义为一个字符型(char)或字符串型(string)变量,用于存储颜色信息。
在C语言中提供了三种字符类型,当我们在代码中看到char—它就代表字符,signed 是有符号的,unsigned 是无符号的。
char //字符类型
[signed] char //有符号的字符类型
unsigned char//无符号的字符类型
1.2.2 整型类型
在C语言中,整型类型用于存储整数,根据存储大小和范围的不同,C语言标准定义了多种整型类型,整型类型又分为四种,它们分别是短整型,整型,长整型,更长的整型。
如图所示:
long long int 是C99引入的,它可以用来表示更大的数值范围。
1.2.3 浮点型类型
在C语言中,浮点型类型用于存储小数数值,它主要包括以下三种类型:
float //单精度浮点型
double //双精度浮点型
long double //精度更高的双精度浮点型
那它为什么叫浮点型呢?这是小数点是可以浮动的。比如 3.14 ,我们可以写成0.314*10,也可以写成31.4 * 1 0 − 1 10^{-1} 10−1。
1.2.4 布尔类型
布尔类型(Boolean type)是C语言后来才引入的一种数据类型,用于明确地表示真(true)或 假(false)的值。然而,在布尔类型被正式引入之前,C语言已经方式来表示真假。
在C语言的早期版本中,以及在一些仍然使用旧式C代码的场景中,真假通常是通过整数来表示的。
- 0 被用作假(false)的表示。
- 非0值(通常是1,但也可以是其他任何非零整数)被用作真(true)的表示。
我们可以看这个stdbool库的介绍,cstdbool.h。也可以看具体的头文件声明。
#define bool _Bool
#define false 0
#define true 1
实际上呢,false 和 true 在vs中的代表仍然是0和1来表示真和假的关系。所以我们在使用bool的时候要包括头文件。
使用如下:
#include<stdbool.h>
#include<stdio.h>
int main()
{
_Bool flag = false;
if (flag)
printf("flag is true\n");
if (flag == false)
printf("flag is false\n");
return 0;
}
1.3 signed 和 unsigned
C语言使用 signed 和 unsigned 关键字修饰字符型和整型类型的。
signed 关键字,表示⼀个类型带有正负号,包含负值;
unsigned 关键字,表示该类型不带有正负号,只能表示零和正整数。
设想一下,在超市购物时,你可能会遇到两种不同的情况:一种是你的账户余额,它可能有正有负(比如存入或支出);另一种是你购买的商品数量,它只可能是正数或零(因为你不能购买负数件商品)。
#include <stdio.h>
int main()
{
// 账户余额,可能为正也可能为负
signed int balance = 100; // 初始存款100元
balance -= 50; // 支出50元
if (balance < 0)
{
printf("账户余额不足!\n");
} else
{
printf("账户余额:%d元\n", balance);
}
// 商品数量,只能为非负数
unsigned int ItemCount = 5; // 购买了5件商品
ItemCount++; // 再增加1件商品
printf("购买商品数量:%u件\n", ItemCount);
return 0;
}
对于 int 类型,默认是带有正负号的,也就是说 int 等同于 signed int 。
由于这是默认情况,关键字 signed ⼀般都省略不写,但是写了也不算错。
signed int a;
// 等同于int a;
int 类型也可以不带正负号,只表示非负整数。这时就必须使用关键字 unsigned 声明变量。
unsigned int a;
//等同于unsigned a;
//非负整数
所以上述我们表示数据类型的时候,可以省略的地方都加了[],但是有些地方还是不省略的好,让代码简洁美观,易读,是程序员的基本素养。
特别注意的是,C语言规定 char 类型默认是否带有正负号,由当前系统决定。
这就是说, char 不等同于 signed char ,它有可能是 signed char ,也有可能是unsigned char 。这⼀点与 int 不同, int 就是等同于 signed int 。
1.4 数据类型的取值范围
有的小伙伴这时候就疑惑了,为什么有这么多signed和unsigned数据类型,它们有什么区别呢?
我们先来通过整型看,取unsigned的好处。
整数变量声明为 unsigned 的好处是,同样长度的内存能够表示的最大整数值,增大了⼀倍。
比如,16位的 signed short int 的取值范围是:-32768 ~ 32767,最大是32767;而 unsigned short int 的取取值范围是:0~65535,最大值增大到了65,535。
32位的 signed int 的取值范围可以参看 limits.h 中给出的定义。
我们也可以通过 VS 2022 直接看头文件的部分。
//整型
#define SHRT_MIN (-32768)
#define SHRT_MAX 32767
#define USHRT_MAX 0xffff
#define INT_MIN (-2147483647 - 1)
#define INT_MAX 2147483647
#define UINT_MAX 0xffffffff
#define LONG_MIN (-2147483647L - 1)
#define LONG_MAX 2147483647L
#define ULONG_MAX 0xffffffffUL
#define LLONG_MAX 9223372036854775807i64
#define LLONG_MIN (-9223372036854775807i64 - 1)
#define ULLONG_MAX 0xffffffffffffffffui64
其实每⼀种数据类型有自己的取值范围,也就是存储的数值的最大值和最小值的区间,有了丰富的类型,我们就可以在适当的场景下去选择适合的类型。如果要查看当前系统上不同数据类型的极限值:
limits.h 头文件中说明整型类型的取值范围。
float.h 头文件中说明浮点型类型的取值范围。
为了代码的可移植性,需要知道某种整数类型的极限值时,应该尽量使用这些常量。
二、变量
了解清楚了类型,我们使用类型做什么呢?类型是用来创建变量的。
什么是变量呢?C语言中把经常变化的值称为变量,不变的值称为常量。
什么叫变量?这是C语言引入的概念,我们生活中有一些值一直是发生变化的,一些是一直没发生变化的。把那些永远不会变化的值叫做常量,那些可能会发生变化的叫变量。常量是用来描述那些不变的量。本期我们不讨论常量,我们讨论变量。
2.1 变量的创建
变量创建的语法形式是这样的:
data_type name;
//data_type --- 数据类型
//name --- 变量名
当我们想描述一个人的年龄,体重,名字的首字母的时候,就可以创建如下的变量:
int age; //整型变量
char ch; //字符变量
double weight; //浮点型变量
而这就是变量的创建.
2.2 变量的初始化
变量在创建的时候就给⼀个初始值,就叫变量的初始化.
例如:
int age = 10; //整型变量
char ch = 'c'; //字符变量
double weight = '65.1'; //浮点型变量
注意,这里浮点型变量有一个细节点:
这时候可能会发生截断,也因为这样,我们可以在后面加一个f.
所以我们可以使用我们刚刚学的数据类型来进行创建变量,这时候用哪种数据类型更合适,就用哪种。
2.3 变量的分类
C语言中的变量分类又分为,全局变量和局部变量.
- 全局变量:在⼤括号外部定义的变量就是全局变量
全局变量的使用范围更广,整个工程中想使用,都是有办法使用的。- 局部变量:在大括号内部定义的变量就是局部变量
局部变量的使用范围是比较局限,只能在自己所在的局部范围内使用的。
通俗一点说,在大括号外部的变量是全局变量。什么叫全局变量呢?我们举例来说:
int global_val = 10;//全局变量
int main()
{
int a = 6;
{
int b = 10;
printf("b = %d\n", b);
printf("global_val = %d\n", global_val);
}
printf("global_val = %d\n", global_val);
return 0;
}
咱们发现前面一个global_val可以打印,后面一个global_val也可以打印。而如果我们想按同样的方式去打印b变量,就会发现问题。
所以b是一个局部变量,只能在a的括号内发生作用。
那如果全局变量和局部变量同名呢?
int main()
{
int a = 6;
{
int a = 10;
printf("a = %d\n", a);
}
printf("a = %d\n", a);
return 0;
}
这时候会发现,局部变量会优先使用,出了局部,就会使用全局变量。
2.4 全局变量和局部变量的存储位置
⼀般我们在学习C/C++语⾔的时候,我们会关注内存中的三个区域:栈区、堆区、静态区。
- 局部变量是放在内存的栈区
- 全局变量是放在内存的静态区
- 堆区是用来动态内存管理的(后期会介绍)
总结
数据类型和变量只是我们踏入C语言世界的初步探索,未来的学习之路还很长。只要保持不急不躁的心态,坚持不懈地努力,我们就一定能够掌握更多知识,成为强大的C语言编程者。