|
語言是人與人相互溝通的途徑,而計算機語言則是人和計算機溝通的途徑。就算是任何再完美的自然語言都會有歧義,但是又是什么讓人和計算計算機間產(chǎn)生了歧義呢? 下面這篇文章來自Gowri Kumar的Puzzle C一文。我做了一些整理,挑選了其中的一些問題,并在之后配上相應的答案(這些答案是我加的,如果需要原版的答案可以直接和本文作者Gowri Kumar聯(lián)系,作者的聯(lián)系方式可以從這里得到)。
puzzle 1此段程序的作者希望輸出數(shù)組中的所有元素,但是他卻沒有得到他想要的結果,是什么讓程序員和計算機產(chǎn)生歧義? 01.#include02.#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/n",array[d+1]);10. 11. return 0;12.}解答:運行上面的程序,結果是什么都沒有輸出,導致這個結果的原因是sizeof的返回值是一個unsinged int,為此在比較int d 和TOTAL_ELEMENTS兩個值都被轉換成了unsigned int來進行比較,這樣就導致-1被轉換成一個非常大的值,以至于for循環(huán)不滿足條件。因此,如果程序員不能理解sizeof操作符返回的是一個 unsigned int的話,就會產(chǎn)生類似如上的人機歧義。 puzzle 2看上去非常完美的程序,是什么導致了編程程序不通過? 01.#include02. 03.void OS_Solaris_print()04.{05. printf("Solaris - Sun Microsystems/n");06.}07. 08.void OS_Windows_print()09.{10. printf("Windows - Microsoft/n");11. 12.}13.void OS_HP-UX_print()14.{15. printf("HP-UX - Hewlett Packard/n");16.}17. 18.int main()19.{20. int num;21. printf("Enter the number (1-3):/n");22. scanf("%d",&num);23. 24. switch(num)25. {26. case 1:27. OS_Solaris_print();28. break;29. case 2:30. OS_Windows_print();31. break;32. case 3:33. OS_HP-UX_print();34. break;35. default:36. printf("Hmm! only 1-3 :-)/n");37. break;38. }39. 40. return 0;41.}解答: puzzle 3下面這段程序會輸出什么,為什么? 01.enum {false,true};02. 03.int main()04.{05. int i=1;06. 07. do08. {09. printf("%d/n",i);10. i++;11. if(i < 15)12. continue;13. }while(false);14. 15. return 0;16.}解答: puzzle 4下面這段程序的輸出結果是: 01.#include 02.#define f(a,b) a##b03.#define g(a) #a04.#define h(a) g(a)05. 06.int main()07.{08. printf("%s/n",h(f(1,2)));09. printf("%s/n",g(f(1,2)));10. return 0;11.}當然,你首先要了解##和#的用法,如果不懂的話,本題你可以直接跳過。 puzzle 5下面這段程序的輸出是什么
解答: puzzle 6下面這段程序的輸出什么? 01.#include 02. 03.int main()04.{05. float f=0.0f;06. int i;07. 08. for(i=0;i<10;i++)09. f = f + 0.1f;10. 11. if(f == 1.0f)12. printf("f is 1.0 /n");13. else14. printf("f is NOT 1.0/n");15. 16. return 0;17.}解答: puzzle 7下面兩個函數(shù)是否具有相同的原型? 1.int foobar(void);2.int foobar();下面這兩段程序將會幫你找到上題的答案
01.#include 02.void foobar1(void)03.{04. printf("In foobar1/n");05.}06. 07.void foobar2()08.{09. printf("In foobar2/n");10.}11. 12.int main()13.{14. char ch = 'a';15. 16. foobar1();17. foobar2(33, ch);18. 19. return 0;20.}
程序2 01.#include 02.void foobar1(void)03.{04. printf("In foobar1/n");05.}06. 07.void foobar2()08.{09. printf("In foobar2/n");10.}11. 12.int main()13.{14. char ch = 'a';15. 16. foobar1(33,ch);17. foobar2();18. 19. return 0;20.}解答
上面兩段話的意思就是:foobar1(void)是沒有參數(shù),而foobar1()等于forbar1(…)等于參數(shù)類型未知。
總結
|
|
|
來自: kingwenguang > 《軼事》