常量变量数据类型

C语言学习笔记–基础篇

打印 --printf()

#include<stdio.h>
int main()
{
printf("hello world!\n");//\n换行
return0;
}

printf: 格式化输出

函数原型:

#include <stdio.h>
...
int printf ( const char * format, ... );

format 参数

format 参数是一个格式化字符串,由格式化占位符和普通字符组成。

格式化占位符(以 % 开头)用于指明输出的参数值如何格式化。

格式化占位符的语法如下:

%[flags][width][.precision][length] specifier

每一个格式化占位符均以 % 开始,以转换字符结束。

**specifier(转换字符,必选)**的内容及含义如下:

转换字符参数类型;转换结果
cchar;字符
dint;有符号十进制整数
i同上
edouble;以指数形式输出单、双精度浮点数(小写 e)
E同上(大写 E)
fdouble;以小数形式输出单、双精度浮点数
gdouble;以 %f 或 %e 中较短的输出宽度输出单、双精度浮点数(指数显示小写 e)
G同上(指数显示大写 E)
ounsigned int;无符号八进制(无前导 0)
schar *;字符串
uint;无符号十进制
xunsigned int;无符号十六进制(无前导 0x)
X同上(无前导 0X)
pvoid *;指针值
nint *;存放已写字符的个数
%不进行参数转换;% 自身

flags(标志,可选)的内容即含义如下:

标志含义
-指定被转换的参数在其字段内左对齐(默认是右对齐)
+指定在输出的数前面加上正负号
空格如果第一个字符不是正负号,则在其前面加上一个空格
0对于数值转换,当输出长度小于字段宽度时,添加前导 0 进行填充
> **#
  1. 如果转换字符为 o,则第一个数字为 0

  2. 如果转换字符为 x 或 X,则指定在输出的非 0 值前加 0x 或 0X

  3. 对于转换字符为 e、E、f、g 或 G 的情况,指定输出总是包含一个小数点。另外,对于转换字符为 g 或 G,还指定输出值尾部无意义的 0 将被保留

  4. 注:flags 可同时出现多个,且无顺序要求。 |

width(宽度,可选)是一个数值,用于指定最小字段的宽度

转换后的参数输出宽度至少要达到这个数值。如果参数的字符数小于该数值,则在参数左边(如果 flags 设置为 -,要求左对齐的话则在右边)填充一些字符。填充字符通常为空格,但是如果 flags 设置为 0,则填充字符为数字 0。

.precision(.精度,可选),通过点号(.)分隔字段的宽度和精度

  • 对于字符串,它指定打印的字符的最大个数
  • 对于整数,它指定打印的数字位数(必要时可加填充位 0 以达到宽度要求)
  • 对于转换字符为 e、E 或 f,它指定打印的小数点后的数字位数
  • 对于转换字符为 g 或 G,它指定打印的有效数字位数

length(长度修饰符,可选)的值可以是 h、hh、l、ll 或 L

  • hh 表示将相应的参数按 signed char 或 unsigned char 类型输出
  • h 表示将相应的参数按 short 或 unsigned short 类型输出
  • l 表示将相应的参数按 long 或 unsigned long 类型输出
  • ll 表示将相应的参数按 long long 或 unsigned long long 类型输出
  • L 表示将相应的参数按 long double 类型输出

… 附加参数

该参数的个数由格式化字符串决定。

每个参数的值应当与前面格式化字符串中的占位符类型和位置一一对应。
返回值:

如果函数调用成功,返回值是实际打印的字符数(不包含表示字符串结束的 ‘\0’);

如果函数调用失败,返回值是一个负数。

例子

#include <stdio.h>

int main()
{
        int a = 520;
        char b = 'I';
        float c = 3.14;
        double d = 3.141592653;

        printf("%d\n", a);
        printf("%c love you\n", b);
        printf("圆周率是:%.2f\n", c);
        printf("精确到小数点后9位的圆周率是:%11.9f\n", d);

        return 0;
}

转义字符

在 C 语言中,用双引号括起来的内容我们称之为字符串,也就是我们平时所说的文本。

字符串可以由可见字符和转义字符组成,例如:星号(*),就是可见字符。可见字符就是你输入什么,显示出来就是什么。

