第四十六题

  1. What does the following macro do?
  2. #define ROUNDUP(x,n) ((x+n-1)&(~(n-1)))
  1. 题目讲解:
  1. 参考:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=814501
  1. 用于内存对齐,n2的幂。

第四十七题

  1. Most of the C programming books, give the following example for the definition of macros.
  2. #define isupper(c) (((c) >= 'A') && ((c) <= 'Z'))
  3. But there would be a serious problem with the above definition of macro, if it is used as follows (what is the problem??)
  4. char c;
  5. /* ... */
  6. if(isupper(c++))
  7. {
  8. /* ... */
  9. }
  10. But most of the libraries implement the isupper (declared in ctypes.h) as a macro (without any side effects). Find out how isupper() is implemented on your system.
  1. 知识点讲解:
  1. Linux内核中isupper的实现见lib/ctype.cinclude/linux/ctype.h
  1. ctype.h代码如下:
  1. #ifndef _LINUX_CTYPE_H
  2. #define _LINUX_CTYPE_H
  3.  
  4. /*
  5. * NOTE! This ctype does not handle EOF like the standard C
  6. * library is required to.
  7. */
  8.  
  9. #define _U 0x01 /* upper */
  10. #define _L 0x02 /* lower */
  11. #define _D 0x04 /* digit */
  12. #define _C 0x08 /* cntrl */
  13. #define _P 0x10 /* punct */
  14. #define _S 0x20 /* white space (space/lf/tab) */
  15. #define _X 0x40 /* hex digit */
  16. #define _SP 0x80 /* hard space (0x20) */
  17.  
  18. extern const unsigned char _ctype[];
  19.  
  20. #define __ismask(x) (_ctype[(int)(unsigned char)(x)])
  21.  
  22. #define isalnum(c) ((__ismask(c)&(_U|_L|_D)) != 0)
  23. #define isalpha(c) ((__ismask(c)&(_U|_L)) != 0)
  24. #define iscntrl(c) ((__ismask(c)&(_C)) != 0)
  25. #define isdigit(c) ((__ismask(c)&(_D)) != 0)
  26. #define isgraph(c) ((__ismask(c)&(_P|_U|_L|_D)) != 0)
  27. #define islower(c) ((__ismask(c)&(_L)) != 0)
  28. #define isprint(c) ((__ismask(c)&(_P|_U|_L|_D|_SP)) != 0)
  29. #define ispunct(c) ((__ismask(c)&(_P)) != 0)
  30. /* Note: isspace() must return false for %NUL-terminator */
  31. #define isspace(c) ((__ismask(c)&(_S)) != 0)
  32. #define isupper(c) ((__ismask(c)&(_U)) != 0)
  33. #define isxdigit(c) ((__ismask(c)&(_D|_X)) != 0)
  34.  
  35. #define isascii(c) (((unsigned char)(c))<=0x7f)
  36. #define toascii(c) (((unsigned char)(c))&0x7f)
  37.  
  38. static inline unsigned char __tolower(unsigned char c)
  39. {
  40. if (isupper(c))
  41. c -= 'A'-'a';
  42. return c;
  43. }
  44.  
  45. static inline unsigned char __toupper(unsigned char c)
  46. {
  47. if (islower(c))
  48. c -= 'a'-'A';
  49. return c;
  50. }
  51.  
  52. #define tolower(c) __tolower(c)
  53. #define toupper(c) __toupper(c)
  54.  
  55. #endif
  1. ctype.c代码如下:
  1. /*
  2. * linux/lib/ctype.c
  3. *
  4. * Copyright (C) 1991, 1992 Linus Torvalds
  5. */
  6.  
  7. #include <linux/ctype.h>
  8. #include <linux/module.h>
  9.  
  10. const unsigned char _ctype[] = {
  11. _C,_C,_C,_C,_C,_C,_C,_C, /* 0-7 */
  12. _C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C, /* 8-15 */
  13. _C,_C,_C,_C,_C,_C,_C,_C, /* 16-23 */
  14. _C,_C,_C,_C,_C,_C,_C,_C, /* 24-31 */
  15. _S|_SP,_P,_P,_P,_P,_P,_P,_P, /* 32-39 */
  16. _P,_P,_P,_P,_P,_P,_P,_P, /* 40-47 */
  17. _D,_D,_D,_D,_D,_D,_D,_D, /* 48-55 */
  18. _D,_D,_P,_P,_P,_P,_P,_P, /* 56-63 */
  19. _P,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U, /* 64-71 */
  20. _U,_U,_U,_U,_U,_U,_U,_U, /* 72-79 */
  21. _U,_U,_U,_U,_U,_U,_U,_U, /* 80-87 */
  22. _U,_U,_U,_P,_P,_P,_P,_P, /* 88-95 */
  23. _P,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L, /* 96-103 */
  24. _L,_L,_L,_L,_L,_L,_L,_L, /* 104-111 */
  25. _L,_L,_L,_L,_L,_L,_L,_L, /* 112-119 */
  26. _L,_L,_L,_P,_P,_P,_P,_C, /* 120-127 */
  27. ,,,,,,,,,,,,,,,, /* 128-143 */
  28. ,,,,,,,,,,,,,,,, /* 144-159 */
  29. _S|_SP,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P, /* 160-175 */
  30. _P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P, /* 176-191 */
  31. _U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U, /* 192-207 */
  32. _U,_U,_U,_U,_U,_U,_U,_P,_U,_U,_U,_U,_U,_U,_U,_L, /* 208-223 */
  33. _L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L, /* 224-239 */
  34. _L,_L,_L,_L,_L,_L,_L,_P,_L,_L,_L,_L,_L,_L,_L,_L}; /* 240-255 */
  35.  
  36. EXPORT_SYMBOL(_ctype);
  1. _ctype数组中的每个元素的值对应ASCII码为0-255的每个字符的类型,以字符的ASCII码为索引即可获取到相应字符的类型。

