語言是人與人相互溝通的途徑,而計算機語言則是人和計算機溝通的途徑。就算是任何再完美的自然語言都會有歧義,但是又是什么讓人和計算計算機間產(chǎn)生了歧義呢? 下面這篇文章來自Gowri Kumar的Puzzle C一文。我做了一些整理,挑選了其中的一些問題,并在之后配上相應(yīng)的答案(這些答案是我加的,如果需要原版的答案可以直接和本文作者Gowri Kumar聯(lián)系,作者的聯(lián)系方式可以從這里得到)。
puzzle 1此段程序的作者希望輸出數(shù)組中的所有元素,但是他卻沒有得到他想要的結(jié)果,是什么讓程序員和計算機產(chǎn)生歧義? 01. #include 02. #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. } 解答:運行上面的程序,結(jié)果是什么都沒有輸出,導(dǎo)致這個結(jié)果的原因是sizeof的返回值是一個unsinged int,為此在比較int d 和TOTAL_ELEMENTS兩個值都被轉(zhuǎn)換成了unsigned int來進行比較,這樣就導(dǎo)致-1被轉(zhuǎn)換成一個非常大的值,以至于for循環(huán)不滿足條件。因此,如果程序員不能理解sizeof操作符返回的是一個 unsigned int的話,就會產(chǎn)生類似如上的人機歧義。 puzzle 2看上去非常完美的程序,是什么導(dǎo)致了編程程序不通過? 01. #include 02. 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. do 08. { 09. printf ( "%d/n" ,i); 10. i++; 11. if (i < 15) 12. continue ; 13. } while ( false ); 14. 15. return 0; 16. } 解答: puzzle 4下面這段程序的輸出結(jié)果是: 01. #include 02. #define f(a,b) a##b 03. #define g(a) #a 04. #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. } 當(dāng)然,你首先要了解##和#的用法,如果不懂的話,本題你可以直接跳過。 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. else 14. printf ( "f is NOT 1.0/n" ); 15. 16. return 0; 17. } 解答: puzzle 7下面兩個函數(shù)是否具有相同的原型? 1. int foobar( void ); 2. int foobar(); 下面這兩段程序?qū)湍阏业缴项}的答案
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ù)類型未知。
總結(jié)
|
|
來自: kingwenguang > 《軼事》