而你如果想将一个字符串分为两行来显示,那么你就需要使用到转义字符。

转义字符一般是表示特殊含义的非可见字符,以反斜杠开头:

img

#include<stdio.h>
int main()
{
printf("\n\
  ***   ***\n\
 *****  *****\n\
 *************\n\
  ***********\n\
    *******\n\
      ***\n\
       *\n");//\n\中后面的\表示下一行和开头连接起来
return 0;
}

----------------

  ***   ***
 *****  *****
 *************
  ***********
    *******
      ***
       *

输入函数 scanf()

scanf 函数从标准输入流中读取格式化字符串。

函数原型:

#include <stdio.h>
...
int scanf(const char *format, ...);

参数解析:

1、format 参数

format 参数是一个格式化字符串,由格式化占位符和普通字符组成。

该格式化字符串指定如何处理读取到的数据:

  • 空白字符:该函数将读取并忽略空白字符(空白字符包含空格、回车和制表符);
  • 除了格式占位符(% 开头)外的非空白字符:指定函数必须从输入流中读取到的字符,如果读取不匹配,则函数调用失败,并从匹配失败处截断输入流;
  • 格式化占位符(% 开头):用于指明获取的数据类型及位置。
格式化占位符的语法如下:

%[width] [length]specifier

每一个格式化占位符均以 % 开始,以转换字符结束。

specifier(转换字符,必选)的内容及含义如下:

转换字符含义
c读取一个字符
d读取一个十进制整数,前边可以加上符号(+ 或 -)表示正负
i1. 读取一个整数,前边可以加上符号(+ 或 -)表示正负 2. 0 开头表示八进制数,0x 开头表示十六进制数
e读取一个以指数形式的单、双精度浮点数(小写 e)
E同上(大写 E)
f读取一个单、双精度浮点数(需要使用 lf),前边可以加上符号(+ 或 -)表示正负
g同 f、e、E
G同上(指数显示大写 E)
a读取一个十六进制的浮点数(以 0x 或 0X 开头)
o读取一个八进制整数,前边可以加上符号(+ 或 -)表示正负
s读取一连串字符,直到遇到空白字符结束。
u读取一个无符号的十进制整数
x1. 读取一个十六进制整数,前边可以加上符号(+ 或 -)表示正负 2. 十六进制数以 0x 或 0X 开头
p读取一个指针的值
[characters]1. 匹配中括号括起来的字符集 2. 可以用小横杆(-)表示范围,比如 [0-9]
[^characters]1. 匹配除了中括号括起来的字符集 2. 可以用小横杆(-)表示范围,比如 [0-9]
n1. 存放已经读取的字符个数 2. 不消耗任何标准输入流的字符
%表示匹配 % 自身

注1:除了 n,其他的每次读取都会至少消耗标准输入流中的一个字符。

注2:如果读取失败,则标准输入流截断于读取失败的位置。

星号(*)、width 和 length 是可选的。

  • 星号(*)表示读取但忽略(读取但不保存);
  • width 指定当前读取操作的最大字符数;
  • length 是用于限定不同类型的宽度,具体请参考下表:
lengthd 或 iu、o 或 xf、e、g 或 ac、s、[] 或 [^]pn
默认int*unsigned int*float*char*void**int*
hhsigned char*unsigned char*signed char*
hshort int*unsigned short int*short int*
llong int*unsigned long int*double*wchar_t*long int*
lllong long int*unsigned long long int*long long int*
jintmax_t*uintmax_t*intmax_t*
zsize_t*size_t*size_t*
tptrdiff_t*ptrdiff_t*ptrdiff_t*
Llong double*

温馨提示:因为整理自官方文档,所以出现了很多暂时你还不认识的东东,不用怕,暂时忽视他们即可……

2、… 附加参数

该参数的个数由格式化字符串决定。

每个参数均为一个存储空间,并与面格式化字符串中占位符的类型和位置一一对应。

如果是一个普通的变量名,应在其名字前边加上 & 符号。

返回值:

如果函数调用成功,返回值是成功获取并填充到附加参数中的个数。

如果函数调用失败,返回值小于附加参数的个数(甚至是 0)。

