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