C语言函数中的默认参数

今天做题的时候写了一个函数,有两个参数,因为调用时有很多时候第二个参数的值是一样的,所以我就想把第二个参数值固定,调用时写一个参数就行了,第二个参数能给到默认值。

int jieceng(int a,int b){
    if(a <= 0 || b < 0){
        return -1;
    }
    int num = 1;
    for(;0<b;b--){
        num *= a;
        a--;
    }
    return num;
}

我想只传a的时候b能默认等于a;

在网上查了一些资料,发现C语言是没有默认参数的,C++有;在C语言中想要实现就得用宏。

像这样:

#define DEFARG(name, defval) ((#name[0]) ? (name + 0) : defval)
int _jieceng(int a,int b){
    if(a <= 0 || b < 0){
        return -1;
    }
    int num = 1;
    for(;0<b;b--){
        num *= a;
        a--;
    }
    return num;
}
#define jieceng(a,b) _jieceng(DEFARG(a, 0),DEFARG(b,a))

其中,调用时就用jieceng();  _jieceng()是给jieceng()服务的。

但是调用的时候我发现,像这样

jieceng(5);

会报错。

必须得

jieceng(5,);

才不会报错。是我编译器的问题吗

还有一个问题

#define DEFARG(name, defval) ((#name[0]) ? (name + 0) : defval)

其中的#name[0] 代表的是什么,为什么要这么写?

这段代码是一个宏定义,用于提供一个默认参数值的机制。具体来说,#name 是 C 预处理器的一个特殊操作,称为字符串化操作,它会将宏参数 name 转换为一个对应的字符串字面量。而 (#name[0]) 则检查这个字符串的第一个字符是否为非空字符,以此来判断宏参数 name 是否被定义且非空。

根据上述检查的结果,宏会选择:

        1.如果 name 非空,则表达式 (name + 0) 相当于直接使用 name 的值,因为 +0 对于任何表达式都是恒等操作。
        2.如果 name 为空或未定义,则使用提供的默认值 defval。

结合这段

#define jieceng(a,b) _jieceng(DEFARG(a, 0),DEFARG(b,a))

当调用这个宏的时候,只输入一个参数时,第二个参数就会默认使用第一个了,不过缺点就是必须得输入一个逗号。

jieceng(5,);

参考:csdn-C语言中的参数默认值

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值