如果读取到标准输入流的结尾处,则返回 EOF。

#include <stdio.h>
int main()
{
        char c;
        int i;
        int j;

        scanf("%c%d%x", &c, &i, &j);//j为16进制
        printf("变量c的值是:%c\n", c);
        printf("变量i的值是:%d\n", i);
        printf("变量j的值是:%#X(%d)\n", j, j);//#:指定另一种输出形式:转换字符为 x 或 X,则指定在输出的非 0 值前加 0x 或 0X
        return 0;
}

变量

变量和常量是程序处理的两种基本数据对象。

我们把要让 CPU 处理的数据都放在内存中,但如果你没有给他安排一个位置,而是随意存放,那么你在后边需要再次用到这个数据的时候,就再也找不到它了。所以变量的意义就是确定目标并提供存放的空间。

变量名

为了确定目标,我们需要给变量命名,一旦变量有了名字,我们就可以通过直呼其名的方式来获取它里边存放的数据。

C 语言变量命名需要遵守的规范

  • C语言变量名只能是英文字母(A-Z,a-z)和数字(0-9)或者下划线(_)组成,其他特殊字母不行。下横线通常用于连接一个比较长的变量名,比如i_love_you
  • 第一个字母必须是由英文字母或者下划线开头,也就是不能用数字开头
  • 变量名区分大小写。因为C语言是大小写敏感的编程语言,也就是大写的LOVE跟小写的love会被认为是不同的两个名字。在传统的命名习惯中,我们用小写字母来命名变量,用大写字母来表示符号常量名。
  • 不能使用关键字来命名变量。

关键字

关键字就是 C 语言内部使用的名字,这些名字都具有特殊的含义。如果你把变量命名为这些名字,那么 C 语言君搞不懂你到底想干嘛了。

传统的 C 语言(ANSI C)有 32 个关键字:

img

1999年,ISO 发布 C99,添加了 5 个关键字:

img

2011年,ISO 发布 C11,添加了 7 个关键字:

img

C 语言常用的基本数据类型

  • char —— 字符型,占用一个字节
  • int —— 整型,通常反映了所用机器中整数的最自然长度
  • float —— 单精度浮点型
  • double —— 双精度浮点型

C 语言声明变量的语法

  • int a; // 在内存中找到一个整型大小的位置,然后霸占起来,并给它命名叫 a
  • char b; //在内存中找到一个字节大小的位置,然后霸占起来,并给它命名叫 b
  • float c; //在内存中找到一个单精度浮点型数据大小的位置,然后霸占起来,并给它命名叫 c
  • double d; //在内存中找到一个双精度浮点型数据大小的位置,然后霸占起来,并给它命名叫 d
#include<stdio.h>
int main()
{
	int a;
	char b;
	float c;
	double d;
	
	a=520;
	b='l';
	c=3.14;
	d=3.141592653;
	
	printf("我们对C语言的感情:%d\n",a);//%d表示整形转换
	printf("i %cove you\n",b);//%c表示字符型转换
	printf("pi:%.2f\n",c);//%f表示浮点型转换,单精度双精度都是一样的,.2f表示小数点后两位
	printf("pi:%11.9f\n",d);//前面的11表示总占位11,小数点后有9位
    return 0;
}
--------------------
我们对C语言的感情:520
i love you
pi:3.14
pi: 3.141592653

常量

C 语言中常见的常量

  • 整型常量:520, 1314, 123
  • 实型常量:3.14, 5.12, 8.97
  • 字符常量
    • 普通字符:‘L’, ‘o’, ‘v’, ‘e’
    • 转义字符:’\n’, ‘\t’, ‘\b’
  • 字符串常量:“LOVE”
  • 符号常量:使用之前必须先定义

定义符号常量(宏定义)

符号常量的定义格式是:

#define 标识符 常量

其中这个 #define 是一条预处理命令(预处理命令都以"#"开头),我们也称为宏定义命令。它的功能就是把程序中所有出现的标识符都替换为随后的常量。

#include <stdio.h>

#define NAME "满天星"
#define BOSS "小仙女"
#define YEAR 2020
#define MONTH 9
#define DAY 20

