C++强制类型转换

C和C++的强制类型转换 C++ 四种强制类型转换 一般来说,我们需要类型转换的场景可以分为如下几种: 整型和浮点型以及不同长度的数据相互转换 一般规则是:占用内存低的向占用内存高的自动转换,而反向则会有转换截断的问题 整型和指针相互转换 当我们试图根据某个成员变量的偏移位计算其在该对象内存空间位置时,就会需要将指针转换为整型进行计算。当计算出该变量的位置后(整型),就需要将其转换为指针类型。 整型和枚举类型相互转换。 这种转换往往发生在数学计算的场景下。因为枚举一般只是用于表意,而实际参与运算的还是整型数据。 指针 阅读详情

先后看过几次关于C++类型转换的资料,甚至还用过几次,可对其了解还是很模糊,本次特别予以总结。不是随便写的,真的是用心写的,姑且看吧。

C++命名的强制类型转换也称作新式类型转换,也是C语言类型转换的一个演进。

看一个C语言的类型转换:

1 char *hopeItWorks = (char *)0x00ff0000;

《C++必知必会》一书把该种类型转换描述成“龌龊”,因为这种类型转换相对于C++的类型转换来说力度要大,大到有时你并不清楚具体发生了哪些转换,即有可能转换即使超出了你的期望而没有任何提醒,最终导致程序运行失败。个人观点,该书作者(译者)描述太过于夸张了,C语言是个奔放的语言,其设计理念之一就是:程序员清楚自已在做什么。

 

C++的类型转换其实把C语言类型转换细分了一下,一分为四。(当然,同时兼容老式类型转换)

1、const_cast

该操作符允许添加或移除表达式中类型的const或volatile修饰符:
1 const Person *getEmployee()
2 {
3     // do some thing and return const Person *
4 }
5 Person *anEmployee = const_cast<Person *>(getEmployee()); // C++类型转换
6 Person *anEmployee = (Person *)getEmployee();// C类型转换

上面给出两种类型转换,都是去掉函数所返回指针的const属性,表面上看是一样的,但是如果函数发生改变后,就能看出这两种转换的差异:
1 const Employee *getEmployee() // 返回类型变了
2 {
3     // do some thing and return const Employee *
4 }
5 Person *anEmployee = const_cast<Person *>(getEmployee()); // C++类型转换,编译提示错误
6 Person *anEmployee = (Person *)getEmployee();// C类型转换,编译不提示错误

这里函数返回类型发生改变,在const_cast试图将const Employee * 转换为Employee *时就已经超出了其能力范围,会在编译阶段给出提示,这往往是很有用的,当然,C++可以做到能力更强的类型转换,且向下看。

 

2、static_cast

编译器隐式执行的任何类型转换都可以由static_cast显式完成:
1 double d = 97.0
2 char ch = static_cast<char>d;//没有编译告警

对于从一个较大的算式类型到一个较小类型的赋值,编译器通常产生警告,当我们显式地提供强制类型转换时,警告信息就会关闭。此种类型转换告诉编译器:我想要一个静静的(static)转换,你懂的,请闭嘴。
静态转换常用于基类的指针或引用,转型为一个派生类的指针为引用。
需要注意的是这不是一个非常安全的转换,损失的精度需要程序员去考虑。使用此转换的一个考虑是:可跨平台移植。

3、reinterpret_cast

顾名思义,重新解释。它从位(bit)的角度来看待一个对象,从而允许将一个东西看作另一个完全不同的东西:
1 char *hopeItWorks = reinterpret_cast<char *>(0x00ff0000); // 把int假装成指针
2 int *hopeless = reinterpret_cast<int *>(hopeItWorks);//把char *假装成int *

这是个非常危险的转换,在C++类型转换里面威力也最大,非常容易出错。举个例子,一本横向排版的书,硬是按照竖向排版的方式进行解读,一般是读不出合理的内容。
给出一种几乎是错误的转换:
1 int *ip;
2 char *pc = reinterpret_cast<char *>(ip);
3 std::string str(pc); // 使用pc初始化一个string 对象,很可能出现运行时错误


4、dynamic_cast

顾名思义,动态的转换。大家知道,C++是具有多态特性的,该种转换仅用于对多态类型进行向下转型(也就是说,被转型的表达式的类型,必须是一个指向带有虚函数的类类型的指针)。上面讲的static_cast也可以从基类指换到派生类,但是不安全的。dynamic_cast执行运行期检查工作,来判定转型的正常性,当然是要会出代价的,好比,多态性也会带来性能开销一样。
01 const Shape *getNextShape()
02 {
03     // do some thing and return const Shape *
04 }
05 const Circle *cp = dynamic_cast<const Circle *>(getNextShape());
06 if(cp)
07 {
08     ...
09 }
10 注: Circle类派生于Shape类。


至此,C++四种转换都讲完了。总结一下,C++类型转换其实是对C语言类型转换的细分及扩充(扩充类类型之间的转换)。

