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

勤能補拙,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 閱讀(844) 評論(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>
            欧美福利网址| 可以看av的网站久久看| 欧美日韩国产色综合一二三四| 久久夜色精品国产噜噜av| 久久久精品视频成人| 欧美一区日韩一区| 久久亚洲精品视频| 欧美成人国产一区二区| 欧美日韩xxxxx| 国产精品进线69影院| 国产日产亚洲精品| 伊人男人综合视频网| 亚洲欧洲在线观看| 中文精品在线| 久久久www| 亚洲国产精品免费| 亚洲福利av| 亚洲一区国产精品| 久久久久www| 欧美日韩国产一区二区| 国产日韩欧美精品| 亚洲精品免费在线播放| 亚洲影院色无极综合| 久久久亚洲午夜电影| 亚洲精品美女在线| 久久精品91| 欧美日韩综合在线免费观看| 国内自拍视频一区二区三区| 日韩一级精品视频在线观看| 欧美中文在线视频| 亚洲精品乱码久久久久久日本蜜臀| 亚洲一区精品电影| 欧美精品日韩精品| 尹人成人综合网| 午夜欧美不卡精品aaaaa| 欧美福利视频| 亚洲欧美另类久久久精品2019| 美女视频黄免费的久久| 国产精品一区久久| 一区二区三区黄色| 欧美激情自拍| 久久久久久亚洲精品不卡4k岛国| 国产精品第13页| 亚洲精品国产视频| 免费看亚洲片| 欧美一区二区性| 亚洲欧美第一页| 欧美视频中文在线看| 国内精品**久久毛片app| 亚洲一级片在线看| 亚洲人成在线观看| 免费成人网www| 精品99一区二区| 久久久精品五月天| 小黄鸭视频精品导航| 国产精品在线看| 亚洲亚洲精品三区日韩精品在线视频| 欧美高清你懂得| 欧美xx69| 亚洲伦理网站| 亚洲韩国青草视频| 欧美激情中文字幕一区二区| 亚洲欧洲在线播放| 亚洲国产日韩在线| 欧美精品一区在线观看| 99精品欧美一区二区三区| 亚洲国产天堂久久综合网| 欧美jizz19性欧美| 亚洲精品视频二区| 亚洲区一区二区三区| 欧美激情一区二区| 一区二区三区不卡视频在线观看 | 另类国产ts人妖高潮视频| 欧美在线999| 在线看欧美视频| 亚洲国产精品成人精品| 欧美日韩精品免费| 欧美在线观看视频在线| 欧美一区网站| 亚洲高清视频中文字幕| 亚洲电影免费观看高清| 欧美高清不卡在线| 亚洲自拍偷拍麻豆| 欧美在线一级视频| 亚洲欧洲日本在线| 在线视频欧美精品| 狠狠色综合日日| 亚洲国产精品一区二区尤物区| 欧美激情一区二区| 先锋影音一区二区三区| 久久精品99| 一区二区三区四区精品| 亚洲欧美日韩精品| 91久久国产精品91久久性色| 日韩一区二区精品| 一区久久精品| 亚洲激情综合| 国产视频在线一区二区| 亚洲国产精品999| 国产精品视频免费在线观看| 老牛国产精品一区的观看方式| 欧美女同视频| 久久久亚洲人| 欧美日韩亚洲成人| 猫咪成人在线观看| 亚洲婷婷综合色高清在线 | 亚洲欧美一区二区激情| 国内精品久久久久久久影视蜜臀 | 国产精品草莓在线免费观看| 久久精品在线观看| 欧美日韩精品一区二区| 免播放器亚洲一区| 国产精品伊人日日| 亚洲看片一区| 亚洲高清视频的网址| 性欧美暴力猛交另类hd| 这里是久久伊人| 欧美mv日韩mv国产网站app| 久久国产精品久久久久久久久久 | 亚洲国产日韩在线| 在线电影一区| 欧美亚洲综合网| 午夜一区在线| 国产精品h在线观看| 亚洲区中文字幕| 亚洲国产欧美不卡在线观看| 久久国产88| 久久精品国产亚洲一区二区| 国产精品激情| 一区二区日韩精品| 亚洲视频免费在线| 欧美日韩你懂的| 亚洲日本va在线观看| 亚洲三级电影在线观看| 欧美成人日韩| 亚洲电影免费观看高清完整版在线观看| 国内在线观看一区二区三区| 欧美一级欧美一级在线播放| 欧美一区二区播放| 国产区精品视频| 午夜在线一区二区| 久久久久综合网| 精品成人在线| 美国成人直播| 亚洲激情国产精品| 在线一区视频| 国产精品久久一区主播| 午夜欧美不卡精品aaaaa| 久久精品亚洲一区| 黑人操亚洲美女惩罚| 久久精品国产欧美激情 | 亚洲网在线观看| 亚洲免费视频成人| 国产欧美va欧美va香蕉在| 性亚洲最疯狂xxxx高清| 久久三级视频| 亚洲国产精品ⅴa在线观看| 欧美大胆人体视频| 一区二区三区 在线观看视| 午夜综合激情| 一区二区三区在线免费播放| 久久免费国产| 亚洲人久久久| 欧美.www| 亚洲精品资源美女情侣酒店| 亚洲视频中文字幕| 国产欧美成人| 可以看av的网站久久看| 亚洲国产影院| 欧美一区二区三区四区视频| 在线成人中文字幕| 欧美日韩精品是欧美日韩精品| 亚洲一区二区少妇| 欧美a一区二区| 亚洲影视在线播放| 在线成人h网| 国产精品爱啪在线线免费观看| 久久精品人人做人人综合| 亚洲精选视频免费看| 久久久久国内| 在线综合视频| 在线国产精品一区| 欧美日韩免费在线| 欧美影院视频| 一本久道久久综合婷婷鲸鱼| 麻豆精品传媒视频| 午夜视频一区| 一道本一区二区| 黄色一区二区在线观看| 欧美亚男人的天堂| 欧美成人免费一级人片100| 性欧美长视频| 亚洲午夜久久久| 亚洲国产老妈| 免费观看国产成人| 久久九九热免费视频| 亚洲欧美高清| 一区二区三区久久精品| 亚洲激情中文1区| 在线免费不卡视频|