C语言中的奇技淫巧

一.交换两个变量的值

/*常规写法*/
int temp = a;
a = b;
b= temp;

/*二进制写法*/
a ^= b ^= a ^= b;

二.计数

#include <stdio.h>

int main(int argc, char** argv) 
{
  int x = 10;
  while (x --> 0) {
    printf("%d ", x);
  }
  return 0;
}

会打印出9 8 7 6 5 4 3 2 1 0   相当于 (x--) > 0,先执行x--,返回x;再执行x>0;最后执行x = x - 1;

三.匿名数据结构

struct mylist {
    int a;
    struct mylist* next;
};

#define cons(x, y) (struct mylist[]){{x, y}}

struct mylist *list = cons(1, cons(2, cons(3, NULL)));
struct mylist *p = list;

四.函数重载

#define DFLT -1

#define ARG(X) X
#define _VA_ARG_NUM(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,N,M,...) ((N==M+1)?((N==1)?((#A0)[0]!=0):N):DFLT)
#define VA_ARG_NUM(...) _VA_ARG_NUM(__VA_ARGS__,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,-1)
#define _VA_ARG0(A0,...) A0
#define _VA_ARG1(A0,A1,...) A1
#define _VA_ARG2(A0,A1,A2,...) A2
#define _VA_ARG3(A0,A1,A2,A3,...) A3
#define _VA_ARG4(A0,A1,A2,A3,A4,...) A4
#define _VA_ARG5(A0,A1,A2,A3,A4,A5,...) A5
#define _VA_ARG6(A0,A1,A2,A3,A4,A5,A6,...) A6
#define _VA_ARG7(A0,A1,A2,A3,A4,A5,A6,A7,...) A7
#define _VA_ARG8(A0,A1,A2,A3,A4,A5,A6,A7,A8,...) A8
#define _VA_ARG9(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,...) A9
#define _VA_ARG10(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,...) A10
#define _VA_ARG11(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,...) A11
#define _VA_ARG12(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,...) A12
#define _VA_ARG13(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,...) A13
#define _VA_ARG14(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,...) A14
#define _VA_ARG15(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,...) A15
#define VA_ARG0(...)  ARG(_VA_ARG0(__VA_ARGS__,DFLT)+0)
#define VA_ARG1(...)  ARG(_VA_ARG1(__VA_ARGS__,DFLT,DFLT))
#define VA_ARG2(...)  ARG(_VA_ARG2(__VA_ARGS__,DFLT,DFLT,DFLT))
#define VA_ARG3(...)  ARG(_VA_ARG3(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT))
#define VA_ARG4(...)  ARG(_VA_ARG4(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT,DFLT))
#define VA_ARG5(...)  ARG(_VA_ARG5(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT))
#define VA_ARG6(...)  ARG(_VA_ARG6(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT))
#define VA_ARG7(...)  ARG(_VA_ARG7(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT))
#define VA_ARG8(...)  ARG(_VA_ARG8(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT))
#define VA_ARG9(...)  ARG(_VA_ARG9(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT))
#define VA_ARG10(...) ARG(_VA_ARG10(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT))
#define VA_ARG11(...) ARG(_VA_ARG11(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT))
#define VA_ARG12(...) ARG(_VA_ARG12(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT))
#define VA_ARG13(...) ARG(_VA_ARG13(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT))
#define VA_ARG14(...) ARG(_VA_ARG14(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT))
#define VA_ARG15(...) ARG(_VA_ARG15(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT))

#define mzcreate(...) (\
    (VA_ARG_NUM(__VA_ARGS__)==0)?zcreate(1,2,3,4):\
    (VA_ARG_NUM(__VA_ARGS__)==2)?zcreate(VA_ARG0(__VA_ARGS__),VA_ARG1(__VA_ARGS__),0,0):\
    (VA_ARG_NUM(__VA_ARGS__)==3)?zcreate(VA_ARG0(__VA_ARGS__),VA_ARG1(__VA_ARGS__),VA_ARG2(__VA_ARGS__),0):\
    (VA_ARG_NUM(__VA_ARGS__)==4)?zcreate(VA_ARG0(__VA_ARGS__),VA_ARG1(__VA_ARGS__),VA_ARG2(__VA_ARGS__),VA_ARG3(__VA_ARGS__)):\
    NULL\
)

void zcreate(int a, int b, int c, int d)
{
    GTK_LOG_INF(GTK_DBG_DRV_UART, "[%s]------------a:%d, b:%d, c:%d, d:%d", __func__ ,a ,b ,c ,d);
}

调用

mzcreate();
mzcreate(11,22);
mzcreate(11,22,33);
mzcreate(11,22,33,44);

VA_ARG_NUM(VA_ARGS) :获得参数个数。

VA_ARG0(VA_ARGS):参数列表中的第1个参数。

VA_ARG1(VA_ARGS):参数列表中的第2个参数。

五.数组指定成员初始化

int a[10] = 
{
    [0] = {1},
    [1] = {4},
    [2] = {5},
};

 

posted @ 2020-11-04 16:57  张妖刀  阅读(229)  评论(0)    收藏  举报