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

勤能補拙,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>
            亚洲精品一区二区三区四区高清| 国产精品成人一区二区三区夜夜夜| 国产在线一区二区三区四区| 欧美在线二区| 午夜久久久久久| 狠狠色噜噜狠狠色综合久| 久热精品视频在线观看| 麻豆精品一区二区综合av| 99精品视频一区| 一本久久a久久精品亚洲| 国产精品毛片va一区二区三区| 欧美中日韩免费视频| 久久久视频精品| 欧美精品高清视频| 亚洲欧美日韩天堂| 久久久精品性| 亚洲麻豆视频| 午夜视频一区二区| 亚洲日本一区二区三区| 一本色道88久久加勒比精品| 国产一区二区黄色| 亚洲娇小video精品| 国产精品乱码一区二三区小蝌蚪| 久久av红桃一区二区小说| 蜜桃av一区二区在线观看| 亚洲一区观看| 免费亚洲视频| 欧美中文在线字幕| 欧美精品一区三区在线观看| 欧美一区二区大片| 欧美精品v日韩精品v国产精品| 欧美一区=区| 欧美日韩1区2区3区| 噜噜爱69成人精品| 国产精品亚洲一区二区三区在线| 欧美3dxxxxhd| 国产一区二区三区最好精华液| 99伊人成综合| 亚洲最新在线视频| 久久午夜羞羞影院免费观看| 亚洲永久免费| 欧美色精品在线视频| 欧美不卡视频| 在线电影欧美日韩一区二区私密| 亚洲午夜精品网| 99riav国产精品| 麻豆成人在线观看| 麻豆国产精品一区二区三区| 国产精品久久久久久久第一福利| 亚洲片区在线| 亚洲另类春色国产| 欧美国产在线观看| 欧美激情第五页| 最近中文字幕mv在线一区二区三区四区| 亚洲欧美日韩在线观看a三区| 亚洲视频久久| 欧美亚男人的天堂| 亚洲免费观看在线观看| 亚洲精品久久7777| 欧美a级片一区| 亚洲国产mv| 99国内精品久久| 欧美日韩xxxxx| 亚洲精品中文字| 亚洲婷婷综合色高清在线| 欧美日韩第一区| 一本色道婷婷久久欧美| 亚洲无吗在线| 国产精品久久久久久久久| 亚洲在线免费观看| 久久久99国产精品免费| 狠狠色狠狠色综合人人| 久久久久久久精| 欧美高清在线视频| 一区二区三区四区国产| 国产精品久久一级| 久久成人免费日本黄色| 久久综合一区二区三区| 亚洲三级观看| 欧美婷婷六月丁香综合色| 亚洲淫性视频| 亚洲精一区二区三区| 欧美色另类天堂2015| 亚洲午夜在线视频| 久久在线免费视频| 亚洲破处大片| 国产精品白丝av嫩草影院| 免费观看不卡av| 伊人久久婷婷| 欧美成人久久| 亚洲综合社区| 欧美成人一区二区| 亚洲尤物在线视频观看| 国产午夜一区二区三区| 久久综合99re88久久爱| 亚洲美女视频网| 久久久国产一区二区三区| 亚洲风情在线资源站| 欧美日韩中文字幕在线| 欧美在线视频一区| 亚洲日本成人网| 久久er精品视频| 日韩视频精品在线观看| 国产欧美一级| 欧美乱妇高清无乱码| 亚洲欧美日韩国产另类专区| 欧美大片专区| 久久成人精品一区二区三区| 最新国产乱人伦偷精品免费网站| 国产精品成人一区二区| 免费在线播放第一区高清av| 亚洲中无吗在线| 99综合在线| 欧美二区在线观看| 先锋影音网一区二区| 一本一本a久久| 亚洲韩日在线| 国外成人在线视频| 国产麻豆视频精品| 欧美日韩亚洲成人| 欧美国产日韩二区| 久久精品亚洲一区二区| 亚洲自拍偷拍福利| 日韩视频不卡| 亚洲国产欧美精品| 欧美国内亚洲| 欧美11—12娇小xxxx| 久久久精品久久久久| 性欧美超级视频| 性久久久久久| 午夜精品福利一区二区蜜股av| 一本色道久久综合亚洲精品不卡| 亚洲电影免费在线| 在线免费日韩片| 在线观看欧美视频| 精品二区久久| 国内自拍一区| 在线播放一区| 亚洲国产精品视频| 久久丁香综合五月国产三级网站| 亚洲男女毛片无遮挡| 亚洲一区二区三区精品视频| 中文亚洲视频在线| 宅男精品视频| 亚洲婷婷综合色高清在线| 一区二区三区精品在线| 在线视频欧美日韩| 亚洲一区二区免费| 亚洲中字在线| 欧美专区亚洲专区| 久色成人在线| 欧美福利电影网| 欧美日韩在线一区| 国产精品一区二区男女羞羞无遮挡| 国产精品久久久久久久久久ktv| 欧美性猛片xxxx免费看久爱| 国产精品午夜久久| 国产专区欧美专区| 亚洲韩国精品一区| 一本色道久久综合狠狠躁篇的优点 | 久久综合色一综合色88| 老司机午夜精品视频| 久久亚洲国产精品日日av夜夜| 亚洲素人一区二区| 亚洲视频免费看| 欧美一级黄色录像| 久久人人超碰| 91久久夜色精品国产九色| 亚洲精品久久久久久久久| 亚洲调教视频在线观看| 欧美在线1区| 欧美福利一区二区| 国产精品久久久久毛片大屁完整版 | 亚洲国产美女精品久久久久∴| 亚洲人久久久| 新67194成人永久网站| 美女网站久久| 国产精品亚洲视频| 91久久久久久| 欧美有码在线观看视频| 欧美激情精品久久久久久| 制服丝袜亚洲播放| 久久久久综合一区二区三区| 欧美区高清在线| 黄色亚洲在线| 香蕉成人啪国产精品视频综合网| 暖暖成人免费视频| 亚洲欧美日韩成人| 欧美日韩成人| 亚洲二区在线视频| 久久福利精品| 一本色道久久综合亚洲精品高清 | 亚洲日本一区二区| 久久视频在线看| 国产精品私拍pans大尺度在线 | 国产精品久久久久av| 亚洲欧洲另类国产综合| 久久久久久亚洲精品不卡4k岛国| 一本一本久久| 欧美金8天国|