青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

勤能補拙,Expter

成都游戲Coder,記錄游戲開發過程的筆記和心得!

轉:語言的歧義

by:http://cocre.com/?p=830


語言是人與人相互溝通的途徑,而計算機語言則是人和計算機溝通的途徑。就算是任何再完美的自然語言都會有歧義,但是又是什么讓人和計算計算機間產生了歧義呢?
下面這篇文章來自Gowri Kumar的Puzzle C一文。我做了一些整理,挑選了其中的一些問題,并在之后配上相應的答案(這些答案是我加的,如果需要原版的答案可以直接和本文作者Gowri Kumar聯系,作者的聯系方式可以從這里得到)。

puzzle 1

此段程序的作者希望輸出數組中的所有元素,但是他卻沒有得到他想要的結果,是什么讓程序員和計算機產生歧義?

#include <stdio.h>
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
int array[] = {23,34,12,17,204,99,16};
int main()
{
int d;
for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)
printf("%d\n",array[d+1]);
return 0;
}

解答:
運行上面的程序,結果是什么都沒有輸出,導致這個結果的原因是sizeof的返回值是一個unsinged int,為此在比較int d 和TOTAL_ELEMENTS兩個值都被轉換成了unsigned int來進行比較,這樣就導致-1被轉換成一個非常大的值,以至于for循環不滿足條件。因此,如果程序員不能理解sizeof操作符返回的是一個unsigned int的話,就會產生類似如上的人機歧義。

puzzle 2

看上去非常完美的程序,是什么導致了編程程序不通過?

#include <stdio.h>
void OS_Solaris_print()
{
printf("Solaris - Sun Microsystems\n");
}
void OS_Windows_print()
{
printf("Windows - Microsoft\n");
}
void OS_HP-UX_print()
{
printf("HP-UX - Hewlett Packard\n");
}
int main()
{
int num;
printf("Enter the number (1-3):\n");
scanf("%d",&num);
switch(num)
{
case 1:
OS_Solaris_print();
break;
case 2:
OS_Windows_print();
break;
case 3:
OS_HP-UX_print();
break;
default:
printf("Hmm! only 1-3 :-)\n");
break;
}
return 0;
}

解答:
程序員要以計算機的語言進行思考,不上上面那段程序導致的結果不止是歧義這么簡單,而直接的結果是,導致計算機”聽不懂”你在說什么。導致計算機聽不懂的原因是HP-UX中的’-'是減號?還是其他什么?

puzzle 3

下面這段程序會輸出什么,為什么?

enum {false,true};
int main()
{
int i=1;
do
{
printf("%d\n",i);
i++;
if(i < 15)
continue;
}while(false);
return 0;
}

解答:
1到14?不對,結果是1,因為continue的含義是不執行循環體之后語義,而直接到循環點。明顯while(false)不屬于循環體。導致這段程序的歧義就是:程序員沒有完全理解計算機語言中continue的含義。

puzzle 4

下面這段程序的輸出結果是:

#include <stdio.h>
#define f(a,b) a##b
#define g(a)   #a
#define h(a) g(a)
int main()
{
printf("%s\n", h(f(1,2)));
printf("%s\n", g(f(1,2)));
return 0;
}

當然,你首先要了解##和#的用法,如果不懂的話,本題你可以直接跳過。
解答:
看到這段程序你可能會認為,這兩個printf輸出的同一個結果,可是答案卻非如此,本題的輸出是12和f(1,2),為什么會這樣呢?因為這是宏,宏的解開不象函數執行,由里帶外。

puzzle 5

下面這段程序的輸出是什么

#include <stdio.h>
int main()
{
     int a=10;
     switch(a)
    {
        case ‘1′:
             printf(”ONE\n”);
            break;
        case ‘2′:
            printf(”TWO\n”);
            break;
        defau1t:
             printf(”NONE\n”);
    }
    return 0;
}

解答:
本題我故意將語法敏感插件去掉,為了就是能得到更好的效果,這道題又是什么讓歧義再次發生,如果不仔細你可能永遠都找不到答案,如果真到的到了那個時候,你是否會因為對default語義的懷疑,而不敢再使用default?本題的歧義點就是default,看好了是defau1t而不是default,不是關鍵字!為什么計算能”聽懂”這樣的defau1t,算然它聽懂了,但它的理解卻是標號”defau1t”

puzzle 6

下面這段程序的輸出什么?

#include <stdio.h>
int main()
{
float f=0.0f;
int i;
for(i=0;i<10;i++)
f = f + 0.1f;
if(f == 1.0f)
printf("f is 1.0 \n");
else
printf("f is NOT 1.0 \n");
return 0;
}