int main()
{
        printf("今天是%d年%d月%d日\n", YEAR, MONTH, DAY);
        printf("%s是%s\n", NAME, BOSS);

        return 0;
}
---------------
今天是2020920日
满天星是小仙女

标识符

在 C 语言中,标识符指的就是一切的名字。比如刚刚的符号常量名是标识符,变量名也是一个标识符。以及我们即将学到的函数、数组、自定义类型这些的名字都称之为标识符。

字符串常量

C 语言用一个特殊的转义字符来表示字符串的结束位置。这样当操作系统读取到这个转移字符的时候,就知道该字符串到此为止 了。

这个转义字符就是空字符:’\0’

数据类型

在 C 语言里,所谓的数据类型就是坑的大小。我们说变量就是在内存里边挖一个坑,然后给这个坑命名。那么数据类型指的就是这个坑的尺寸。C 语言允许使用的类型如下:

img

short 和 long

我们可以为这些基本数据类型加上一些限定符,比如表示长度的 short 和 long。比如 int 经过限定符修饰之后,可以是 short int,long int,还可以是 long long int(这个是 C99 新增加的)。

img

这里需要说的是,这里 C 语言并没有限制 int 的坑具体要挖多大,short int 或 long int 的坑又要挖多大。标准只是要求:short int <= int <= long int <= long long int。

sizeof 运算符

sizeof 用于获得数据类型或表达式的长度,它有三种使用方式:

sizeof(type_name); //sizeof(类型);
sizeof(object); //sizeof(对象);
sizeof object; //sizeof 对象;

signed 和 unsigned

还有一对类型限定符是 signed 和 unsigned,它们用于限定 char 类型和任何整型变量的取值范围。

signed 表示该变量是带符号位的,而 unsigned 表示该变量是不带符号位的。带符号位的变量可以表示负数,而不带符号位的变量只能表示正数,它的存储空间也就相应扩大一倍。默认所有的整型变量都是 signed 的,也就是带符号位的。

因此加上 signed 和 unsigned 限定符,四种整型就变成了八种:

[signed] short [int]

unsigned short [int]

[signed] int

unsigned int

[signed] long [int]

unsigned long [int]

[signed] long long [int]

unsigned long long [int]

取值范围

比特位和字节

CPU 能读懂的最小单位(只能存放 0 和 1)—— 比特位,bit,b

内存机构的最小寻址单位 —— 字节,Byte,B

关系:1Byte == 8bit

因此,一个字节可以表示最大的数是:11111111

二进制、十进制和十六进制

img

符号位

存放 signed 类型的存储单元中,左边第一位表示符号位。如果该位为 0,表示该整数是一个正数;如果该位为 1,表示该整数是一个负数。

一个 32 位的整型变量,除去左边第一位符号位,剩下表示值的只有 31 个比特位。

补码

计算机是用补码的形式来存放整数的值。

正数的补码是该数的二进制形式。

负数的补码需要通过以下几步获得:

  • 先取得该数的绝对值的二进制形式
  • 再将第1步的值按位取反
  • 最后将第2步的值加1

img

二进制表示最大值和最小值

img

二进制数和十进制数之间的相互转换
二进制 -> 十进制

从二进制数转换到十进制数,我们使用“按权相加”的方法。

什么是“权”?

所谓“权”,即“位权”!

比如说一个八位的二进制数 0010 1010,从右往左(←),每个位的“位权”依次是 01234567,如下图所示:

img

下边是公式:

十进制数 == 依次将每个二进制位的值 * 2的位权次方再相加

如果符号位为 0,表示该数为正数,转换跟无符号数没什么两样。

如果符号位为 1,表示该数为负数,此时符号位的位权不变,但该位的权值应该乘以 -1 得到。

举个栗子,将有符号数 0011 1100 转换成十进制数,与无符号数的做法是一样的:

​ 0 * 2^7 + 0 * 2^6 + 1 * 2^5 + 1 * 2^4 + 1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 0 * 2^0

== 32 + 16 + 8 + 4

== 60

然后如果符号位为 1,表示这是一个负数,比如 1011 1100,那么符号位的权值就应该乘以 -1 得到:

