C语言入门:隐式类型转换(自动类型提升) 和显式类型转换(强制类型转换)

C语言的显式类型转换和隐式类型转换详细讲解 类型转换主要分为显式类型转换和隐式类型转换。隐式类型转换又分为整型提升和算术转换两个操作。整型提升的用途主要是在表达式中,有数据类型小于int类型大小的,编译器就会隐式的把小于int类型的数据转换为int类型的数据。算术转换的用途就是在表达式中,操作数的数据类型都是大于等于int 类型,并且数据类型不一致,这个时候编译器就会隐式算术转换。 阅读详情

1. 类型转换的本质

C 语言是强类型语言,不同类型的数据在内存中存储方式(如字节长度、二进制编码规则)不同。类型转换的本质是:在不改变数据二进制位的前提下,重新解释这些二进制位的含义(比如把0x41解释为char是 'A',解释为int是 65)。

2. 隐式类型转换(Implicit Type Conversion)

隐式转换由编译器自动完成,无需程序员干预,主要发生在以下场景:

(1)算术转换(Arithmetic Conversion)

当表达式中出现不同类型的操作数(如int和float相加)时,编译器会按 “类型提升规则” 将操作数转换为同一类型,再进行计算。规则如下(从低到高优先级):
char → short → int → unsigned int → long → unsigned long → float → double → long double

关键原则:小类型向大类型提升(“小” 指能表示的数值范围更小)。

示例:

char c = 'A';    // char类型(1字节,范围-128~127)
int i = 100;     // int类型(4字节,范围-2^31~2^31-1)
double d = 3.14; // double类型(8字节,范围±1.7e±308)

// 表达式c + i + d的转换过程:
// 1. c(char)先提升为int(整数提升)→ int 65
// 2. 65(int)和i(int)相加 → int 165
// 3. 165(int)提升为double(165.0),再和d(3.14)相加 → double 168.14
(2)赋值转换(Assignment Conversion)

当将一个表达式的值赋给不同类型的变量时,编译器会将表达式结果转换为变量的类型。

规则:目标变量是什么类型,就把表达式结果转成什么类型(可能丢失精度)。

示例:

int a;
double b = 123.99;

a = b; // 隐式转换:double → int(截断小数部分,a=123)
(3)函数参数传递

调用函数时,实参的类型可能被隐式转换为形参的类型(除非函数声明了原型,否则可能触发 “默认参数提升”)。

示例:

void print_num(int x) { 
    printf("%d\n", x); 
}

int main() {
    char c = 'A'; // ASCII码65
    print_num(c); // 隐式转换:char → int(65)
    return 0;
}
3. 显式类型转换(Explicit Type Conversion / Casting)

显式转换需要程序员手动编写(目标类型)操作符,强制将一个表达式转换为指定类型。语法:

(目标类型) 表达式;
(1)常见用途
  • 缩小类型:将大类型数据转为小类型(如double→int)。
  • 兼容接口:让不同类型的数据适配函数参数或返回值要求。
  • 位操作:重新解释二进制位的含义(如将int转为char查看 ASCII 码)。
(2)风险与注意事项
  • 精度丢失:大类型转小类型时,可能截断高位(如double 123.99转int得到 123)。
  • 符号问题:无符号类型(unsigned int)转有符号类型(int)时,若数值超过范围,结果可能为负(如(int)4294967295在 32 位系统中是 - 1)。
  • 未定义行为:转换不兼容的类型(如函数指针转int)可能导致不可预测的结果(依赖编译器实现)。
(3)示例代码
#include <stdio.h>

int main() {
    double pi = 3.1415926;
    int int_pi = (int)pi; // 显式转换:double→int(丢失小数部分,int_pi=3)
    printf("pi的整数部分:%d\n", int_pi);

    int a = 10;
    int b = 3;
    double average = (double)a / b; // 显式转换a为double,避免整数除法(10/3=3,转换后10.0/3=3.333...)
    printf("10/3的精确结果:%lf\n", average);

    return 0;
}
4. 深入:C 标准中的类型转换规则

