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

勤能補拙,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>
            亚洲裸体视频| 一本在线高清不卡dvd| 欧美视频不卡中文| 国产精品大全| 国产日韩精品久久| 亚洲电影网站| 午夜亚洲性色福利视频| 日韩亚洲一区二区| 快射av在线播放一区| 亚洲第一综合天堂另类专| 影音先锋另类| 亚洲欧美精品伊人久久| 欧美成人精品一区| 亚洲欧美国产精品专区久久| 久久久精品tv| 欧美日韩中文字幕日韩欧美| 亚洲欧美日韩精品久久奇米色影视 | 欧美视频一区二区三区在线观看| 中日韩高清电影网| 久久一综合视频| 亚洲自拍偷拍视频| **性色生活片久久毛片| 亚洲日本aⅴ片在线观看香蕉| 午夜精品久久99蜜桃的功能介绍| 免费亚洲电影| 黑人中文字幕一区二区三区| 中文亚洲字幕| 久久国产精品久久久久久久久久| 国产精品久久午夜| 亚洲婷婷综合久久一本伊一区| 亚洲欧美视频| 夜夜嗨av一区二区三区中文字幕| 午夜视频在线观看一区| 国产精品豆花视频| 欧美va天堂| 国产手机视频一区二区| 性欧美暴力猛交另类hd| 欧美大片免费| 亚洲精品中文字幕在线| 亚洲欧美日韩另类| 一本色道久久| 欧美成人精品三级在线观看| 欧美一区二区三区日韩视频| 亚洲在线免费| 牛牛影视久久网| 欧美在线视频在线播放完整版免费观看 | 亚洲人精品午夜在线观看| 久久人人97超碰国产公开结果| 亚洲制服欧美中文字幕中文字幕| 亚洲激情综合| 99精品欧美一区二区三区综合在线 | 蘑菇福利视频一区播放| 国产日产欧美精品| 亚洲一区二区三区色| 中文一区在线| 欧美日韩精品三区| 亚洲欧美成aⅴ人在线观看| 欧美国产免费| 亚洲在线视频观看| 久久大综合网| 久久精品欧美日韩| 免费影视亚洲| 亚洲国产精品尤物yw在线观看| 欧美日本乱大交xxxxx| 亚洲欧美日韩国产中文在线| 欧美日韩在线不卡| 久久国产综合精品| 国产日韩一区在线| 午夜国产精品影院在线观看| 欧美一区二区三区免费观看| 国产精品丝袜91| 欧美成年人视频网站欧美| 狠狠久久综合婷婷不卡| 久久精品国产在热久久| 欧美电影免费网站| 国产精品视频1区| 亚洲欧美日韩中文在线制服| 久久国产加勒比精品无码| 六月天综合网| 久久精品国产清自在天天线| 国产亚洲欧美另类一区二区三区| 亚洲国产日韩欧美| 亚洲无线一线二线三线区别av| 久久aⅴ国产欧美74aaa| 欧美不卡视频一区发布| 夜夜嗨av一区二区三区中文字幕| 欧美性猛交xxxx乱大交退制版| 欧美国产精品专区| 亚洲图片欧洲图片av| 国产免费一区二区三区香蕉精| 亚洲国产精品久久久久婷婷884| 99香蕉国产精品偷在线观看| 国产精品麻豆va在线播放| 久久电影一区| 日韩一区二区免费高清| 亚洲欧洲另类国产综合| 国产精品二区在线观看| 久久久久久久综合日本| 久久精品论坛| 亚洲伦理在线| 国产在线观看精品一区二区三区| 中文网丁香综合网| 一区二区三区久久| 欧美日韩精品系列| 久久久久久久999| 欧美精品二区三区四区免费看视频| 欧美成人激情视频| 亚洲尤物视频网| 在线观看三级视频欧美| 国产精品美女久久久久aⅴ国产馆| 久久在线免费| 欧美成年视频| 欧美在线观看网站| 一区二区三区欧美视频| 国内久久婷婷综合| 国产精品国产精品国产专区不蜜| 免费亚洲网站| 久久久噜噜噜久噜久久| 亚洲女爱视频在线| 一道本一区二区| 欧美在线亚洲| 亚洲一区www| 亚洲少妇诱惑| 日韩一级大片| 亚洲精品一线二线三线无人区| 国产在线国偷精品产拍免费yy| 国产精品theporn| 欧美日韩国产一区精品一区 | 欧美一区二区私人影院日本| 久久激情网站| 欧美在线高清| 午夜精品一区二区三区在线播放| 一区二区三区.www| 日韩视频免费在线| 亚洲经典三级| 亚洲激情午夜| 亚洲日韩欧美视频一区| 国产精品成人一区二区艾草| 欧美日韩国产麻豆| 欧美日韩中文字幕日韩欧美| 欧美日韩国产综合在线| 欧美黄色影院| 欧美日韩国产小视频在线观看| 欧美精品在线网站| 欧美日韩视频在线| 国产精品久线观看视频| 欧美性大战久久久久久久| 欧美午夜电影在线| 国产精品久久久久久久久久久久久| 欧美视频一区二区三区…| 欧美视频日韩视频在线观看| 国产精品电影在线观看| 国产九区一区在线| 好吊色欧美一区二区三区视频| 精品成人一区二区三区| 欧美亚洲第一页| 国产精品一二三四| 国产色视频一区| 亚洲高清毛片| 国产中文一区| 亚洲国产美女久久久久| 一区二区三区**美女毛片| 午夜精品久久久久久久99黑人| 久久国产日本精品| 男人的天堂成人在线| 亚洲日本va午夜在线电影| 夜夜嗨av一区二区三区四区| 亚洲欧美经典视频| 久色成人在线| 国产精品久久久久久亚洲调教| 国产一区二区三区黄| 亚洲人成绝费网站色www| 亚洲综合另类| 欧美国产成人在线| 中文在线资源观看网站视频免费不卡 | 欧美高清视频| 亚洲一区二区高清| 亚洲一区二区视频在线观看| 日韩特黄影片| 亚洲欧美中文字幕| 亚洲国产99| 亚洲欧美一区二区视频| 美女图片一区二区| 国产精品美女久久久免费 | 国产精品视频精品| 在线播放不卡| 亚洲免费视频在线观看| 欧美国产亚洲视频| 久久精品综合| 一区二区三区高清在线| 久久久www成人免费精品| 欧美日韩一区三区| 亚洲人成小说网站色在线| 欧美中文字幕精品| 一区二区欧美视频| 欧美成人日本| 国内精品久久久久影院色| 亚洲无亚洲人成网站77777| 欧美高清在线视频观看不卡| 欧美一级片久久久久久久 |