解答:
你是否似曾相識?不錯這個問題在酷殼之前的博文《你能做對下面這些JavaScript的題嗎?》中曾今提到過,不要讓兩個浮點數相比較。所以本題的答案是”f is NOT 1.0″,如果你真想比較兩個浮點數時,你應該按一定精度來比較,比如你一定要在本題中做比較那么你應該這么做if( (f - 1.0f)<0.1 )

puzzle 7

下面兩個函數是否具有相同的原型?

int foobar(void);
int foobar();

下面這兩段程序將會幫你找到上題的答案
程序1

#include <stdio.h>
void foobar1(void)
{
printf("In foobar1\n");
}
void foobar2()
{
printf("In foobar2\n");
}
int main()
{
char ch = 'a';
foobar1();
foobar2(33, ch);
return 0;
}

程序2

#include "stdio.h"
void foobar1(void)
{
printf("In foobar1\n");
}
void foobar2()
{
printf("In foobar2\n");
}
int main()
{
char ch = 'a';
foobar1(33,ch);
foobar2();
return 0;
}

解答
程序片段一,沒有問題,程序片段二編譯報錯,這兩個程序告訴我們,foobar1(void)和foobar2()是有不同原型的的。我們可以在《ISO/IEC 9899》的C語言規范找到下面兩段關于函數聲明的描述

10.The special case of an unnamed parameter of type void as the only item in the list specifies that the function has no parameters

14.An identifier list declares only the identifiers of the parameters of the function. An empty list in a function declarator that is part of a definition of that function specifies that the function has no parameters. The empty list in a function declarator that is not part of a definition of that function specifies that no information about the number or types of the parameters is supplied.124)

上面兩段話的意思就是:foobar1(void)是沒有參數,而foobar1()等于forbar1(…)等于參數類型未知。

總結
看到這些C語言的題目,不禁讓我想起了巴別塔,計算機語言作為如此嚴謹的語言都有可能帶來如此多的歧義,更何況自然語言,更何況相互不通的自然語言。要杜絕歧義,我們就必須清晰的了解計算機語言每一個指令的語義。就如同人類,人類要和平就要相互了解各自的文化。愿世界上人們清晰了解別人的語言的語義,愿世界不再因為文化的不同而戰爭,原世界和平。

posted on 2009-05-28 12:18 expter 閱讀(849) 評論(1)  編輯 收藏 引用 所屬分類: 其他學習筆記工作筆記

評論

# re: 轉:語言的歧義 2011-07-22 04:42 PETERSONAlyson35