《C++Primer》中有一句特别好:强制类型转换关闭或挂起了正常的类型检查。强烈建议程序员避免使用强制类型转换,不依赖强制类型转换也能写出很好的C++程序。

C++强制类型转换及代码示例 C++强制类型转换 阅读详情

相关推荐

PostgreSQL使用 pg_rman物理备份搭建流复制备库(streaming replication standby)

摘要:使用pg_rman备份搭建PostgreSQL流复制备库 本文详细介绍了利用pg_rman工具快速搭建PostgreSQL流复制备库的完整流程。该方法结合物理备份的高效性和流复制的实时性,特别适合大型数据库环境。主要内容包括:主库上的pg_rman安装配置、全量备份操作;备份文件传输至备库;备库数据目录准备及恢复;流复制参数配置;以及最终的启动验证步骤。文章还提供了架构示意图和关键配置示例,并包含常见问题排查建议,如备库无法启动或复制卡顿情况的处理方法。整个流程强调通过.pgpass文件管理密码的安全

liumangtuzi888的博客 1169

C语言的命名规范

在C语言中一般并命名的名字都被称为标识符。标识符是指一个字符组成的序列,通常包括变量名、常量名、函数名、程序名等。这些名字的命名都必须符合C语言的规范,否则程序运行是会出现错误。  命名时必须符合以下规定: C语言中严格区分大小写,例如“a“和”A”分别表示两个不同的命名,意义完全不一样。 C语言命名需要以下划线或者字母开头,不能以数字开头。 C语言中命名的名字长度不限,但一般只有前8位有效...

wangprince2017 3944

STM32的DMA模块及Protues仿真实验

(一)DMA简介      DMA(Direct Memory Access,直接存储器访问), 用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据。这样节省的 CPU 资源可 供其它操作使用。      STM32F407共有两个 DMA 控制器,总共有 16 个数据流(每个控制器 8 个),每一个 DMA 控制器都用于管理 一个或多

weixin_45930204的博客 2850

【C++从青铜到王者】第二十四篇:C++的类型转换

系列文章目录 文章目录系列文章目录前言一、C语言中的类型转换二、为什么C++需要四种类型转换三、C++强制类型转换1.static_cast类型转换2.reinterpret_cast类型转换3.const_cast类型转换4.dynamic_cast类型转换5.explicit总结 前言 一、C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转.

森明帮大于黑虎帮的博客 590

(南京观海微电子)——GH700X调试指南--SPI 接口+LVDS-测试盒使用方法

1表示OTP完成后,读取烧录值是否一致来判断是否烧录成功,2表示同时检测VCOM是否一致以及烧录次数是否增加,3表示不做任何检测,由用于自行在程序中判断。[格式]:SetFindVcomEn (<开启或关闭>),ON表示开启VCOM搜寻,默认是开启的,只要使能OTP烧录,按OTP按键则进行VCOM查询;[功能]:OTP完成检测类别,用于设置OTP完成后检测OTP次数还是OTP值来判断OTP是否成功。[功能]:用于设置VCOM查询使能,比如需要烧全代码而不需要对VCOM查询时,可以禁止VCOM查询。

m0_75095200的博客 1665

AD20丝印层导入图片logo保姆级教程(附黑白预览避坑技巧)

本文提供了一份详尽的AD20丝印层导入图片Logo的实战指南。核心在于将图片预处理为高质量的单色BMP位图,并独家分享了利用Windows画图工具进行“黑白预览”的关键技巧,以提前规避转换失真。教程涵盖了从脚本获取、图片处理、参数设置到生产规范的完整流程,帮助硬件工程师高效、准确地在PCB的Top Overlay层添加个性化标识。

weixin_29194255的博客 386

C++ 强制类型转换

什么是强制类型转换? 强制类型转换,是指显式地把一种类型的对象转换为另一种类型的行为。强制类型转换是危险的行为,但有时候我们又不得不使用强制类型转换。比如,分子分母为整数,但希望执行浮点数除法时,就需要把分子或分母强制转换成浮点数。 int a=1; int b=2; double c=(double)a/b; 旧式的强制类型 C风格的强制类型转换 C语言的强制类型转换格式如下: (type)expression; type是要强制转换的目标类型,express是被转换的对象,如: (double)a;

m0_55464171的博客 2056

基于simulink的软开关技术的三相逆变器仿真

三相逆变器中的软开关技术(Soft Switching Techniques)旨在减少开关损耗,提高效率,并降低电磁干扰(EMI)。实现软开关通常涉及使用谐振电路或准谐振电路来确保开关器件在零电压(Zero Voltage Switching, ZVS)或零电流(Zero Current Switching, ZCS)条件下进行切换。下面将详细介绍如何在Simulink中进行基于软开关技术的三相逆变器仿真设计。

xiaoheshang_123的博客 162

C++四种强制类型转换

文章目录1 C++类型转换本质1.1 自动类型转换(隐式)1.2 强制类型转换(显式)1.3 类型转换的本质1.4 类型转换的安全性2 四种类型转换运算符2.1 C语言的强制类型转换与C++的区别3 static_cast4 reinterpret_cast5 const_cast6 dynamic_cast6.1 向上转型(Upcasting)6.2 向下转型(Downcasting) 1 C++类型转换本质 1.1 自动类型转换(隐式) 利用编译器内置的转换规则,或者用户自定义的转换构造函数以及类型转换