​ -1 * 2^7 + 0 * 2^6 + 1 * 2^5 + 1 * 2^4 + 1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 0 * 2^0

== -128 + 32 + 16 + 8 + 4

== -68

在举个极端点的例子,比如 1000 0000:

​ -1 * 2^7 + 0 * 2^6 + 0 * 2^5 + 0 * 2^4 + 0 * 2^3 + 0 * 2^2 + 0 * 2^1 + 0 * 2^0

== -128

现在明白为啥 1000 0000 表示 -128 了吧~

十进制 -> 二进制

从十进制数转换到二进制数,我们使用“辗转相除”的方法。不过我们这里不是要求最大公约数,而是取其余数。

即将待转换的十进制数不断地除以 2,直到商为 0,将每次除得的余数倒序拼凑起来,便是对应的二进制数……

img

二进制数和十六进制数之间的相互转换

鉴于二进制和十六进制之间有着密不可分的暧昧关系,你只需要记住下边这个表格即可:

img

基本数据类型的取值范围

img

img

字符串和字符类型

字符类型和整型

字符类型事实上是一个特殊的整数类型

字符类型事实上是一个特殊的整型,因此它也有取值范围,signed char 的取值范围是 -128 ~ 127;unsigned char 的取值范围是 0 ~ 255。

字符类型与普通整数类型的不同之处

C 标准规定普通整数类型默认使用 signed 修饰符,但没有规定 char 的默认修饰符。因此,使用 signed 或 unsigned 修饰符,是由编译系统自行决定。

存放在字符类型中的变量,都可以被解释为 ASCII 字符表中的对应字符

标准 ASCII 字符表使用7位二进制数来表示所有的大写和小写字母,数字 0 到 9、标点符号, 以及在美式英语中使用的特殊控制字符。

其中,ASCII 字符表上的数字 0 ~ 31 以及 127(共 33 个)分配给了控制字符,用于控制像打印机等一些外围设备。这些是看不到的。数字 32 ~ 126 分配给了能在键盘上找到的字符,这些是所见即所得的。

ASCII

ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准 ISO/IEC 646。

标准 ASCII 字符表使用 7 位二进制数来表示所有的大写和小写字母,数字 0 到 9,标点符号,以及在美式英语中使用的特殊控制字符。

其中,ASCII 字符表上的数字 0~31 以及 127(共 33 个)分配给了控制字符,用于控制像打印机等一些外围设备:

二进制十进制十六进制缩写含义
0000 0000000NUL空字符
0000 0001101SOH标题开始
0000 0010202STX文本开始
0000 0011303ETX文本结束
0000 0100404EOT传输结束
0000 0101505ENQ请求
0000 0110606ACK确认响应
0000 0111707BEL响铃
0000 1000808BS退格
0000 1001909HT水平制表符
0000 1010100ALF换行符
0000 1011110BVT垂直制表符
0000 1100120CFF换页符
0000 1101130DCR回车键
0000 1110140ESO取消变换(Shift out)
0000 1111150FSI启动变换(Shift in)
0001 00001610DLE数据链路转义
0001 00011711DC1设备控制一(XON 激活软件速度控制)
0001 00101812DC2设备控制二
0001 00111913DC3设备控制三(XOFF 停用软件速度控制)
0001 01002014DC4设备控制四
0001 01012115NAK拒绝接收
0001 01102216SYN同步空闲
0001 01112317ETB区块传输结束
0001 10002418CAN取消
0001 10012519EM连接介质中断
0001 1010261ASUB替换
0001 1011271BESC退出键
0001 1100281CFS文件分区符
0001 1101291DGS组群分隔符
0001 1110301ERS记录分隔符
0001 1111311FUS单元分隔符
0111 11111277FDEL删除

ASCII 字符表上的数字 32~126 分配给了能在键盘上找到的字符,当您查看或打印文档时就会出现:

