1. 程式人生 > >C語言 函式預設引數

C語言 函式預設引數

這段程式碼也不知道誰是原創了,知道的話告訴我連結

#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缺少了一部分,自然是錯的