C++入门系列博客二 C++ 控制流

C++从入门到精通系列教程之第三篇:控制流与循环结构 在编程中,控制流语句决定了程序的执行顺序。通过条件判断和循环控制,我们可以使程序根据不同条件做出不同的决策,或重复执行某段代码直到满足特定条件。条件判断语句ifif-elseelse if:根据布尔表达式的真假选择执行代码块。:针对一个变量的多个可能取值进行多路分支选择。循环语句for循环:通常用于已知循环次数的场景。while循环:用于在条件满足时重复执行。do-while循环:至少会执行一次循环体,再根据条件判断是否继续执行。 阅读详情

C++ 控制流


控制流

为什么会有控制流这玩意呢?那是因为程序不总是按顺序执行。这个很好理解,生活中也随处可见。例如:如果今天不下雨,那我就去打篮球,否则,宅在宿舍打LOL。这个就可以对应if else这种控制流结构了。控制流在大多数的语言中都是有的,而且也基本上都是 while for if这三剑客或者变种。

程序设计语言一般都会提供多种不同的控制流语句,允许我们执行更为复杂的执行路径。


while语句

while 语句 反复执行一段代码,直至给定的条件为假(false)为止。while语句的形式为:

while (condition)
    statement

让我们用while语句来完成一个小任务:求整数1到100的和。 知道大数学家高斯的人,想必都知道这个经典问题的出处。直接上代码:

#include <iostream>

using namespace std;

int main()
{
    int sum = 0;          // sum用于存储和
    int x = 1;            // 当前要加的值
    while (x <= 100)    // 判断当前值是否小于等于100
    {
        sum = sum + x;    // 和加上当前要加的值
        x = x + 1;        // 当前值加1,往后递推。
    }

    cout << "整数1到100的和为" << sum << endl;

    return 0;
}

注释比较详尽,就不一一解释了。使用while语句特别要注意的是条件以及条件的改变,不然容易造成死循环,使程序崩溃。例如上面的程序,粗心的人忘了写 x = x + 1 这一句,那么程序就会陷入死循环。

最经典的Windows消息机制也是用的while语句,像这样:

// 消息循环过程
MSG msg = {0};
while (msg.message != WM_QUIT)        // 如果没有退出消息
{
    if(PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE))
    {
        TranslateMessage(&msg);        // 将虚拟按键装化为字符
        DispatchMessage(&msg);        // 分发消息给程序窗口
    }
}

还有一些输入不确定数量的数,也可以使用while语句解决。

问题:输入若干个整数,求其和。

#include <iostream>

using namespace std;

int main()
{
    int sum = 0;        // sum用于存储和
    int x = 0;            // 当前要输入的值
    int num = 0;        // 记录一共输入了几个数
    while (cin >> x)    // 读取数,一直遇到结束符为止
    {
        num = num + 1;
        sum = sum + x;    // 和加上当前要加的值
    }

    cout << "你一个输入了" << num << "个数," << "这些数的和为:" << sum << endl;

    return 0;
}

在Windows系统下,结束输入的组合键是 Ctrl + Z,然后回车。 Linux系统下是 Ctrl + D。 Max OS系统下是 Ctrl + D

另外,还有个和while有关的是do while结构的语句。这种结构会至少执行一次循环体,然后检查while中的条件是否成立。看示例:

#include <iostream>

using namespace std;

int main()
{
    int count = 0;        // 记录一共执行了几次循环体
    
    do
    {
        count = count + 1;
        // 一段你想执行的代码
    } while (false);
    
    cout << "语句块执行的次数为:" << count << endl;

    return 0;
}

输出结果为1,也就是说,这种结构至少执行一次 do 语句块中的代码。


for 语句

像while语句这样在循环条件中检测变量,在循环体中改变变量的模式非常频繁。于是一个专门的语句出现了,它就是 for 语句。 for语句的形式为:

for(init-statement; condition; expression)
    statement

每个for语句都包含两部分:循环头和循环体。循环头控制循环体的执行次数,它由三个部分组成:一个初始化语句(init-statement),一个循环条件(condition)以及一个表达式(expression)。

for循环和while循环是可以相互转换的。
看之前的一个小任务:求整数1到100的和。 使用for语句完成如下:

#include <iostream>

using namespace std;

int main()
{
    int sum = 0;        // sum用于存储和
    
    for (int x = 1; x <= 100; ++x)
    {
        sum += x;        // 和加上当前要加的值
    }

    cout << "整数1到100的和为" << sum << endl;

    return 0;
}

简述一下for循环的总体执行流程

  1. 创建变量x,将其初始化为1
  2. 检测变量x是否小于等于100,若检测成功,执行for循环的循环体。若失败,退出循环。继续执行循环体之后的代码。
  3. 将x的值增加1
  4. 重复第2步中的检测条件,只要条件为真,就继续执行剩余步骤。

需要注意的是,for语句的初始化语句、循环条件、表达式都是可以省略的。例如for (; ;){},相当于while(true){}。 所以说,for语句使用不当,也会造成死循环。

范围for语句

C++ 11新标准引入的一种更简单的for语句。这种语句可以遍历容器或者其他序列的所有元素。

范围for语句(range for statement) 的语法形式如下:

for (declaration : expression)
    statement

declaration 定义了一个变量,序列中的每个元素都是能转换成该变量的类型。

expression 必须是一个序列。 例如可以是 数组、vector或者string等对象。

看代码:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> v = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };

    // 范围for语句。如果想要改写范围变量,则需要把它写成引用形式。
    for (auto& val : v)
    {
        val = val * val;
    }

    // 普通的for语句
    for (vector<int>::iterator iter = v.begin(); iter != v.end(); ++iter)
    {
        cout << *iter << " ";
    }

    return 0;
}

输出结果为:81 64 49 36 25 16 9 4 1 0

可见容器内的值已经被改变。


if 语句

if语句也就是条件语句。大部分语言都支持了if语句。if语句的形式为:

if (condition)
    statement

另一种if语句带else分支,形式为:

if (condition)
    statement
else
    statement2

如果condition为真,则执行statement语句,否则执行statement2语句。

另外还有就是嵌套的if语句,像这样:

if (condition)
{
    // other code
    if (condition1)
    {
        // other code
    }
    else
    {
        // other code
    }
}
else
{
    // other code
}

建议大家像我一样,使用方括号和缩进,来控制执行路径,解决垂悬else问题,也使得代码更加可读。

看一个《C++ Prime》上的一个例子:统计输入中的每个值连续出现的次数。

#include <iostream>

using namespace std;

int main()
{
    // currentVal 是我们正要统计的数,我们将新的值存入val
    int currentVal = 0, val = 0;
    
    // 读取第一个数,并确保有数据可以处理
    if (cin >> currentVal)
    {
        int count = 1;                // 保存我们正在处理的当前值的个数
        while (cin >> val)
        {
            if (val == currentVal)    // 如果值相同
            {
                ++count;
            }
            else                    // 如果值不同,则打印出现的个数
            {
                cout << currentVal << "出现了" << count << "次" << endl;

                currentVal = val;    // 记住新出现的这个值
                count = 1;            // 重置计数器
            }
        }    // while循环到这里结束

        // 打印文件中最后一个值的个数
        cout << currentVal << "出现了" << count << "次" << endl;
    }        // 最外层if语句结束

    return 0;
}

最基本的流程控制实际就这三个,也是大多数语言所支持的。其他的一些控制流其实都可以用这三个来转换。下面介绍一下switch语句和跳转语句,他们也是控制流程语句的一份子。


switch 语句

switch语句(switch statement) 提供了一条便利的途径使得我们在若干个固定选项中做出选择。switch语句形式如下:

switch (switch_on)
case x1:
    statement1
    break;
case x2:
    statement2
    break;
// other case 
default:
    statementn
    break;

case关键字和它对应的值一起被称为 case标签(case label)。 case标签必须是整型常量表达式。

下面用一段代码来说明此问题:

问题: 统计一段小写文本中元音字母出现次数,以及非元音字母出现的次数。

代码:

#include <iostream>

using namespace std;

int main()
{
    // 五个元音分别统计
    int aCount = 0, eCount = 0, iCount = 0, oCount = 0, uCount = 0;
    // 非元音统计
    int otherCount = 0;

    char ch;
    while (cin >> ch)
    {
        switch (ch)
        {
        case 'a':
            ++aCount;
            break;
        case 'e':
            ++eCount;
            break;
        case 'i':
            ++iCount;
            break;
        case 'o': 
            ++oCount;
            break;
        case 'u':
            ++uCount;
            break;
        default:
            ++otherCount;
            break;
        }
    }

    cout << "元音字母a出现的次数为:" << aCount << endl;
    cout << "元音字母e出现的次数为:" << eCount << endl;
    cout << "元音字母i出现的次数为:" << iCount << endl;
    cout << "元音字母o出现的次数为:" << oCount << endl;
    cout << "元音字母u出现的次数为:" << uCount << endl;

    cout << "非元音字母出现的次数为:" << otherCount << endl;

    return 0;
}

输入:acetanlovesnail

输出:

元音字母a出现的次数为:3

元音字母e出现的次数为:2

元音字母i出现的次数为:1

元音字母o出现的次数为:1

元音字母u出现的次数为:0

非元音字母出现的次数为:8

这里要注意每个分支下的break,它代表结束当前的控制流,break下文会讲到。新手常犯的错误就是漏写break,漏写break最容易导致逻辑错误,漏写break后,程序会继续执行下面的代码。例如:上面的程序

case 'i':
    ++iCount;    // 漏写了break
case 'o': 
    ++oCount;    // 漏写了break
case 'u':
    ++uCount;

如果有一个元音字母i,那么iCount会加1,oCount也会加1,uCount也会加1。这一点千万要注意。

switch语句是可以转化为if语句的,这很容易看出来。


跳转语句

跳转语句是中断当前的执行过程。C++中提供了四种跳转语句:break, continue, goto, return.

break语句(break statement) 负责终止离它最近的while, do while, for 或者switch语句,并从这些语句之后的第一条语句开始执行。

break语句只能出现在迭代语句或者switch语句内部。例子可以参考上面switch的例子。

continue语句(continue statement) 终止离它最近的循环中的当前迭代并立即开始下一次迭代。

continue语句只能出现在for, while, do while循环的内部,或者嵌套在此类循环里的语句或者块的内部。

goto语句(goto statement) 的作用是无条件跳转到同一函数内的另一条语句。

不要在程序中使用goto语句,因为它使得程序既难理解又难修改。

goto语句是一个比较有意思的语句,虽然各种教材都说它很危险,不推荐使用。但它有时候也能起到奇效的作用。

goto语句的形式为:

goto label;

其中label是用于标示某条语句的标示符。 带标签语句(labeled statement) 是一种特殊语句,在它之前有一个标示符以及一个冒号。

end: return; // 带标签语句,可以作为goto的目标

goto语句一个优点就是它可以在很深的嵌套层次中直接跳到最外围,否则你只能break一层一层的跳。其实
Java也保留了这种用法,不过换了语法变成break label;

使用goto语法:

for (...) 
{
    for (...) 
    {
        for (...) 
        {
            for (...) 
            {
                for (...) 
                {
                    for (...) 
                    {
                        if (...) 
                            goto:outside;
                    }
                }
            }
        }
    }
}

outside:

goto只能在函数体内跳转,不能跳到函数体外的函数。即goto有局部作用域,需要在同一个栈内。

return 语句(return statement) 终止当前正在执行的函数并将控制权返回到调用该函数的地方。
return 语句有两种形式:

return;

return expression;

return 函数非常常见,每个函数都要使用它。其中,无返回值函数使用第一种形式。有返回值函数使用第二种形式。 需要注意的是:

在含有return语句的循环后也要有一条return语句,如果没有的话,那么该程序就是错误的。很多编译器都无法发现此类错误。

其实,比较新的编译器都会给出警告的。例如VS2015会给出这样的警告:

warning C4715: “”: 不是所有的控件路径都返回值

在Code::Blocks上会给出这样的警告:

warning: control reaches end of non-void function [-Wreturn-type]|

结束语

关于C++的控制流就介绍到这里,希望各位读者能熟练掌握和应用。

C++从入门到精通系列教程之第一篇:C++基础入门与环境搭建 大家好,欢迎来到C++从入门到精通系列教程的第一篇博客!本系列旨在帮助广大初学者从零开始,逐步掌握C++这门功能强大、用途广泛的编程语言。文章中我们将穿插大量实训案例和代码解析,并且所有代码都附有详细的中文注释,力求让大家能够轻松跟上学习进度。 阅读详情

相关推荐

C++从入门到精通系列教程之第五篇:数组与字符串

数组是存储相同数据类型的一组连续内存空间,便于批量存储和操作数据。固定大小:数组的长度在声明时确定,不能动态改变(标准数组)。下标索引:数组元素可以通过下标(从0开始)访问。连续存储:数组中的数据在内存中连续存放,有助于提高访问效率。

氮气蜗牛的博客 1256

C++ 中流操作控制

C++中把数据之间的传输操作称为流。C++的流是通过重载运算符 “<<” 和 “>>” 执行输入和输出操作。输出操作是向流中插入一个字符序列,因此,在流操作中,将左移运算符 “<<” 称为插入运算符。输入操作是从流中提取一个字符序列,因此,将右移运算符“>>” 称为提取运算符。 1、cout cout 代表显示器,执行 cout << x...

shouwangyunkai666的博客 2527

C++从入门到精通系列教程之第六篇:指针与引用

大家好,欢迎继续关注C++从入门到精通系列教程!在前几篇文章中,我们已经学习了C++的基本语法、数据类型、控制流、循环、函数、数组与字符串等基础知识。这些内容为理解更深层次的C++概念奠定了坚实基础。本篇博客将深入介绍C++中两个十分关键的概念——与。通过本篇教程,你将学会如何使用指针进行内存地址的操作、进行动态内存分配,并了解引用的定义与用法,掌握它们在实际开发中的应用。文章中包含了详细的代码示例和中文注释,帮助新手逐步掌握指针与引用的核心概念。

氮气蜗牛的博客 1009

C++流程控制语句

C++流程控制语句 语句是C++程序中的基本功能单元。任何一条C++语句都会为完成某项任务而进行相关的操作。C++语句通常以分号作为结束标志。 C++中的语句分为以下几种: 表达式语句:是最简单的语句形式,一般格式为:表达式; 空语句:只由一个分号构成的语句,一般格式为: ; 注意:空语句不执行任何操作,但具有语法作用。例如:for循环在有些情况下,循环体或者循环判别条件是空语句。 复合语句:由“{}”括起来的一组语句,一般格式为: { 若干语句序列 } 注意:复合语句描述一个块,在语法上起一

cnds123的专栏 2606

C++从入门到精通系列教程之第十篇:异常处理与调试技巧

C++允许我们自定义异常类,以便传递更丰富的错误信息。自定义异常类通常继承自,并重写what()方法返回错误描述。#include <exception> // 包含std::exception// 定义一个自定义异常类,继承自std::exceptionprivate:// 异常描述信息public:// 构造函数,初始化错误信息// 重写what()方法,返回错误描述// 修改除法函数,抛出自定义异常throw DivideByZeroException("错误:尝试除以零!")

氮气蜗牛的博客 1039

C++从入门到精通系列教程之第四篇:函数、参数与递归

在C++中,函数是完成特定任务的代码块。模块化设计:将大问题拆分成多个小问题,各自用函数解决,便于管理和维护。代码复用:将常用代码封装为函数,重复使用而不必多次编写。逻辑清晰:使主程序结构更清晰,便于调试和扩展。在C++中,为了让编译器知道函数的存在,我们通常需要先声明函数,再定义函数。函数声明(原型):告诉编译器函数的名称、返回类型和参数列表,但不提供函数体。函数定义:包括函数声明和函数体,实现具体的功能。// 函数声明:声明一个计算两个整数之和的函数// 调用函数return 0;

氮气蜗牛的博客 988

C++基本控制结构

一、C++中的基本控制结构 C++的控制流由三种基本结构组成:顺序结构、分支(选择)结构、循环结构。这三种基本结构可以组成所有的各种复杂程序。 基本控制结构中的主体框架由控制语句组成,结构如下: 1.条件判断语句 1.1if语句(3类) (1)if语句 if(表达式)语句;表达式两边的括号必不可少 (2)if…else语...

diebiao8992的博客 551

深入理解C++中的运算符和控制流

本文详细解读了C++中条件运算符、表达式的求值顺序、特殊运算符(sizeof和逗号运算符)、赋值运算符以及控制流结构(包括if、if-else、嵌套if和switch语句)。通过具体的示例和程序代码,深入探讨了这些概念的工作原理和编程实践中的应用。

weixin_42579969的博客 978

第 5 章

5.1 【出题思路】 理解空语句的形式和用法。 【解答】 空语句是最简单的语句,空语句由一个单独的分号构成。如果在程序的某个地方,语法上需要一条语句但是逻辑上不需要,此时应该使用空语句,空语句什么也不做。 一种常见的情况是,当循环的全部工作在条件部分就可以完成时,我们通常会用到空语句。使用空语句时最好加上注释,从而令代码的阅读者知道这条语句是有意省略内容的。 5.2 【出题思路】 理解块...

bangren3304的博客 367

掌握C++中的控制流与决策结构

本文深入探讨了C++编程中的控制流语句,包括break、continue和goto语句的使用,以及循环和条件语句的优先级。通过实践问题和示例代码,本文帮助读者更好地理解并应用这些基础概念。

weixin_35752645的博客 315

C++中的逻辑运算符与控制流语句

本篇博客深入探讨了C++中的逻辑运算符以及控制流语句的使用和优先级。从逻辑与、逻辑或到逻辑非运算符的细节,到如何在复杂的条件表达式中正确使用括号,再到break、continue和goto语句在循环控制中的应用,文章提供了丰富的实例和解释,帮助读者更好地理解和运用这些概念。

weixin_28949937的博客 544

C++格式控制

格式控制     当输入/输出的数据没有指定格式,它们都按缺省的格式输入/输出。然而,有时需要对数据格式进行控制。这时需利用ios类中定义的格式控制成员函数,通过调用它们来完成格式的设置。ios类的格式控制函数如下所示:long flags( ) const 返回当前的格式标志。 long flays(long newflag) 设置格式标志为newflag,返回旧的格式标志。 long

fengyu0556的专栏 1343

从萤石云到GB28181:海康4G摄像机接入第三方平台的曲折之路

本文深入探讨了海康4G摄像机接入第三方平台时遇到的协议冲突问题,特别是GB28181与萤石云服务的互斥性。通过技术分析揭示了4G模块的定向流量限制和协议栈资源竞争等核心问题,并提供了有线接入测试和萤石云API二次开发等解决方案。最后总结了设备选型的关键参数和协议兼容性检查清单,为安防监控系统集成提供实用指导。

mango的博客 991

C++Primer 控制流

专栏简介:本专栏主要面向C++初学者,解释C++的一些基本概念和基础语言特性,涉及C++标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级程序设计技术。希望对读者有帮助!

专注于C/C++编程语言的博客,如果读者对C/C++语言有任何需要咨询的可以私信联系! 982

UE4_后期处理六—夜视仪、扫描线

观察下面一组蓝图节点的效果:当把角色的自定义深度通道开启:画面效果如图:这样我们就得到了一个这样的黑白蒙版。

Growthofnotes的博客 1733

EEG | CHB-MIT癫痫数据集CNN分类实战(一)

CHB-MIT癫痫数据集CNN分类实战

Always learn from the best. 1万+

《 C++ 点滴漫谈: 二十六 》控制流艺术:如何在 C++ 中驾驭程序逻辑

控制流是 C++ 编程语言的核心之一,它决定了程序的执行顺序和逻辑。本篇博客详细解析了 C++ 控制流的各个方面,包括顺序控制、选择控制、循环控制、跳转控制以及异常处理机制。我们还探讨了现代 C++ 提供的增强特性,如范围循环、std::optional 和 std::variant,并展示了如何通过优化控制流设计提升代码效率和可读性。结合实际案例与最佳实践,博客总结了控制流在复杂逻辑实现中的应用技巧和常见问题解决方案。无论您是初学者还是资深开发者,本篇博客都将帮助您更全面地掌握 C++ 控制流,并在实际开

Lenyiin 4248

Centos7搭建OpenStack+创建iaas云主机

主要说明在控制节点和计算节点上,通过脚本的形式,安装OpenStack的iaas安装步骤和创建可运行的云主机。提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。

weixin_48218106的博客 1万+

C++学习系列(1):C++基础入门

C++ 由在 20 世纪 80 年代开发,基于 C 语言扩展了面向对象编程特性。高效性:提供了底层控制能力,适用于性能要求高的应用。面向对象:支持封装、继承、多态等特性,利于代码复用和维护。泛型编程:提供模板(template)机制,增强代码的通用性。标准库丰富:包括 STL(标准模板库),提供强大的数据结构和算法支持。

Azperk的博客 374

别再乱调了!Zygo MetroPro软件滤波功能保姆级指南,从均值到鲁棒高斯样条一次讲清

本文深入解析Zygo MetroPro软件的滤波功能,从均值滤波到鲁棒高斯样条等九种算法,帮助用户根据测量对象特性选择最佳滤波组合。通过真实工业案例和参数配置指南,提升光学测量数据的准确性和效率,特别适用于硅晶圆、光学镜片等精密测量场景。

weixin_30888413的博客 155

如何使用 SAP ABAP Development Tool 连接 SAP BTP 上的免费 ABAP 编程环境

在云端环境编写 ABAP 代码会遇到一些限制,比如你无法在云端 ABAP 编程环境进行发生在传统 SAPGUI 里的 Dynpro 和 Screen 编程。部分在 SAPGUI 里使用的 List 处理相关的关键字比如 WRITE,还有 CALL TRANSACTION 等代码,也无法在云端使用。 当然如果大家觉得上面提到的这些限制不会影响自己的 ABAP 学习,就可以继续本文的阅读,使用 ABAP Development Tool 登录云端的 ABAP 编程环境。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1513

C++入门教程(九、语句与控制流)

前面我们已经为大家讲解了很多C++的数据结构和知识,其中有些需要用到一些语句。您也可以不在这里写任何语句,只要有一个分号出现即可。如果为真,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。该语句可以留空,只要在条件后有一个分号出现即可。如果为真,则执行循环主体。如果为假,则不执行循环主体,且控制流会跳转到紧接着。以上就是我为大家带来的“C++入门教程(九、语句与控制流)”,你学会了吗?注意一个等号是赋值,两个等号是判断是否相等。需要记住,在需要跳出的时候,在语句后面加上。...

YoungGeeker 970

CloudCompare 二次开发(17)——点云添加均匀分布的随机噪声

使用CloudCompare编程实现点云添加随机噪声。

点云侠的博客 839

1.C++ 控制流 总结

 C++基础代码层面(例子-核心语句说明-总结)  概览  While 语句 for 语句 if 语句  拓展 while语句  一个简单的求和程序:sum=1+2+...+10 #include &lt;iostream&gt; using namespace std; int main(){ int sum=0,val=1; while(val&lt;=10...

salmon_djr的博客 394

Agisoft Metashape 基于RTK技术的无人机航测免像控技术流程

利用无人机进行航空摄影测量,其使用方便、快速获得成果,已经是测绘行业外业生产的主要方式。RTK定位系统的出现,其厘米级的定位系统,使得航测无人机在作业时,能够准确获取拍照时的GPS位置,能够大量减少像控点,即使不使用像控点也能满足规范对精度的要求。可以有效解决特殊地形(如山川、峡谷、河流、沼泽、水库等)外业人员很难布设像控点的情况。

penglu366366的博客 2187

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

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

CSAPP笔记——第八章异常控制流

介绍应用程序是如何与操作系统进行交互的

做一个善良的人,做好自己的事,如果愿意,再发一份光。 1074

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

上一篇: gcc编译C++程序
下一篇: C++简介(3)--引用和指针
废言Pro
博客等级 码龄16年 1092粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值