二进制十进制十六进制字符二进制十进制十六进制字符
0010 00003220空格0101 00008050P
0010 00013321!0101 00018151Q
0010 00103422"0101 00108252R
0010 00113523#0101 00118353S
0010 01003624$0101 01008454T
0010 01013725%0101 01018555U
0010 01103826&0101 01108656V
0010 011139270101 01118757W
0010 10004028(0101 10008858X
0010 10014129)0101 10018959Y
0010 1010422A*0101 1010905AZ
0010 1011432B+0101 1011915B[
0010 1100442C,0101 1100925C\
0010 1101452D-0101 1101935Dimg
0010 1110462E.0101 1110945E^
0010 1111472F/0101 1111955F_
0011 0000483000110 00009660`
0011 0001493110110 00019761a
0011 0010503220110 00109862b
0011 0011513330110 00119963c
0011 0100523440110 010010064d
0011 0101533550110 010110165e
0011 0110543660110 011010266f
0011 0111553770110 011110367g
0011 1000563880110 100010468h
0011 1001573990110 100110569i
0011 1010583A:0110 10101066Aj
0011 1011593B;0110 10111076Bk
0011 1100603C<0110 11001086Cl
0011 1101613D=0110 11011096Dm
0011 1110623E>0110 11101106En
0011 1111633F?0110 11111116Fo
0100 00006440@0111 000011270p
0100 00016541A0111 000111371q
0100 00106642B0111 001011472r
0100 00116743C0111 001111573s
0100 01006844D0111 010011674t
0100 01016945E0111 010111775u
0100 01107046F0111 011011876v
0100 01117147G0111 011111977w
0100 10007248H0111 100012078x
0100 10017349I0111 100112179y
0100 1010744AJ0111 10101227Az
0100 1011754BK0111 10111237B{
0100 1100764CL0111 11001247C|
0100 1101774DM0111 11011257D}
0100 1110784EN0111 11101267E~
0100 1111794FO

字符串

C 语言没有专门为存储字符串设计一个单独的类型,因为没必要。我们之前已经说过,字符串事实上就是一串字符。所以只需要在内存中找一块空间,然后存放一串字符类型的变量即可。

声明字符串的语法:

char 变量名[数量];

对其进行赋值,事实上就是对这一块空间里边的每一个字符变量进行赋值。我们通过索引号来获得每个字符变量的空间。

char name[5];//声明

name[0] = 'L';
name[1] = 'O';
name[2] = 'V';
name[3] = 'E';
name[4] = '\0';

当然,我们可以把声明和定义写在一块,语法是这样的:

char name[5] = {'L', 'O', 'V', 'E', '\0'};

其实,中括号([])里边的数量咱可以不写,编译器会自动帮你计算的。

char name[] = {'L', 'O', 'V', 'E', '\0'};

事实上可以直接在大括号写上字符串常量,字符串常量用双引号括起来:

char name[] = {"LOVE"};

使用字符串常量有个好处,那就是你不必亲自在末尾添加 ‘\0’,它会自动帮你加上。

最后,如果使用字符串常量的话,这个大括号也是可以省掉的:

char name[] = "LOVE";
   |                                                              |

字符串

C 语言没有专门为存储字符串设计一个单独的类型,因为没必要。我们之前已经说过,字符串事实上就是一串字符。所以只需要在内存中找一块空间,然后存放一串字符类型的变量即可。

声明字符串的语法:

char 变量名[数量];

对其进行赋值,事实上就是对这一块空间里边的每一个字符变量进行赋值。我们通过索引号来获得每个字符变量的空间。

char name[5];//声明

name[0] = 'L';
name[1] = 'O';
name[2] = 'V';
name[3] = 'E';
name[4] = '\0';

当然,我们可以把声明和定义写在一块,语法是这样的:

char name[5] = {'L', 'O', 'V', 'E', '\0'};

其实,中括号([])里边的数量咱可以不写,编译器会自动帮你计算的。

char name[] = {'L', 'O', 'V', 'E', '\0'};

事实上可以直接在大括号写上字符串常量,字符串常量用双引号括起来:

char name[] = {"LOVE"};

使用字符串常量有个好处,那就是你不必亲自在末尾添加 ‘\0’,它会自动帮你加上。

最后,如果使用字符串常量的话,这个大括号也是可以省掉的:

char name[] = "LOVE";

参考

鱼C论坛https://fishc.com.cn/forum.php?mod=forumdisplay&fid=329&filter=typeid&typeid=583

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小邹子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值