根据 C11 标准,类型转换需遵循以下核心规则:

(1)整数提升(Integer Promotion)

char、short、_Bool等小整数类型在表达式中会被自动提升为int(若int能完整表示其范围)或unsigned int(否则)。这是为了提高计算效率(CPU 处理int更快)。

示例:

char c1 = 100;  // char(假设1字节,范围-128~127)
char c2 = 200;  // char(200超过127,实际存储为-56,补码表示为0xCC)
int sum = c1 + c2; // c1和c2先提升为int:100 → 100;200 → -56(补码0xFFFFFFCC),相加得44
(2)寻常算术转换(Usual Arithmetic Conversion)

当二元运算符(如+、-、*、/)的两个操作数类型不同时,编译器会按以下步骤提升类型:

  1. 若其中一个操作数是long double,另一个也转成long double。
  2. 否则,若其中一个是double,另一个转成double。
  3. 否则,若其中一个是float,另一个转成float。
  4. 否则,对两个操作数进行 “整数提升”,然后按以下规则提升:
    • 若其中一个是unsigned long,另一个转成unsigned long。
    • 否则,若其中一个是long,另一个转成long。
    • 否则,若其中一个是unsigned int,另一个转成unsigned int。
    • 否则,两个操作数都转成int。
(3)指针与整数的转换
  • 整数转指针:结果是 “实现定义” 的(由编译器决定如何解释整数)。
  • 指针转整数:至少能容纳指针的unsigned int或unsigned long类型(如 32 位系统用unsigned int,64 位用unsigned long long)。
5. 常见误区与避坑指南
(1)隐式转换的 “隐形陷阱”
// 错误示例:无符号数与有符号数的隐式转换
unsigned int a = 1;
int b = -2;

if (a + b > 0) { // a+b会隐式转换为unsigned int(-2转成4294967294,1+4294967294=4294967295>0)
    printf("结果大于0\n"); // 会执行
} else {
    printf("结果小于等于0\n");
}

问题:b(int)会被隐式转换为unsigned int(-2 转成大正数),导致逻辑错误。

(2)显式转换的 “强制风险”
// 危险操作:大类型转小类型导致溢出
long long big_num = 1LL << 40; // 1099511627776(超过32位int的最大值2147483647)
int small_num = (int)big_num; // 截断高位,结果是未定义的(可能是随机值)
(3)正确实践
  • 避免无符号数与有符号数混合运算(除非明确知道后果)。
  • 显式转换时,优先检查数据范围(如用if (x <= INT_MAX)判断long转int是否安全)。
  • 使用stdint.h中的精确类型(如int32_t、uint64_t)替代int、long,减少隐式转换的不确定性。

总结

隐式转换是编译器 “自动换车”(安全、省心),显式转换是 “手动硬塞”(可能丢数据,需谨慎)。理解类型转换的规则,能帮你写出更安全、更高效的 C 语言代码。

 用 “生活场景” 帮你秒懂两种类型转换

我们先把 C 语言的 “类型转换” 想象成一场 “快递运输”—— 数据是要运输的 “货物”,数据类型是 “货车类型”(比如小货车、大卡车、集装箱车)。类型转换的本质,就是 “调整货车类型” 来匹配运输需求。

1. 隐式类型转换(自动类型提升):快递员帮你自动换车

场景:你要寄一箱苹果(小货车能装),但快递站只有大卡车(大货车)。这时候快递员会自动帮你把苹果搬到大卡车上—— 不需要你开口,也不用你动手。

C 语言中的对应逻辑:
当两种不同类型的数据 “合作”(比如相加、比较)时,编译器会自动把 “小类型” 的数据升级成 “大类型”,保证计算精度不丢失。这里的 “小” 和 “大” 指的是数据能表示的范围(比如int是 “小货车”,double是 “大卡车”)。

举个栗子:

