本文来自:/?p=830
语言是人与人相互沟通的途径,而计算机语言则是人和计算机沟通的途径。就算是任何再完美的自然语言都会有歧义,但是又是什么让人和计算计算机间产生了歧义呢?
下面这篇文章来自Gowri Kumar的Puzzle C一文。我做了一些整理,挑选了其中的一些问题,并在之后配上相应的答案(这些答案是我加的,如果需要原版的答案可以直接和本文作者Gowri Kumar联系,作者的联系方式可以从这里得到)。
puzzle 1
此段程序的作者希望输出数组中的所有元素,但是他却没有得到他想要的结果,是什么让程序员和计算机产生歧义?
02.#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0])) 03.int array[] = {23,34,12,17,204,99,16}; 04.int main() 05.{ 06.int d; 07.08.for(d=-1;d = (TOTAL_ELEMENTS-2);d ) 09.printf( %d ,array[d 1]); 10.11.return 0;
解答:
运行上面的程序,结果是什么都没有输出,导致这个结果的原因是sizeof的返回值是一个unsinged int,为此在比较int d 和TOTAL_ELEMENTS两个值都被转换成了unsigned int来进行比较,这样就导致-1被转换成一个非常大的值,以至于for循环不满足条件。因此,如果程序员不能理解sizeof操作符返回的是一个unsigned int的话,就会产生类似如上的人机歧义。puzzle 2
看上去非常完美的程序,是什么导致了编程程序不通过?
解答:
程序员要以计算机的语言进行思考,不上上面那段程序导致的结果不止是歧义这么简单,而直接的结果是,导致计算机 听不懂 你在说什么。导致计算机听不懂的原因是HP-UX中的 -"是减号?还是其他什么?puzzle 3
下面这段程序会输出什么,为什么?
解答:
1到14?不对,结果是1,因为continue的含义是不执行循环体之后语义,而直接到循环点。明显while(false)不属于循环体。导致这段程序的歧义就是:程序员没有完全理解计算机语言中continue的含义。puzzle 4
下面这段程序的输出结果是:
当然,你首先要了解##和#的用法,如果不懂的话,本题你可以直接跳过。
解答:
看到这段程序你可能会认为,这两个printf输出的同一个结果,可是答案却非如此,本题的输出是12和f(1,2),为什么会这样呢?因为这是宏,宏的解开不象函数执行,由里带外。puzzle 5
下面这段程序的输出是什么
#include stdio.h
int main()
{
int a=10;
switch(a)
{
case 1 :
printf( _disibledevent="http://blog.eastmoney.com/qbi74428qy/blog_151468467.html" target="_blank">http://blog.eastmoney.com/qbi74428qy/blog_151468467.htmlhttp://blog.eastmoney.com/qdx15378qu/blog_151468466.html