browser icon
You are using an insecure version of your web browser. Please update your browser!
Using an outdated browser makes your computer unsafe. For a safer, faster, more enjoyable user experience, please update your browser today or try a newer browser.

关于命名

Posted by on 2008 年 03 月 31 日

你可以任意转载本文,但请在转载后的文章中注明作者和原始链接。
媒体约稿请联系 titilima_AT_163.com(把“_AT_”换成“@”)。

今天的话题是从一个比较苛刻的角度出发的——命名,如果你觉得我是在杞人忧天的话,请无视并跳过。

C++代码
  1. #include <stdio.h>   
  2.   
  3. #define sqr(x) x * x   
  4.   
  5. int main(void)   
  6. {   
  7.     int a = 10, k = 2, m = 1;   
  8.     a /= sqr(k + m) / sqr(k + m);   
  9.     printf("a = %d ", a);   
  10.     return 0;   
  11. }  

代码很简单,题目的要求是写出程序运行的结果,考点是学生对于宏函数的理解。这个题的正确解法是,使用“x * x”来忠实替换所有的sqr宏括号中的文本。也就是说,最关键的一句将会被解释成:

C++代码
  1. a /= k + m * k + m / k + m * k + m;  

而不是

C++代码
  1. a /= (k + m) * (k + m) / (k + m) * (k + m);  

因此,这道题的正确答案应该是1,而不是10。如是一来,学生对于宏的机制的理解便加深了。
到现在为止,似乎所有的一切都没有问题。但其实不然,这里面存在着一个不容忽视的命名问题:
在没有看到sqr的具体定义之前,你认为它是做什么的?
square,平方。——我认为,这个解释是约定俗成的。但事实上,这个宏并不是求平方用的。我们那些伟大的、富有创造力的砖家和叫兽们把这个宏用在了一个病态的考察环境中。
或许我应该把这个理解为试卷上一个合理的心理陷阱,且用来考察学生对知识的掌握是否绝对够硬?
如果你企图让我承认这一点,那么请在任何的产品代码中找出类似的例子,先。或者说,作为程序员的你是否有胆量在协作的代码中写下这样的宏给别的程序员调用,以考察他们对宏函数概念的理解?
那么,来说我的观点。按照约定俗成,我建议这个宏在试卷上应该定义成下面的样子:

C++代码
  1. #define foo(x) x * x  

不知道foo含义的朋友们可以google一下。
末了,再聊聊有关命名的另一个问题。我们教材上的示例代码往往一口气定义很多一个字母的变量:a如何如何、b如何如何、c如何如何最后d如何如何……简而言之,这样的写法实在是望文难以生义,在弄懂代码的意思之前,先被变量的名字搞晕了。
我太苛刻了吗?先不要觉得我苛刻,且看:
1号传球给2号,2号传球给3号,3号传球给4号,4号射门,球进了。
如果你看球的时候喜欢听这样的解说词,那我承认我很苛刻就是了。

订阅本站

4 Comments

  • At 2008.04.03 00:42, limin said:

    李马正在逐渐走向像谭浩强教授那样的生活。。。

    • At 2008.04.04 21:56, sPhinX said:

      “square,平方。——我认为,这个解释是约定俗成的。但事实上,这个宏并不是求平方用的。”
      看了几次,不太明白这句话是什么意思,是说这样定义不够严格吗?对于数字来说,X*X不是求平方的意思吗?

      • At 2008.04.09 09:44, 李马 said:

        To sPhinX:
        如果是求平方的宏,应该写成这个样子:
        #define sqr(x) ((x) * (x))
        而题目中的宏定义,如我所说是一个心理陷阱(意欲让学生错误理解为求平方),但由于它存在的副作用使得它并没有实际存在的意义。所以称之为“foo”更合适。

        • At 2008.07.11 11:21, jadedrip said:

          我倒是觉得,试卷上的 sqr 是特意的。看题不仔细很可能直接进行平方运算。而且还能考察 宏和库函数 的优先级别问题。

          (Required)
          (Required, will not be published)