int a = 10;    // 小货车:装整数
double b = 3.14; // 大卡车:装小数
double result = a + b; // 快递员自动把a(小货车)升级成double(大卡车),再相加

这里a会被隐式转换为double类型(值变成 10.0),然后和b相加,结果还是double(13.14)。整个过程你不需要写额外代码,编译器 “偷偷” 帮你完成。

2. 显式类型转换(强制类型转换):你自己硬塞货物

场景:你有一批大箱子(需要大卡车),但只有小货车可用。这时候你只能自己动手把大箱子拆小,硬塞进小货车 —— 可能会弄坏箱子(数据丢失),但你 “强行” 这么做了。

C 语言中的对应逻辑:
当你需要把一个 “大类型” 的数据塞给 “小类型” 的变量时,必须手动告诉编译器:“我知道可能有风险,但我要这么做”。语法是用(目标类型)包裹原数据。

举个栗子:

double big_num = 123.99; // 大卡车:装123.99
int small_num = (int)big_num; // 你强行把大卡车的货物塞给小货车(int)

这里(int)是强制类型转换符,big_num会被 “截断” 为 123(小数部分 0.99 丢失),结果small_num的值是 123。这就像你硬把大箱子拆了塞小货车,虽然能用,但可能丢东西。

一句话总结区别
  • 隐式转换:编译器 “贴心” 帮你换车(自动、安全,通常不会丢数据)。
  • 显式转换:你 “强行” 自己换车(可能丢数据,需要自己承担风险)。

 

【C语言】隐式类型转换和强制类型转换详解 C语言中的数据类型是编程中一个至关重要的概念。在处理不同数据类型的操作时,我们经常需要考虑类型之间的转换。隐式类型转换(也称自动类型转换)和强制类型转换(也称显式类型转换)。本博客将深入讨论这两种转换方式的概念、用法以及注意事项,帮助读者更好地理解C语言中的类型转换机制。提示:以下是本篇文章正文内容,下面案例可供参考C语言中的类型转换是编程中不可避免的一部分,而隐式类型转换和强制类型转换则是两种不同的策略。隐式类型转换使得编程更灵活,但有时也会导致意外行为。 阅读详情

相关推荐

C语言进阶学习1 隐式类型转换和强制类型转换

本博客记录狄泰学院课程的学习 学习交流群:320628659 个人QQ:1367087622 欢迎大家交流学习 本章的学习目标: 学习隐式类型转换和强制类型转换的基本概念. 本意或非本意下使用类型转换时可能会出现的问题. 在C语言是可以进行类型之间的转换且其中存在两种类型转换的方式 强制类型转换 隐式类型转换 强制类型转换 强制类型转换的语法 (Type)var_name; (Type...

atvoid的博客 1663

C语言中的数据类型的隐式转换

隐式转换 以下四种情况下会进行隐式转换: 1、算术运算式中,低类型能够转换为高类型。 2、赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给他。 3、函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。 4、函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数。 算数运算的隐式转换 算数运算中,首先有如下类型转换规则: 1、字符必须先转换为整数(C语言规定字符类型数据和整型数据之间可以通用) 。【注意字符型+整形的计算参考ACSII码】 2、short

sinat_30208181的博客 4016

C 语言类型转换:隐式与显式的艺术

隐式类型转换是编译器的“贴心服务”,它通常在不丢失数据的前提下自动进行,比如小空间转大空间,低精度转高精度。强制类型转换是程序员的“手动控制”,它允许我们指定任何类型转换,但需要警惕数据丢失的风险,特别是从大空间转小空间,或从浮点转整型。在进行类型转换时,尽量将小的数据类型转换为大的数据类型(例如 ​​int​​ 转 ​​float​​,​​float​​ 转 ​​double​​),这样可以最大程度地避免数据精度丢失或溢出。

Web安全工具库 1241

【C语言】强制转换

常规的数据类型强制转换,加入指针后,地址,函数等等的强制转换细节和示例程序

Goforyouqp的博客 2万+

Scala语法之变量和数据类型

Scala Scala变量 变量声明基本语法 var | val 变量名 [:变量类型]=变量值 注意事项: 1)声明变量时,类型可以省略(编译器自动推导,即类型推导) 2)类型确定后,就不能修改,说明Scala是强数据类型语言 3)在声明/定义一个变量时,可以使用var或者val来修饰,var修饰的变量可改变,val修饰的变量不可改。 4)Scala设计者推荐使用val,没有线程安全问题。 var a:Int = 1 //定义一个整型变量,取名a,并赋初值1 var name:String = "jack