第四十八题

  1. I hope you know that ellipsis (...) is used to specify variable number of arguments to a function. (What is the function prototype declaration for printf?) What is wrong with the following delcaration?
  2. int VarArguments(...)
  3. {
  4. /*....*/
  5. return ;
  6. }
  1. 知识点讲解:
  1. 对于带有不定参数的函数,用va_startva_argva_end对参数进行索引,内核代码中va_*系列函数的实现在
    include/acpi/platform/acenv.h
  1. #ifndef va_arg
  2.  
  3. #ifndef _VALIST
  4. #define _VALIST
  5. typedef char *va_list;
  6. #endif /* _VALIST */
  7.  
  8. /*
  9. * Storage alignment properties
  10. */
  11. #define _AUPBND (sizeof (acpi_native_int) - 1)
  12. #define _ADNBND (sizeof (acpi_native_int) - 1)
  13.  
  14. /*
  15. * Variable argument list macro definitions
  16. */
  17. #define _bnd(X, bnd) (((sizeof (X)) + (bnd)) & (~(bnd)))
  18. #define va_arg(ap, T) (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND))))
  19. #define va_end(ap) (void) 0
  20. #define va_start(ap, A) (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND))))
  21.  
  22. #endif /* va_arg */
  1. 由如上定义可知,va_start返回第一个不定参数的地址,va_arg返回下一个不定参数的地址,va_end用来销毁ap
    va_startva_end总是成对使用。
    va_start获取第一个不定参数的地址时,必须知道最后一个固定参数A的地址,即函数必须提供至少一个固定参数。
    故定义形如VarArguments(...)的函数是不正确的。

