我对yq5的宏马桶理论!--本人评"带参数宏"和“函数”比较

我很佩服yq5的功力,他反客为主的本领让我再次无语!(更多yq5的来历,请参看 这个帖子)


yq5再次向我提问:请问使用宏有什么好处?

我竟无语!!

我感觉这仿佛是一个人突然站到我面前问我:“请问使用马桶有什么好处?”


在沉默30秒后,我终于回过神来,但我不能回答yq5“那是为了代码整洁易读",就像我回答使用马桶是为了”干净卫生“。

因为如果对方是个农村来的老乡,我答一句还算正常。而现在站在我面前的是一个戴着斯文眼镜的书生。我答了这个问题反倒成了弱智。


于是我反问yq5,“请教你好处是什么?”


yq5的回答,我就不赘述了,完全没有新意。就好象一个人在我面前说,你们总不能走到哪拉到哪儿吧?有一个马桶,你可以每次在一个固定的地方拉,而且当你想更新手纸的话,只需要这里来更换一次,而不是到处都放上手纸......


我又一次无语!但仍然点点头以避免尴尬。但心里却有一种想让他出丑的想法涌出来,我不得不承认,这很邪恶,但我发誓我其实很少这样。但我当时几乎不假思索的再次提问:


请问使用宏有什么坏处? (类似于:请问用马桶有什么坏处?)


就在我洋洋得意以为yq5这次理屈词穷的时候,yq5果然是有备而来,抛出这样一段代码:


#define MAX(x,y)    (x)>(y)?(x) : (y)


int max(int x, int y)

{

  return x>y?x:y;

}


  用宏 MAX(x++,y); 和用函数  max(x++,y); 结果一样吗?


我又一次沉默。

当然,主要原因是我不能确认MAX宏展开后, x++>y?x++ : y 这个表达式的处理逻辑是什么?确切一点,我不知道x到底会被自加1次还是2次? (事后我找到 一篇文章,并翻译了note2,但仍未发现能够解释这一情况的明确描述。编程实验结果请看 这篇帖子)

后来和yq5的PK不得不暂停,因为我发现yq5准备了数十个这样的问题准备问我,而我为他的前2个问题我已经浪费了1个多小时(本文省去了yq5在激辩过程中跟我论述他的处世哲学的n万字)。而我十分怀疑这几十道题是从一本叫做《程序员面试宝典》的无聊地摊书中搜罗而来。

我若是再跟他为这些问题无聊无聊的论证下去,我可就跟他和他的那本书一样是个十足的250了。

但我一直觉得别扭,难道这真的是宏的缺陷么?不能处理 后++?(postfix increment/decrement)

我觉得yq5的回答好比是说:马桶的坏处是我们老家的二伯蹲在马桶上拉大号,不料使劲的时候脚下一滑,摔下来跌破了头,裤子也撕了(够二!)

那么我的回答是您老不能坐在马桶上拉吗? #define MAX(x,y)    max(x,y) //宏调用函数
也许yq5会说,你最后不是还调用函数?那还有可比性么? 

对!我等你说这句话呢! 宏和函数有可比性么?一个是在预编译阶段的智能字符字符串替换,一个是runtime的基本程序单元;一个是写给编译器的,一个是写给cpu的;一个是马桶,一个自来水,虽然冲马桶需要水,可两者有什么可比的泥??

我把代码写成这样:


#define _max(x,y)    x>y?x : y


int max(int x, int y)  { return _max(x,y);}


#define MAX(x,y) max(x,y)


这怎么描述?马桶装的水是从另一个马桶来的!


或者我这样写:


int _ga, _gb;    //全局变量
#define MAX(x,y) (_ga=(x), _gb=(y), _ga>_gb?_ga:_gb)


宏MAX和函数max是不是一样的了?谁还能说出有什么不同??? (马桶的功能就是冲大便,管你用自来水还是用中水,都能冲)


我仔细想想是看不出来了,如果你知道请你告诉我。


                     ---翟某于马桶发奋而作

你可能感兴趣的:(函数,宏马桶,yq5)