zhengzaifeidelushang的博客 435

C语言隐式/显式类型转换 | C++四种强制类型转换、类的隐式转换、explicit

文章目录何时发生隐式类型转换 何时发生隐式类型转换 在大多数表达式中,比int类型小的整数值提升为较大的整数类型 在条件中,非布尔值转换成布尔类型 初始化过程中,初始值转换成变量的类型;在赋值语句中,右侧运算对象转化成左侧运算对象的类型 算术运算或关系运算对象有多种类型,需要转换成同一种类型 函数调用时也会发生类型转换 ...

Jormungand_V的博客 2856

C语言【隐式类型转换】和【显式类型转换】

C语言是一种强类型语言,当使用一种类型代替另外一种类型进行操作时或者存在两个不同类型的对象进行操作时,首先就得进行类型的转换然后再说其他。而类型转换的方式一般可分为隐式类型转换(也称:自动类型转换)和显示类型转换(也称:强制类型转换),两者有着本质上的区别。隐式类型转换是由编译器自动进行的,不需要人为的干预,而且我们也观察不到类型是如何进行转换的,所以被称为:“ 隐式 ”。而显式类型转换是由程序员明确指定的,所以才被称为:“ 强制类型转换 ”。

lijian2017的博客 3725

从CAD到Web:高效转换STEP/IGES模型为GLB格式的实践指南

本文详细介绍了如何将工业设计中的STEP/IGES模型高效转换为Web友好的GLB格式。通过PythonOCC和gltf-pipeline等工具链,实现从CAD到Web的无缝转换,大幅提升模型加载速度和展示效果。文章包含实战案例、优化技巧和常见问题解决方案,帮助开发者快速掌握3D模型转换技术。

weixin_29072299的博客 507

C++: 隐式类型转换和显式类型转换

第1部分.隐式类型转换 又称为“标准转换”,包括以下几种情况: 1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型。 intival=3; doubledval=3.14159; ival+dval;//ival被提升为double类型 2)一种类型表达式赋值给另一种类型的对象:目标类型是...

不忘初心 4816

BERTopic模型入门教程(附代码+参数调节)

BERTopic 是一种用于从文本数据中提取主题模型的新型方法。通过结合 BERT嵌入和传统的主题模型来生成语义丰富的主题。传统的主题模型(如LDA)主要依赖于词频矩阵,而 BERTopic 通过预训练语言模型生成高维语义嵌入来捕捉词语间的复杂关系,因此可以更好地处理上下文信息。BERTopic模型可以看作是创建其主题表示的一系列步骤。核心原理如下:就本质而言,BERTopic就是一个拼装框架,可以把每部分都替换成其他模型,只要完成任务即可。

m0_52069102的博客 1万+

超十万字解读Spring AI实战:开篇

大模型技术正以惊人的速度改变世界,2025年的人工智能已不再是科幻,而是现实。大模型如ChatGPT等,正在重塑各行各业,降低技术门槛,使专业能力普及化。SpringAI的出现为Java开发者提供了桥梁,使其能在企业级系统中稳定运行AI,同时保持工程化思维。尽管SpringAI在生态、学习成本和性能上存在不足,但其企业级基因和国产化适配能力使其成为Java开发者的重要工具。本系列文章旨在介绍SpringAI的功能与特性,鼓励更多Java开发者参与AI实践,共同探索AI时代的无限可能。

