一.C语言的数据类型:
char:1字节,用于表示字符或小整数。
short:2字节,用于表示短整数。
int:通常为4字节,用于表示整数。
long:通常为4或8字节,用于表示长整数。
long long:8字节,用于表示更长的整数。
float:4字节,用于表示单精度浮点数。
double:8字节,用于表示双精度浮点数。
long double:通常为8或16字节,用于表示更高精度的浮点数。
bool:用于表示真(true)或假(false)的值。
enum:用于定义一组具有离散取值的常量。
*:指针是一种特殊的数据类型,用于存储变量的内存地址。
数组(Array):用于存储相同类型数据的集合,可以通过索引访问其中的元素。
结构体(Structure):用于定义一种包含不同数据类型成员的复合数据类型。
共用体(Union):用于定义一种可以存储不同数据类型的数据结构,但只能同时存储其中的一种数据类型。
构造类型(Typedef):用于为已有数据类型定义一个新的名称。
C语言的数据类型还可以通过修饰符进行扩展,包括:
有符号(signed):表示数据可以是负数字。
无符号(unsigned):表示数据只能为非负数。
短(short):表示数据占用较少的内存空间。
长(long):表示数据占用较多的内存空间。
PS:先作了解,后期熟悉后运用自然会记住,但是一定要看一遍!!!
常用数据类型的大小:(字节)
#include
int main()
{
printf("%d\n", sizeof(char));
printf("%d\n", sizeof(short));
printf("%d\n", sizeof(int));
printf("%d\n", sizeof(long));
printf("%d\n", sizeof(long long));
printf("%d\n", sizeof(float));
printf("%d\n", sizeof(double));
printf("%d\n", sizeof(long double));
return 0;
}
输出结果:
计算机的存储单位主要包括位(bit)、字节(byte)和更高级的单位如千字节(KB)、兆字节(MB)、吉字节(GB)和太字节(TB)等。
位(bit):位是计算机中最小的存储单位,每个位可以存储一个二进制码,值为0或1。字节由8个位组成,即1B=8bit。
字节(byte):字节是计算机中用于描述存储容量和传输容量的基本单位。一个字节由8个位组成,通常用于表示一个字符。
千字节(KB):1KB=1024B。
兆字节(MB):1MB=1024KB。
吉字节(GB):1GB=1024MB。
太字节(TB):1TB=1024GB。
二.常量和变量:
不改变的量
分类
整型常量:可以是十进制、八进制或十六进制形式。例如,12、0x1A(十六进制)、022(八进制)。
实型常量:表示小数或科学计数法形式的数。例如,3.14、1.5e3(表示1.5乘以10的3次方)。
字符常量:用单引号括起来的单个字符。例如,'a'、'B'。
定义格式
#define 标识符 常量
例:#define CONSTANT_NAME 10
可以改变的量,要先定义再使用。
定义格式
变量类型 变量名列表
如:
int a; // 声明一个整型变量a
float b; // 声明一个浮点型变量b
char c; // 声明一个字符型变量c
int a = 10; // 声明并初始化一个整型变量a为10
float b = 3.14; // 声明并初始化一个浮点型变量b为3.14
char c = 'A'; // 声明并初始化一个字符型变量c为'A'
PS:“//”在C语言中是注释。
变量的命名规则
标识符只能包含字母、数字和下划线,并且第一个字符必须是字母或下划线。
不能使用C语言的关键字作为变量名。例如,int、float、char等都是关键字,不能用作变量名。
区分大小写,例如int a;和int A;会被视为两个不同的变量。
命名应具有描述性,能够清晰地表达变量的用途或存储的数据类型。例如,使用int age;而不是int a;。
避免使用数字开头,但可以使用下划线开头,例如int 3a;是错误的,而int _3a;是正确的。
长度限制:C语言的标识符长度没有固定限制,但通常不超过128个字符。
三.整型数据:
整常数。
在C语言中,整型常量是直接写在代码中的数字,表示一个具体的数值,不可以更改的值。整型常量可以是十进制、八进制、十六进制。
十进制整型常量:直接写数字,不带前缀,如123,-456。
八进制整型常量:以0开头,如0123表示八进制数。
十六进制整型常量:以0x或0X开头,如0x1A表示十六进制数。
#include
int main()
{
int a = 123; // 定义一个int类型变量a,并初始化为十进制整型常量123
int b = 0123; // 定义一个int类型变量b,并初始化为八进制整型常量123
int c = 0x1A; // 定义一个int类型变量c,并初始化为十六进制整型常量26
return 0;
}
在上述代码中,a被定义为一个int类型变量,并初始化为十进制整型常量123。b被定义为一个int类型变量,并初始化为八进制整型常量123,即十进制的83。c被定义为一个int类型变量,并初始化为十六进制整型常量0x1A,即十进制的26。
用于存储整数。
整形数的长度与取值范围
长度
Byte(字节型):通常为无符号8位整数,占1个字节
short(短整型):有符号16位整数,占2个字节
int(整型):有符号32位整数,占4个字节
long(长整型):通常为有符号32位或64位整数,占4个字节或8个字节
long long(长长整型):有符号64位整数,占8个字节
取值范围
byte:0~255
short:-32,768~32,767
int:-2,147,483,648~2,147,483,647
long:在32位系统下为-2,147,483,648~2,147,483,647,在64位系统下为-9,223,372,036,854,775,808~9,223,372,036,854,775,807
long long:-9,223,372,036,854,775,808~9,223,372,036,854,775,807
不同类型整形数的应用场景
byte:常用于表示ASCII字符或较小范围的整数。
short:表示比byte更大范围的整数。
int:C++中最常用的整型之一,可以表示较大范围的整数。
long:适用于表示更大范围的整数,具体范围取决于系统架构。
long long:可表示最大范围整数的整型,适用于需要处理极大整数的场景。
整形变量的形式:
形式:类型说明符 变量名标志符;
例:
#include
int main()
{
int number; // 定义一个整型变量
number = 10; // 给变量赋值
printf("The value of number is: %d\n", number); // 打印变量的值
return 0;
}
整形数据的溢出:(先作了解)
在C语言中,整型数据的溢出通常不会由编译器自动检测,也不会产生任何形式的错误消息。如果发生溢出,溢出的数据可能被截断或者进入下一个数据单元,从而导致程序运行时的不正确行为。
四.实型数据:
实型也称作浮点型,实型常量也称作实数或者是浮点数。
表示方式:
十进制小数形式:这种形式由数字和小数点组成,小数点必须存在。例如,0.0、25.0、5.789、0.13、–456.789等都是合法的实数表示。
指数形式:这种形式由尾数、字母e或E和阶码组成。尾数必须是十进制数,e或E的两侧必须有数字,阶码(指数)必须是整数。例如,2.2E3表示2.2×10^3。
类型和存储方式:
在C语言中,实型常量默认按双精度(double)处理。如果需要表示单精度常量,可以在常量后加f或F。例如,3.14f表示单精度浮点数。
在内存中的存放形式:
与整型数的存储方式不同,浮点数是按照指数形式存放的,系统将数据分成小数部分和指数部分分别存放,小数部分按规格化的指数形式表示。单精度用4个字节存储,双精度用8个字存储,分符号位(s)、阶(e)、尾数(m)三部分。单精度数阶占8位,尾数占24位,符号位占1位;双精度数阶占11 位,尾数占53位,符号位占1位。
在程序运行过程中可以改变其值的变量
定义和分类
单精度(float):占用4个字节(32位),有效位数为6-7位,取值范围为3.4×10^−38到3.4×10^38
双精度(double):占用8个字节(64位),有效位数为15-16位,取值范围为1.7×10^−308到1.7×10^308
长双精度(long double):占用更多的存储空间,具体位数和精度依平台而异,通常比double类型有更大的精度和范围。
定义格式和初始化
定义实型变量的一般格式为:
数据类型 变量名1[, 变量名2, ...];
例:(省略了头文件引用与函数)
float x, y, z; //float在C语言中代表单精度浮点型数据类型
double a = 2.0, b, c; //double在C语言中代表双精度浮点型数据类型
初始化实型变量的一般格式为:
数据类型 变量名1[=初值1], 变量名2[=初值2], ...;
例:(省略了头文件引用与函数)
float x = 3.14;
double y = 123.456;
五.字符型数据:
字符型数据用单引号括起来,例如 'a'、'1'、'?' 等。字符常量可以是字母、数字或符号,但不能包含多个字符。例如,'abc' 不是合法的字符常量,因为它包含多个字符。
在内存中,字符型数据以ASCII码(见下)的形式存储。每个字符变量占用一个字节的内存空间。例如,字符 'a' 的ASCII码为97,在内存中以二进制形式 01100001 存储。
在C语言中,字符数据与整型数据是通用的,可以互相赋值和运算。例如,字符 'a' 的ASCII码为97,可以直接赋值给一个整型变量,反之亦然。这种转换使得字符型数据在处理时更加灵活。
转义字符以反斜线 \ 开头,后跟一个或多个字符,具有特定的含义。例如,\n 表示换行,\t 表示横向跳到下一个制表位置。转义字符主要用于表示那些无法直接输入的控制字符。
一般转义字符:
一般转义字符由反斜杠“\”和随后的一个字符组成,例如:
\t:制表符
\b:退格符
\\:反斜杠本身
\r:回车符
这些字符在编程中常用于控制输出格式或表示特殊的控制代码。
八进制转义字符:
八进制转义字符由反斜杠“\”和一个八进制数组成,例如:
\130:表示字符“X”
\141:表示字符“a”
八进制转义字符最多可以包含三个数字,例如\177表示控制字符。
十六进制转义字符:
十六进制转义字符由反斜杠“\”和字母“x”或“X”以及随后的两个十六进制数字组成,例如:
\x30:表示字符“0”
\x41:表示字符“A”
十六进制转义字符最多可以包含两个数字,例如\x7f表示控制字符。
六.变量赋初值:
为变量开辟空间时为其进行初始化的操作。
变量赋虽然比较简单理解,但有许多人不清楚变量赋初值与变量赋值有什么区别,虽然都是使用“=”完成的,但二者并不是相同的。
int main()
{
int a=10;
a=20;
}
在定义标识符a的时候给他内存空间存入10,即是对a完成初始化。
对a进行赋值是将a 内部的初始内容10替换成20。这就是这两者的区别。
七.运算符与表达式:
算术运算符
算术运算符用于执行基本的数学运算,如加法、减法、乘法、除法等。
int a = 21;
int b = 10;
int c;
c = a + b; // 加法
c = a - b; // 减法
c = a * b; // 乘法
c = a / b; // 除法
c = a % b; // 取模运算符,得到除法的余数
c = a++; // 自增运算符,整数值增加1
c = a--; // 自减运算符,整数值减少1
关系运算符
关系运算符用于比较两个值的大小关系,如等于、不等于、大于、小于等。
if(a == b) {
// 如果a等于b
}
if(a != b) {
// 如果a不等于b
}
if(a > b) {
// 如果a大于b
}
if(a < b) {
// 如果a小于b
}
if(a >= b) {
// 如果a大于或等于b
}
if(a <= b) {
// 如果a小于或等于b
}
PS:if循环后面会提及,先做了解。
逻辑运算符
逻辑运算符用于执行逻辑运算,如逻辑与(AND)、逻辑或(OR)和逻辑非(NOT)。
判断符号为:&& || !
if(a && b) {
// 如果a和b都为真
}
if(a || b) {
// 如果a或b任意一个为真
}
if(!a) {
// 如果a为假
}
位运算符
位运算符用于对整数在二进制位级别上进行操作,如按位与、按位或、按位异或等。(暂作了解)
c = a & b; // 按位与
c = a | b; // 按位或
c = a ^ b; // 按位异或
c = ~a; // 按位取反
c = a << 2; // 左移两位
c = a >> 2; // 右移两位
赋值运算符
赋值运算符用于将值赋给变量,包括简单赋值和复合赋值。(要结合后面的运算符优先级进行理解)
c = a; // 简单赋值
c += a; // 加且赋值
c -= a; // 减且赋值
c *= a; // 乘且赋值
c /= a; // 除且赋值
c %= a; // 模且赋值
c <<= 2; // 左移且赋值
c >>= 2; // 右移且赋值
c &= a; // 按位与且赋值
c ^= a; // 按位异或且赋值
c |= a; // 按位或且赋值
自增自减运算符
sizeof(a); // 返回变量的大小
&a; // 返回变量的地址
*a; // 指向一个变量
a ? b : c; // 条件表达式,如果a为真则取b,否则取c
++i
或 --i
,这些运算符会先将变量的值增加1(或减少1),然后再进行其他运算。例如,int a = i++;
会先将 i
的值增加1,然后再将增加后的值赋给 a
。i++
或 --i
,这些运算符会先进行其他运算,然后再将变量的值增加1(或减少1)。例如,int b = ++j;
会先将 j
的值增加1,然后再将增加后的值赋给 b
。 #include
int main() {
int a = 5;
int b = 5;
int c = 5;
int d = 5;
printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);
a++; // 等价于 a = a + 1
++b; // 等价于 b = b + 1
c--; // 等价于 c = c - 1
--d; // 等价于 d = d - 1
printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);
return 0;
}
输出:
一元运算符与二元运算符
在编程中,运算符根据操作数的数量可以分为一元运算符、二元运算符和三元运算符。这里将重点介绍一元运算符和二元运算符的区别。
一元运算符
一元运算符只需要一个操作数。常见的一元运算符包括:
递增和递减运算符:++ 和 --,用于对操作数进行增加或减少 。
正负号运算符:+ 和 -,用于表示正负数。
逻辑非运算符:!,用于对布尔值进行取反。
例如:
int a = 5;
a++; // a 变为 6
a--; // a 变为 5
boolean b = true;
b = !b; // b 变为 false
二元运算符
二元运算符需要两个操作数。常见的二元运算符包括:
算术运算符:+、-、*、/、%,用于执行加法、减法、乘法、除法和取模运算。
关系运算符:==、!=、>、<、>=、<=,用于比较两个操作数之间的关系,返回布尔值。
逻辑运算符:&&、||,用于执行逻辑与和逻辑或运算。
赋值运算符:=、+=、-=、*=、/=、%=,用于将右侧的值赋给左侧的变量。
位运算符:&、|、^、<<、>>、>>>,用于执行位操作。
int a = 5;
int b = 3;
int sum = a + b; // sum 为 8
boolean isEqual = (a == b); // isEqual 为 false
int bitwiseAnd = a & b; // bitwiseAnd 为 1
主要区别
操作数数量:一元运算符只需要一个操作数,而二元运算符需要两个操作数。
功能:一元运算符主要用于简单的增减、取反等操作,而二元运算符用于更复杂的算术、逻辑、关系等操作。
其他运算符
C语言还包括其他运算符,如条件运算符、逗号运算符、取地址运算符等。
sizeof(a); // 返回变量的大小
&a; // 返回变量的地址
*a; // 指向一个变量
a ? b : c; // 条件表达式,如果a为真则取b,否则取c
运算符优先级
说明:
同一优先级的运算符,运算次序由结合方向所决定。
简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符
规律总结:
在C语言中,表达式是一种用于计算的值。表达式可以由操作数、运算符和括号组成,用于执行特定的计算或操作。常见的表达式类型包括算术表达式、赋值表达式等。
x + y
、a - b
、c * d
、e / f
。=
)将右侧的值赋给左侧的变量。例如:num = 10
。赋值表达式的值等于赋值后的变量值,类型也与变量相同。在C语言中,表达式通常以一个或多个操作数组成,通过运算符连接。赋值表达式的左操作数必须是一个变量,而右操作数可以是一个常量、另一个变量或更复杂的表达式。例如:num = x + y
。
表达式在C语言中广泛用于计算、赋值和条件判断等场景。通过表达式,可以控制程序的逻辑流程,实现各种计算和数据处理任务。
八.字符串:
(先作了解,后会细讲)
字符串是使用null字符'\0'结束的一维字符数组。字符串常用于存储和操作文本数据。
字符串的创建和初始化:
char str[] = "Hello, World!";
字符串的长度:
int length = strlen(str);
字符串的复制:
char copy[50];
strcpy(copy, str);
字符串的链接:
char copy[50];
strcpy(copy, str);
字符串的比较:
char copy[50];
strcpy(copy, str);
字符串中字符的查找:
char copy[50];
strcpy(copy, str);
字符串中字符的修改:
str[0] = 'h'; // 修改第一个字符为 'h'
字符串中字符的增加与删除:
char *added = "#####";
strncat(str, added, 4); // 添加前四个字符
str[strlen(str) - 1] = '\0'; // 删除最后一个字符
格式化字符串:
char name[] = "John";
char greeting[50];
sprintf(greeting, "Hello, %s!", name);
字符串中的动态分配和释放:
char *dynamicStr = (char *)malloc(50 * sizeof(char));
strcpy(dynamicStr, "Dynamic");
free(dynamicStr);
九.格式说明符
%d
:带符号的十进制整数(适用于int
类型)。%hd
:带符号的短整数(适用于short int
类型)。%ld
:带符号的长整数(适用于long int
类型)。%lld
:带符号的长长整数(适用于long long int
类型)。%u
:无符号的十进制整数(适用于unsigned int
类型)。%lu
:无符号的长整数(适用于unsigned long int
类型)。%llu
:无符号的长长整数(适用于unsigned long long int
类型)。%o
:无符号八进制整数。%x
或 %X
:无符号十六进制整数(小写或大写)。%f
:十进制浮点数(适用于float
类型)。%lf
:十进制浮点数(适用于double
类型)。%e
或 %E
:科学计数法表示的浮点数(小写或大写)。%g
或 %G
:根据值的大小选择最紧凑的格式。%c
:单个字符。%s
:字符串(以空字符‘\0’结束的一串字符)。%p
:打印指针地址,并通常会自动转换为适合平台的格式。%n
:读入并记录到相应整型变量中已读取字符的数量(仅在scanf
系列函数中使用)。%t
:用于布尔型数据(某些扩展库可能支持)。%a
:C99引入的十六进制浮点数输出格式(用于double)。