C語言 函式預設引數
阿新 • • 發佈:2019-01-26
這段程式碼也不知道誰是原創了,知道的話告訴我連結
#include <stdio.h>
#define DEFARG(name, defval) ((#name[0]) ? (name + 0 ) : defval)
int _f1(int i)
{
return 2 * i;
}
#define f1(arg0) _f1(DEFARG(arg0, 0))
int _f2(int i, int j)
{
return i + j;
}
#define f2(arg0, arg1) _f2(DEFARG(arg0, 0), DEFARG(arg1, 1))
int main()
{
printf ("%d\n", f1());
printf("%d\n", f1(1));
printf("%d\n", f2(, ));
printf("%d\n", f2(2, ));
printf("%d\n", f2(, 3));
printf("%d\n", f2(4, 5));
return 0;
}
#define DEFARG(name, defval) ((#name[0]) ? (name + 0 ) : defval)
在這裡#name[0]中#的作用是把後面的引數轉換為字串,並且[0]取出字串中的第一個元素
如果name為空格,則#name為”“空字串,#name[0]為’\0’,表示式為假,此時表示式的值為defval
還有一個疑問為什麼是name+0,直接name不可以嗎?
當name為空格時,(name+0)就是+0,也就是0
如果是((#name[0]) ? (name ) : defval),當name為空格時,那麼最後就好比(a >b) ? : b缺少了一部分,自然是錯的