liaokailin的专栏 1576

27. C语言 强制类型转换详解

在C语言编程中,类型转换是一个常见且重要的操作。通过类型转换,我们可以改变数据的存储形式和计算方式,从而确保程序按照预期的方式执行。隐式类型转换和显式类型转换。本文将重点讲解强制类型转换和常用的算术转换,以及它们在实际编程中的应用。类型转换在C语言中是不可避免的,尤其是在涉及不同类型数据进行计算时。通过合理使用强制类型转换和了解常用的算术转换规则,开发者可以有效避免因类型不匹配而导致的错误,确保程序能够正确、高效地运行。

涛ing的博客 2238

代谢组数据分析(十五):基于python语言构建PLS-DA分类预测模型

本教程阐述典型代谢组学数据分析工作流程,用于二元分类结果的研究。流程主要步骤如下:首先从 Excel 表格导入代谢物与实验数据,接着基于汇总 QC 进行数据清洗。随后借助主成分分析可视化检查数据质量,再开展两类单变量统计。之后运用偏最小二乘判别分析(PLS - DA)实施多变量分析,此过程涵盖模型优化(对比 R2 与 Q2)、置换测试及明确模型预测指标、确定特征重要性、对模型预测数据进行可视化。最终将统计表格导出至 Excel 表格,完整呈现从数据导入到分析结果输出的全过程。

专注生信领域 2875

【c/c++】类型转换:隐式类型转换、强制类型转换

类型转换是编程中一个常见的现象。在我们进行编码的时候不经意间就发生了,很可能就给我们带来不少bug。所以我们需要了解类型转换以及对应得出现场景。

m0_73726899的博客 2225

一文看懂EMMC原理及工作过程

CMD:用于设备初始化和命令传输的双向通道, CMD信号有2种工作模式:1#:漏极开路--->用于初始化模式2#:推拉--->用于快速命令传输其中命令从eMMC主机控制器发送到eMMC设备,响应从设备发送到主机。DAT [7:0]:双向数据信号,模式包括:1(DAT0);默认情况下,通电或重置后,只有DAT0用于数据传输。DAT信号在推挽模式下工作,eMMC设备包括数据线DAT1-DAT7的内部上拉。进入4位模式后,设备立即断开线路DAT1、DAT2和DAT3的内部上拉;

Airer_00的博客 2031

WOFOST作物模型(7):6.0.6版本的PCSE使用(多层水分平衡和SNOMIN碳氮模型的集成)

wofost81文件结构如上,其中所需的参数可从github上获取然后input下有两个需要调用的功能函数py文件,需要拖到自己的运行py文件同级目录下在使用土壤模块SNOMIN进行作物生长模型模拟时,需要为土壤剖面的不同层次提供多种输入变量。这些变量通常不随年份变化,因此会统一在土壤文件中定义。本节将说明如何将这些输入变量整合到一个字典中,进而生成SNOMIN能够读取的土壤文件。

所有专家都曾始于新手 637

【C/C++】具有C风格的强制类型转换:显式类型转换、隐式类型转换,C语言强制类型转换

本专栏记录了博主C++从初阶到高阶完整的学习历程,会发布一些博主学习的感悟、碰到的问题、重要的知识点,和大家一起探索C++这门程序语言的奥秘。这个专栏将记录博主C++语法、高阶数据结构、STL的学习过程,正所谓“万丈高楼平地起”嘛,我们话不多说,继续进行C++阶段的学习。本文我们不讲C++主线的内容,我们来拓展一下或者说整理一下我们学习时C/C++时经常会提到的一些专有名词,例如形参、实参,显式类型转换和隐式类型转换类型转换,内置类型等等。

艾莉丝努力练剑的博客,感谢大家一直以来的对艾莉丝的支持和鼓励,uu们如果对C/C++方向感兴趣的话,可以通过艾莉丝主页的微信名片加艾莉丝的好友,和努力练剑的艾莉丝一起加油! 1014