第四十九题

  1. Write a C program to find the smallest of three integers, without using any of the comparision operators.
  1. 题目讲解:
  1. 参考:
  1. http://www.geeksforgeeks.org/smallest-of-three-integers-without-comparison-operators/
  1. 方法一:
  1. int smallest(int x, int y, int z)
  2. {
  3. int c = ;
  4. while ( x && y && z )
  5. {
  6. x--; y--; z--; c++;
  7. }
  8. return c;
  9. }
  1. 方法二:
  1. #define CHAR_BIT 8
  2.  
  3. /*Function to find minimum of x and y*/
  4. int min(int x, int y)
  5. {
  6. return y + ((x - y) & ((x - y) >>
  7. (sizeof(int) * CHAR_BIT - )));
  8. }
  9.  
  10. /* Function to find minimum of 3 numbers x, y and z*/
  11. int smallest(int x, int y, int z)
  12. {
  13. return min(x, min(y, z));
  14. }
  1. 方法三:
  1. // Using division operator to find minimum of three numbers
  2. int smallest(int x, int y, int z)
  3. {
  4. if (!(y/x)) // Same as "if (y < x)"
  5. return (!(y/z))? y : z;
  6. return (!(x/z))? x : z;
  7. }

第五十题

  1. What does the format specifier %n of printf function do?
  1. 参考:
  1. http://www.geeksforgeeks.org/g-fact-31/
  1. 如:
  1. printf("geeks for %ngeeks ", &c);
  1. 将%n之前的字符数赋值给c

C puzzles详解【46-50题】的更多相关文章

  1. C puzzles详解【51-57题】

    第五十一题 Write a C function which does the addition of two integers without using the '+' operator. You ...

  2. C puzzles详解【38-45题】

    第三十八题 What is the bug in the following program? #include <stdlib.h> #include <stdio.h> # ...

  3. C puzzles详解【34-37题】

    第三十四题 The following times. But you can notice that, it doesn't work. #include <stdio.h> int ma ...

  4. C puzzles详解【31-33题】

    第三十一题 The following is a simple C program to read and print an integer. But it is not working proper ...

  5. C puzzles详解【26-30题】

    第二十六题(不会) The following is a simple program which implements a minimal version of banner command ava ...

  6. C puzzles详解【21-25题】

    第二十一题 What is the potential problem with the following C program? #include <stdio.h> int main( ...

  7. C puzzles详解【16-20题】

    第十六题 The following is a small C program split across files. What do you expect the output to be, whe ...

  8. C puzzles详解【13-15题】

    第十三题 int CountBits(unsigned int x) { ; while(x) { count++; x = x&(x-); } return count; } 知识点讲解 位 ...

  9. C puzzles详解【9-12题】

    第九题 #include <stdio.h> int main() { float f=0.0f; int i; ;i<;i++) f = f + 0.1f; if(f == 1.0 ...

随机推荐

  1. javascript当文本框获得焦点设置边框

    javascript当文本框获得焦点设置边框:本章节介绍一下当文本框获得焦点以后如何设置文本框的边框样式,本来是一个非常简单的问题,但是有可能前台美工人员对javascript并不是太了解,所以还是通 ...

  2. Jquery插件收藏

    1.带小图标的多级菜单导航 演示地址:http://js.itivy.com/memu/sample.html 下载地址:http://js.itivy.com/?p=100 效果图:  推荐一个自己 ...

  3. ppm与毫克/立方米怎么换算

    ppm是溶液浓度(溶质质量分数)的一种表示方法,1升水溶液中有1毫克的溶质,g/m3或mg/L. 对于气体:,一百万体积的空气中所含污染物的体积数. 而按我国规定,特别是环保部门,则要求气体浓度以质量 ...

  4. Understanding Python metaclasses

    转载:https://blog.ionelmc.ro/2015/02/09/understanding-python-metaclasses/ None of the existing article ...

  5. poj 1459 Power Network : 最大网络流 dinic算法实现

    点击打开链接 Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 20903   Accepted:  ...

  6. (easy)LeetCode 223.Rectangle Area

    Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defined b ...

  7. Caught exception while loading file struts-default.xml 错误

    严重: Exception starting filter struts2 Caught exception while loading file struts-default.xml - [unkn ...

  8. OC基础(8)

    自定义代码段 实例变量修饰符 依赖关系 *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bott ...

  9. 将assembly包添加到自己的maven仓库

    mvn install:install-file -DgroupId=com.asiainfo -DartifactId=spark-assembly -Dversion=1.2.0 -Dpackag ...

  10. Java GUI 画点

    import java.awt.EventQueue; public class Paint { private JFrame frame; /** * Launch the application. ...