语言是人与人相互沟通的途径,而计算机语言则是人和计算机沟通的途径。就算是任何再完美的自然语言都会有歧义,但是又是什么让人和计算计算机间产生了歧义呢? 下面这篇文章来自Gowri Kumar的Puzzle C一文。我做了一些整理,挑选了其中的一些问题,并在之后配上相应的答案(这些答案是我加的,如果需要原版的答案可以直接和本文作者Gowri Kumar联系,作者的联系方式可以从这里得到)。
puzzle 1此段程序的作者希望输出数组中的所有元素,但是他却没有得到他想要的结果,是什么让程序员和计算机产生歧义? 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. } 解答:运行上面的程序,结果是什么都没有输出,导致这个结果的原因是sizeof的返回值是一个unsinged int,为此在比较int d 和TOTAL_ELEMENTS两个值都被转换成了unsigned int来进行比较,这样就导致-1被转换成一个非常大的值,以至于for循环不满足条件。因此,如果程序员不能理解sizeof操作符返回的是一个 unsigned int的话,就会产生类似如上的人机歧义。 puzzle 2看上去非常完美的程序,是什么导致了编程程序不通过? 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下面这段程序的输出结果是: 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. } 当然,你首先要了解##和#的用法,如果不懂的话,本题你可以直接跳过。 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下面两个函数是否具有相同的原型? 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)是没有参数,而foobar1()等于forbar1(…)等于参数类型未知。
总结
|
|
来自: kingwenguang > 《轶事》