流体动力学仿真软件:CFX_(10).案例实践:复杂流场分析

在“Phases”选项卡中,定义参与仿真的不同相。例如,如果您要分析气液两相流,可以定义“Air”和“Water”两个相。

kkchenjj的博客 1687

C语言强制类型转换

强制类型转换是把变量从一种类型转换为另一种数据类型。例如,如果想存储一个 long 类型的值到一个简单的整型中,需要把 long 类型强制转换为 int 类型。可以使用强制类型转换运算符来把值显式地从一种类型转换为另一种类型,如下所示: (type_name) expression 请看下面的实例,使用强制类型转换运算符把一个整数变量除以另一个整数变量,得到一个浮点数: #include <stdio.h> int main() { int sum = 17, count =

事后不诸葛的博客 1万+

数字电路与逻辑设计实验二 组合逻辑电路

1.组合逻辑电路功能测试 (1)用 2 片 74LS00 组成图 2.1 所示逻辑电路。为便于接线和检查,在图中要注明 芯片编号及各引脚对应的编号。 (2)图中 A、B、C 接逻辑开关,Y1,Y2 接发光管电平显示。 (3)按表 2.3 要求,改变 A、B、C 输入的状态,填表并写出 Y1,Y2 的逻辑表达式。 (4)将运算结果与实验结果进行比较。 2.测试用异或门(74LS86)和与非门组成的半加器的逻辑功能。 根据半加器的逻辑表达式可知,半加 器 Y 是 A、B 的异或,而进位 Z 是 A

欢迎交流学习心得 1278

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

类型转换(基于C语言讲解)

c语言的类型转换--显示类型转换和隐式类型转换

weixin_47957229的博客 4666

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C语言:隐式类型转换与强制类型转换

在C语言中,进行类型之间的转换有两种转换方式: 强制类型转换与隐式类型转换 强制类型转换 语法:(目标类型)变量名或者具体的数值 结果:1、目标类型能够容纳目标值,结果不变 2、目标类型不能容纳目标值,结果产生截断 注意:结果产生截断与操作系统的大小端有关;并不是所有的强制类型转换都能够成功,当不能进行强制类型转换时,编译器会产生错误信息。 例如: struct S { int a; in...

碧瑶的博客呀 2288

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C语言 类型转换

C语言 类型转换一般是为了解决如下的一些问题: 算术运算中或者逻辑判断表达式中操作室,不匹配的时候。 赋值时,如果左右操作数类型不匹配。 函数传递进去的实参和匹配的形参对应不上。 函数返回的表达式的类型和函数返回类型不匹配。 出现上述问题我们一般会进行相应的类型转换 否则编程在调试的时候会出现警告甚至报错。 C语言中类型转换主要分为两种: 1. 隐式类型转换 2. 显示类型转换 隐式类型转换:编译器自动将左右操作数变成相同类型去计算。 显式类型转换:程序开发者主观上去将类型强制转换。 在类型转换

Mi-ronin的博客 8544

C语言和C++的类型转换

C语言类型强转存在缺陷:转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换。因此标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:`static_cast`、`reinterpret_cast`、`const_cast`、`dynamic_cast`

宁清的博客 1449

【C++笔记】C++和C语言的类型转换对比分析

哈喽,各位小伙伴大家好!上期我们讲了 C++的IO库。今天我们来讲一下 C++类型转换。话不多说,我们进入正题!向大厂冲锋!

大白的编程日记. 1215

类型转换(C++)

C++类型转换

m0_69323023的博客 1147
上一篇: C语言入门:三目运算符和 if-else的联系与辨析
下一篇: 【C语言入门】`void` 类型:无类型函数返回值、通用指针
Mr_-G
Mr_-G 优质创作者: 嵌入式与硬件开发技术领域 优质创作者: 嵌入式与硬件开发技术领域
博客等级 码龄6年 7917粉丝 416原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值