Cars and houses are not cheap and not everyone can buy it. Nevertheless, <a href="http://bestfinance-blog.com">loan</a> are invented to aid different people in such kind of situations.   回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国产美女| 亚洲精品视频一区| 亚洲第一黄网| 欧美日韩国产免费| 蜜月aⅴ免费一区二区三区| 亚洲免费观看高清完整版在线观看熊 | 午夜精品区一区二区三| 日韩视频在线一区| 蜜桃av久久久亚洲精品| 免费欧美日韩| 99热在线精品观看| 国产精品99久久久久久人| 亚洲美女视频| 午夜免费日韩视频| 久久综合伊人77777麻豆| 蜜桃伊人久久| 欧美日韩亚洲一区二区三区| 国产欧美日韩精品在线| 在线看片一区| 亚洲精品视频在线观看网站| 一本色道久久88亚洲综合88| 中国成人黄色视屏| 久久国产综合精品| 蜜臀久久99精品久久久久久9| 男女精品网站| 亚洲一区免费网站| 免费久久久一本精品久久区| 免费成人激情视频| 欧美不卡在线| 国产精品国产亚洲精品看不卡15| 国内视频精品| 欧美va亚洲va日韩∨a综合色| 欧美剧在线免费观看网站| 欧美日韩免费| 亚洲精品在线观看免费| 久久精品一区二区三区不卡牛牛 | 久久久久久一区| 欧美日韩高清一区| 狠狠色狠色综合曰曰| 欧美精品久久久久久久免费观看| 国产精品成人一区二区艾草| 亚洲精品乱码久久久久| 狂野欧美激情性xxxx| 亚洲欧美日韩在线综合| 欧美日韩在线播放一区二区| 亚洲国产婷婷| 亚洲国产成人久久综合一区| 中文欧美日韩| 欧美日韩视频免费播放| 在线观看一区二区精品视频| 美女啪啪无遮挡免费久久网站| 香蕉av福利精品导航| 国产综合在线视频| 蜜桃伊人久久| 欧美精品aa| 亚洲午夜久久久久久久久电影院 | 国产精品区一区| 亚欧成人精品| 欧美xart系列高清| 亚洲欧美成人一区二区在线电影| 亚洲四色影视在线观看| 狠狠色综合网| 一区二区三区高清在线| 国产亚洲欧美一区在线观看| 老司机亚洲精品| 国产精品家庭影院| 欧美超级免费视 在线| 欧美精品一卡| 欧美亚洲综合久久| 欧美网站在线观看| 麻豆精品精品国产自在97香蕉| 欧美日韩在线播放| 日韩天堂在线视频| 欧美成人在线免费观看| 亚洲视频一二区| 国产精品日韩欧美一区| 老司机成人网| 韩日欧美一区二区| 亚洲在线国产日韩欧美| 日韩视频一区二区三区在线播放免费观看| 亚洲在线第一页| 日韩亚洲欧美精品| 两个人的视频www国产精品| 久久综合九色综合久99| 国产精品免费观看在线| 亚洲国产一区二区精品专区| 国产日韩欧美制服另类| 午夜精品久久久久久久99樱桃| 一区二区国产日产| 欧美午夜片欧美片在线观看| 亚洲欧洲另类国产综合| 亚洲一区尤物| 国产精品美女久久久久久久| 亚洲激情av在线| 99精品欧美一区二区三区 | 在线一区观看| 国产精品国产一区二区| 欧美资源在线观看| 亚洲欧洲精品一区二区三区波多野1战4| 国产精品色一区二区三区| 亚洲欧美日本国产专区一区| 亚洲欧美日韩另类| 亚洲区一区二| 欧美精品一区在线| 亚洲天堂av在线免费观看| 亚洲欧美另类久久久精品2019| 欧美性猛交xxxx免费看久久久| 午夜影院日韩| 亚洲韩国一区二区三区| 亚洲免费观看在线视频| 亚洲国产91| 午夜一区二区三视频在线观看| 国模私拍一区二区三区| 男女精品网站| 久久久美女艺术照精彩视频福利播放| 久久综合九色综合欧美狠狠| 日韩视频中午一区| 狠狠v欧美v日韩v亚洲ⅴ| 欧美色欧美亚洲高清在线视频| 久久综合亚州| 久久九九有精品国产23| 亚洲一区制服诱惑| 亚洲高清在线精品| 久久婷婷人人澡人人喊人人爽 | 久久免费视频观看| 99视频精品全部免费在线| 一区二区三区精品视频| 亚洲一级在线| 狂野欧美一区| 欧美大秀在线观看| 国产精品日韩二区| 国产在线精品一区二区夜色| 黄色精品在线看| 91久久久久久久久久久久久| 亚洲图片在区色| 久久综合九色综合久99| 99国产精品| 欧美不卡在线| 国产日韩免费| 亚洲一区在线播放| 久久综合色婷婷| 亚洲最新色图| 久久九九久精品国产免费直播| 欧美激情视频在线播放| 国产偷久久久精品专区| 99精品国产在热久久下载| 老司机免费视频一区二区三区| 亚洲精品国产精品国自产在线 | 欧美一区二区三区免费视| 裸体歌舞表演一区二区| 亚洲精品激情| 欧美刺激午夜性久久久久久久| 国产日韩高清一区二区三区在线| 亚洲国产高清在线观看视频| 香港久久久电影| 午夜精品一区二区三区在线视 | 亚洲精品黄色| 欧美成人精品一区| 欧美亚洲一区| 国产伦精品一区二区三| aa日韩免费精品视频一| 欧美日本在线播放| 亚洲欧美日韩中文视频| 亚洲图片激情小说| 国产欧美日韩视频一区二区三区| 一区二区三区视频观看| 国产精品99久久不卡二区| 国产精品一区免费视频| 蜜桃av久久久亚洲精品| 久久一综合视频| 一区二区三区视频观看| 午夜亚洲一区| 蜜桃精品一区二区三区| 亚洲欧美日韩精品在线| 久久人人精品| 久久大逼视频| 久久午夜视频| 久久超碰97人人做人人爱| 美女精品自拍一二三四| 亚洲一区二区在| 另类av导航| 久久精品成人欧美大片古装| 久久一综合视频| 久久久久国产精品www| 亚洲国产精品欧美一二99| 国产精品一二三| 亚洲国产三级在线| 国产综合第一页| 亚洲资源在线观看| 一本一本久久a久久精品综合麻豆| 久久国产精品亚洲77777| 亚洲桃色在线一区| 欧美大胆成人| 免费在线亚洲欧美| 亚洲电影欧美电影有声小说| 亚洲欧美日韩人成在线播放| 亚洲网站在线观看| 欧美日韩国产高清视频| 亚洲福利视频专区| 亚洲国产精品尤物yw在线观看|