Sep 20

M67的那篇文章在这:http://www.matrix67.com/blog/archives/1598
很久之前就转到自己博客上来了,在这里,当时也没细看,当然也没看明白。
今天仔细分析了下,终于明白怎么回事了。
先用字符串“I love you to death! You are the cutest and sweetest girl I've ever met.”生成程序为:

     #include      <stdio.h>
   main(t ,_,a)  char*a;{return
 t<1?main(*a,a[-t],"=a-1kj3gnm:q\
ebh_cf*<r.d>i^+?,()[?qzyrjuvcdefg\
h,!kbpolwxs'.t main(")&&a[-t]&&main
(t-1,_,a):t/2?_==*a?putchar(32[a])
  :_%115<36||main(t,_,a+1):main(
    0,t,")?r<g:?1<3?+<#?#m:}(\
      w+b_?1<}3?tt(yk:?+|b:\
        ?n3+:>+?([m?>.::+\
          :>+?e)kr?)ig{\
            :?y:~g:k?\
              ,:+^")
                ;}

是一个很漂亮的心形,用gcc编译执行输出:

i love you to death! you are the cutest and sweetest girl i've ever met.#

Apr 27
 // 一般使用方法
// #include <stdarg.h>
// void some_function(type1 var1,type2 last,...)
// {
//     va_list ap;
//     va_start(ap,last);
//     ...
//     typex var=va_arg(ap,typex);
//     ...
//     va_end;
//     return;
// }

// stdarg.h
// va_list 其实就是一个字节指针
typedef char *va_list;

// _va_size(type)总是4的倍数,因为系统在处理压栈的时候总是4字节对齐的。
#define	__va_size(type) \
	(((sizeof(type) + sizeof(long) - 1) / sizeof(long)) * sizeof(long))

// last是最后一个压栈的参数(也是第一个已知类型的参数),ap指向其后一个参数,即可变参数开始的地方。
#define	va_start(ap, last) \
	((ap) = (va_list)&(last) + __va_size(last))

// 得到类型为type的参数,并使ap指向下一个参数。
#define	va_arg(ap, type) \
	(*(type *)((ap) += __va_size(type), (ap) - __va_size(type)))

// 为了结构的完整性而定义。
#define	va_end(ap)	((void)0)