u_hcy2000的博客 1万+

数据分析案例-对某宝用户评论做情感分析

目录 原始数据 绘制词云图 情感分析 原始数据 原始数据为某宝一商品的用户评论数据 绘制词云图 # coding=utf-8 import jieba import re import wordcloud import imageio # 打开需要分析词频的文本 with open('淘宝评论3.0.txt', encoding='utf-8') as f: data = f.read() # 文本预处理 :去除一些无用的字符只提取出中文出来 new_data

m0_64336780的博客 1万+

第 8 篇:TMC2240 电机正反转实现|DIR 引脚控制 + 代码优化(稳定不抖动)

本文详细介绍了TMC2240电机驱动芯片的正反转实现方法,重点解决方向切换时的抖动和冲击问题。文章首先明确了硬件连接、基础配置和使能状态三个前提条件,然后阐述了DIR引脚电平控制方向的核心原理,提供了STM32的GPIO配置代码。针对方向切换时的电流冲击问题,作者提出了"停止-延迟-切换-启动"的平滑切换逻辑,并给出了包含方向枚举、转速控制和方向切换函数的完整代码实现方案。通过这种优化方法,可以有效避免电机在正反转切换时产生的抖动、冲击声和发热问题,实现稳定的双向控制。文章还提示了后续可

BackCatK Chen的博客 2074

【C++】听说了吗,C++引入了四种强制类型转换

如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与 接收返回值类型不一致时,就需要发生类型转化,转换的前提是类型之间有一定的关联。 2、C++中的类型转换 上面举的例子都是内置类型之间,而内置类型和自定义类型之间、自定义类型和自定义型之间都是可以通过一定的方式互相转换的。| 内置类型和自定义类型之间:在前面的学习中我们经常说:单参数构造函数支持隐式类型转换,多参数也可以通过加进行隐式类型转换。 C++支持内置类型隐式类型转换为类类型对象,需要有相关内置类型为参数的构造函数 构造

小羊的博客 3720

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C++的四种强制类型转换

隐式类型转换:编译器在编译阶段自动进行,能转就转,不能转就编译失败。显式类型转换:需要用户自己处理,以`(指定类型)变量`的方式进行类型转换。

m0_72532428的博客 1267

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

探索C++类型转换与强制类型转换

1.背景介绍 C++是一种强类型的编程语言,类型安全性是其核心特性之一。类型转换和强制类型转换在C++中具有重要的作用,可以让我们更好地控制数据类型和数据操作。在本文中,我们将深入探讨C++类型转换与强制类型转换的核心概念、算法原理、最佳实践以及实际应用场景。 1. 背景介绍 在C++中,数据类型是一种用于描述数据的抽象,它决定了数据的存储方式、操作方法以及与其他数据类型的关系。类型转换是指...

AI天才研究院 1228

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C++的强制类型转换

C++因为兼容C的特性,对于C中的强制类型转换也是可以利用的 先来叙述强制类型转换的全过程 数据类型排名(从高到低):long double,double,float,unsigned long long int,long long int,unsigned long int,long int,unsigned int,int 有两个规则要注明: /* 规则 1:char、short 和 unsigned short 值自动升级为 int 值。细心的读者可能已经注意到,char、short 和 unsign

遇事不决,问春风 8026

C++之强制类型转换

C++中的强制类型转换是一种将一个数据类型转换为另一个数据类型的操作。在C++中,有四种类型的强制类型转换:静态转换、动态转换、常量转换和重新解释转换。(1)静态转换(static_cast):静态转换是最常用的一种类型转换,它可以在不同但相关的类型之间进行转换,如基本数据类型之间的转换、父类指针向子类指针的转换等。但是需要注意的是,静态转换没有运行时类型检查,因此在进行转换时需要确保类型之间是相关的,否则可能会导致错误。

专注 3031

关于C++四种强制类型转换

其中static_cast还是比较常用于void*类型的转化,reinterpret_cast是和static_cast横向对比的,一般来说。我们定义了一个const,就是不想让其改变,若是我们在代码随便一个地方使用const_cast就能改变常量值,那么对于大的项目来说,可能就完全乱套了。查看运行结果,问题来了,指针p和指针q都是指向a变量的,指向地址相同,而且经过调试发现002CFAF4地址内的值确实由10被修改成了20,这是怎么一回事呢?那么const_cast<>()怎么发挥作用的呢?

m0_73743517的博客 1670

C++_强制类型转换

C++为了规范强制类型转换的可观性与安全性,引入了4种强制类型转换符,他们分别是:static_cast、reinterpret_cast、const_cast、dynamic_cast。

安权_code的博客 1122

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

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

m0_73726899的博客 2225
上一篇: C++中数据类型
下一篇: C++中的异常处理
seadplus
博客等级 码龄15年 57粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值