在计算机科学和计算机编程中,数据类型是数据的一个属性,编译器只有知道了数据的类型,才知道怎么操作数据。C语⾔提供了丰富的数据类型来描述⽣活中的各种数据。例如,使⽤整型类型来描述整数,使⽤字符类型来描述字符,使⽤浮点型类型来描述⼩数。
一、基本数据类型与复合数据类型
基本数据类型是指最基本的数据类型,包括整型、浮点型、字符型、布尔型等。而复合数据类型则是由多个基本数据类型组成的数据类型,包括数组、结构体、枚举等。
这里主要介绍基本数据类型。
- 字符:字符型数据是用单引号括起来的单个字符,如’a’、‘b’、‘=’、‘+’、'?'都是合法字符型数据。在这里单引号只起定界的作用,并不代表字符。定义方法:char------字符类型
- 整型:整型数据即整数,包括正整数、负整数和零。定义方法:int------整型,short[int]------短整型,long[int]------长整型,long long[int]------长长整型
- 浮点型:带小数点的数,即小数点可以浮动。定义方法:float------单精度浮点型,double------双精度浮点型,long double------更高精度的浮点型
- 布尔型:布尔型数据取值只有true或false,使用前需包含头文件<stdbool.h>。定义方法:_Bool------布尔型
注:C语言中0表示假,非0值表示真
二、signed和unsigned
在C语言中,signed和unsigned是用来修饰整型和字符型数据类型的关键字,用于指定该类型的取值范围和表示方式。
- signed:用于声明有符号的类型,即该类型带有正负号,包含负值。
- unsigned:用于声明无符号的类型,即该类型不带有正负号,只包含0和正整数。
注:整型(int)默认是带有正负号的,即int等价于signed int ;字符型(char)默认是否带有正负号,由当前系统决定,即char不一定等价于signed int 。
// vs2022中各类型的取值范围定义
signed short int a; // 范围为 -32768~32767
unsigned short int a; // 范围为 0~65535
signed char c; // 范围为 -128 到 127
unsigned char c; // 范围为 0 到 255
vs2022环境中对各整型和字符型变量取值范围的定义:见vs2022中的limits.h文件
vs2022环境中对各浮点型变量取值范围的定义:见vs2022中的float.h文件
查看方式:使用everything软件搜索limits.h文件,打开Visual Studio 2022下的limits.h文件
everything软件下载地址:https://www.voidtools.com/downloads/
计算类型创建的变量的大小:sizeof()
#include <stdio.h>
int main()
{
// sizeof(),计算变量所占内存的大小,单位为字节
printf("%d\n", sizeof(char)); // 输出打印 1
printf("%d\n", sizeof(short)); // 输出打印 2
printf("%d\n", sizeof(int)); // 输出打印 4
printf("%d\n", sizeof(long)); // 输出打印 4 C语言规定:sizeof(long)>=sizeof(int)>
printf("%d\n", sizeof(long long)); // 输出打印 8
printf("%d\n", sizeof(float)); // 输出打印 4
printf("%d\n", sizeof(double)); // 输出打印 8
return 0;
}
计算机中常见的基本单位及换算:
- bit(位),最小的存储单位,存放一个二进制数,即 0 或 1,简写为b
- Byte(字节),计算机处理数据的基本单位,8个二进制位为一个字节,一个汉字占两个字节,一个ASCLL码占一个字节,一个中文标点占两个字节,一个英文标点占一个字节,简写为B
- 1Byte=8bit,1KB=1024Byte,1MB=1024KB,1GB=1024MB,1TB=1024GB,1PB=1024TB
三、变量
变量:C语言中经常变化的量(值)
常量:C语言中不变的量(值)
创建变量的语法:数据类型+空格+ 变量名
int age; // 创建整型变量age
float sum; // 创建单精度浮点型变量sum
char ch; // 创建了字符变量ch
_Bool flag; // 创建布尔类型变量flag
变量的初始化:在创建变量的同时给了一个初始值
int age = 18; // 创建整型变量age并初始化值为18
float sum = 66.6f; // 无f时编译器默认识别为double类型,加f后为float类型
char ch = 'w';
_Bool flag = true;
变量的分类:
- 全局变量:在大括号外部定义的变量为全局变量,可以在整个工程中使用,放在内存的静态区
- 局部变量:在大括号内部定义的变量为局部变量,只能在局部范围内使用,放在内存的栈区
#include <stdio.h>
int global = 100; //全局变量
int main()
{
int local = 56; //局部变量
printf("%d\n", local);
printf("%d\n", global);
return 0;
}
注:当局部变量和全局变量同名的时候,局部变量优先使⽤。
四、操作符
(1)算术操作符(+、-、*、/、%)
C语⾔中为了⽅便运算,提供了⼀系列操作符(也叫运算符)。其中有⼀组操作符叫:算术操作符,分别是+、-、*、/、%,都是双目操作符。
注:3 + 5,‘+’为操作符,3与5为操作数,有两个操作数,故为双目操作符。
#include <stdio.h>
int main()
{
int a = 4 + 3; // 加法
int b = 4 - 3; // 减法
int c = a * b; // 乘法,输出结果 7
int d1 = 7 / 2; // 整除,输出结果 3
float d2 = 7 / 2; // 整除,输出结果 3.000000
// 要使输出结果为小数,必须要使两个运算数(操作数)至少有一个为浮点数
float d3 = 7.0 / 2; // 除法,输出结果 3.500000
float d4 = 7 / 2.0; // 除法,输出结果 3.500000
// 求模(取余)运算,只能用于整数,返回两个整数相除的余数
int d5 = b % a; // 取余,输出结果 1
// 负数求模的规则是,结果的正负号由第⼀个运算数的正负号决定
int d6 = 3 % -5; // 取余,输出结果 3
int d7 = -3 % 5;// 取余,输出结果 -3
printf("%d %d %f %f %f %d %d %d",c,d1,d2,d3,d4,d5,d6,d7);
return 0;
}
注:
- %,求模(取余)运算,只能用于整数,返回两个整数相除的余数
- 负数求模的规则:结果的正负号由第⼀个运算数的正负号决定
- /,整除运算,若要输出结果为小数,则 a / b 中,a,b至少有一个为小数
- float 类型数据,打印输出时,默认保留6位小数
(2)赋值操作符:=和复合赋值
在变量创建的时候给⼀个初始值叫初始化,在变量创建好后,再给⼀个值,这叫赋值。
复合赋值:+=、-= 、*=、/= 、%=
#include <stdio.h>
int main()
{
int a = 10; //初始化
a = 20; //赋值,这⾥使⽤的就是赋值操作符
int b = 7;
int c = 5;
c = b = a - 1; // 连续赋值,从右向左依次赋值,输出结果 19
a += 3; // 复合赋值 等价于 a = a + 3; 输出结果 23
b -= 2; // 复合赋值 等价于 b = b - 2; 输出结果 17
printf("%d %d %d\n", c,a,b);
}
(3)单⽬操作符:++、- -、+、-
前⾯介绍的操作符都是双⽬操作符,有2个操作数。C语⾔中还有⼀些操作符只有⼀个操作数,被称为单⽬操作符。++、- -、+(正号)、-(负号)均为单⽬操作符。
#include <stdio.h>
// ++,自增1的运算;--,自减1的运算
int main()
{
int a = 10; //初始化
a++; // 等价于 a=a+1; 或 a+=1;
printf("%d\n", a); // 输出结果 11
++a;
printf("%d\n", a); // 输出结果 12
// 后置++,先使用a,后+1;前置++,先+1,后使用a
int b = a++;
printf("%d\n", b); // 输出结果 12
printf("%d\n", a); // 输出结果 13
int c = ++a;
printf("%d\n", c); // 输出结果 14
// 后置--,先使用c,后-1;前置--,先-1,后使用c
int d = c--;
printf("%d\n", d); // 输出结果 14
printf("%d\n", c); // 输出结果 13
d = --c;
printf("%d\n", d); // 输出结果 12
// -,负号,变正数为负数;+,正号,一般省略不写,效果一样
a = -d;
printf("%d\n", a); // 输出结果 -12
}
(4)强制类型转换
强制转换数据的类型。语法:(类型)
// 将3.14类型强制转换为int型,这种转换只取整数部分
int a = (int)3.14; // 输出结果 3
(5)逗号表达式
c语言提供了一种特殊运算符,逗号运算符,优先级别最低,它将两个及其以上的式子联接起来,从左往右逐个计算表达式,整个表达式的值为最后一个表达式的值。如a=(1+2,2+3),返回结果为5;a=(a=3×5,a×4),返回结果为60。
语法格式:
(expression1, expression2, ..., expressionN)
五、代码理解
#include <stdio.h>
int main() {
int a, b, c;
a = 5;
c = ++a;
printf("a=%d; c=%d\n",a,c); // 输出结果:a=6, c=6
system("pause"); // 暂停程序
// 执行过程:
// 先 b=++c; 再依次单独执行c++,++a,a++
b = ++c, c++, ++a, a++; // 非逗号表达式,此处赋值后,逗号后的表达式依次执行
printf("a = %d; b = %d; c = %d\n", a, b, c); // 输出结果:a=8,b=7,c=8
system("pause"); // 暂停程序
// 执行过程:
// 等价于 b = b + (a++ + c),先使用a,即b = b+(a+c),再a=a+1
b += a++ + c;
printf("a = %d;b = %d;c = %d\n", a, b, c); // 输出结果:a=9,b=23,c=8
return 0;
}
运行截图: