You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带默认char参数的C++print函数调用异常:print(rep)无输出求解

问题分析:C++默认参数调用print(rep)无输出的原因

先看你给出的代码:

#include <iostream>

using namespace std;

int print(char c = '*', int num = 10);


int print(char c, int num)
{
    for (int i = 0; i < num; i++)
    {
        cout << c << endl ;
    }
    cout << endl;
    return 0;
}

int main()
{
    int rep;
    char letter;
    cout << "Enter a character : ";
    cin >> letter;
    cout << "Enter the number of times it has to repeat : ";
    cin >> rep;
    
    print(letter, rep);


    print(rep);
    print(letter);
    
    return 0;
}

核心原因:参数匹配顺序搞反了

C++里函数参数是按位置顺序匹配的,默认参数的规则是:只有当右侧的所有参数都使用默认值时,左侧的参数才能省略。你误以为调用print(rep)时,会把rep传给第二个形参num,同时第一个形参c使用默认值'*',但实际情况完全相反:

  • print(rep)中,rep是int类型,编译器会将它隐式转换为char类型,赋值给第一个形参c,第二个形参num则使用默认值10。
  • 你输入的rep是整数(比如10、5这类),转换为char后对应的是ASCII控制字符(比如10是换行符,5是查询字符),这些字符是不可打印的,所以你看不到任何输出,而非默认参数没生效。

解决方案

要实现“使用默认字符*,自定义重复次数”的需求,有两种常用方法:

1. 调整参数顺序(推荐)

把有默认值的参数放在右侧,符合C++默认参数的设计逻辑:

// 修改函数声明和定义的参数顺序
int print(int num = 10, char c = '*');

int print(int num, char c)
{
    for (int i = 0; i < num; i++)
    {
        cout << c << endl ;
    }
    cout << endl;
    return 0;
}

// 调用时对应调整顺序
print(rep, letter); // 自定义字符和次数
print(rep);         // 使用默认字符,自定义次数
print(10, letter);  // 自定义字符,使用默认次数(避免char隐式转int的歧义)

2. 增加函数重载

如果不想调整参数顺序,可以新增一个只接收int参数的重载函数,内部复用原函数逻辑:

// 新增重载
int print(int num)
{
    return print('*', num); // 显式使用默认字符,传入自定义次数
}

// 原函数保持不变
int print(char c = '*', int num = 10);
int print(char c, int num) { /* ... */ }

// 调用时正常使用
print(rep); // 自动匹配重载函数,输出*重复rep次

内容的提问来源于stack exchange,提问作者DSK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:35:00