C puzzles詳解【46-50題】

來源:互聯網
上載者:User

標籤:style   blog   http   color   io   os   使用   ar   strong   

第四十六題

What does the following macro do?   #define ROUNDUP(x,n) ((x+n-1)&(~(n-1)))
題目講解:
參考:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=814501
用於記憶體對齊,n為2的冪。

第四十七題

Most of the C programming books, give the following example for the definition of macros.   #define isupper(c) (((c) >= ‘A‘) && ((c) <= ‘Z‘))But there would be a serious problem with the above definition of macro, if it is used as follows (what is the problem??)   char c;  /* ... */  if(isupper(c++))  {      /* ... */  }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.
知識點講解:
Linux核心中isupper的實現見lib/ctype.c和include/linux/ctype.h。
ctype.h代碼如下:
#ifndef _LINUX_CTYPE_H#define _LINUX_CTYPE_H/* * NOTE! This ctype does not handle EOF like the standard C * library is required to. */#define _U    0x01    /* upper */#define _L    0x02    /* lower */#define _D    0x04    /* digit */#define _C    0x08    /* cntrl */#define _P    0x10    /* punct */#define _S    0x20    /* white space (space/lf/tab) */#define _X    0x40    /* hex digit */#define _SP    0x80    /* hard space (0x20) */extern const unsigned char _ctype[];#define __ismask(x) (_ctype[(int)(unsigned char)(x)])#define isalnum(c)    ((__ismask(c)&(_U|_L|_D)) != 0)#define isalpha(c)    ((__ismask(c)&(_U|_L)) != 0)#define iscntrl(c)    ((__ismask(c)&(_C)) != 0)#define isdigit(c)    ((__ismask(c)&(_D)) != 0)#define isgraph(c)    ((__ismask(c)&(_P|_U|_L|_D)) != 0)#define islower(c)    ((__ismask(c)&(_L)) != 0)#define isprint(c)    ((__ismask(c)&(_P|_U|_L|_D|_SP)) != 0)#define ispunct(c)    ((__ismask(c)&(_P)) != 0)/* Note: isspace() must return false for %NUL-terminator */#define isspace(c)    ((__ismask(c)&(_S)) != 0)#define isupper(c)    ((__ismask(c)&(_U)) != 0)#define isxdigit(c)    ((__ismask(c)&(_D|_X)) != 0)#define isascii(c) (((unsigned char)(c))<=0x7f)#define toascii(c) (((unsigned char)(c))&0x7f)static inline unsigned char __tolower(unsigned char c){    if (isupper(c))        c -= ‘A‘-‘a‘;    return c;}static inline unsigned char __toupper(unsigned char c){    if (islower(c))        c -= ‘a‘-‘A‘;    return c;}#define tolower(c) __tolower(c)#define toupper(c) __toupper(c)#endif
ctype.c代碼如下:
/* *  linux/lib/ctype.c * *  Copyright (C) 1991, 1992  Linus Torvalds */#include <linux/ctype.h>#include <linux/module.h>const unsigned char _ctype[] = {_C,_C,_C,_C,_C,_C,_C,_C,                /* 0-7 */_C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C,            /* 8-15 */_C,_C,_C,_C,_C,_C,_C,_C,                /* 16-23 */_C,_C,_C,_C,_C,_C,_C,_C,                /* 24-31 */_S|_SP,_P,_P,_P,_P,_P,_P,_P,                /* 32-39 */_P,_P,_P,_P,_P,_P,_P,_P,                /* 40-47 */_D,_D,_D,_D,_D,_D,_D,_D,                /* 48-55 */_D,_D,_P,_P,_P,_P,_P,_P,                /* 56-63 */_P,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U,        /* 64-71 */_U,_U,_U,_U,_U,_U,_U,_U,                /* 72-79 */_U,_U,_U,_U,_U,_U,_U,_U,                /* 80-87 */_U,_U,_U,_P,_P,_P,_P,_P,                /* 88-95 */_P,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L,        /* 96-103 */_L,_L,_L,_L,_L,_L,_L,_L,                /* 104-111 */_L,_L,_L,_L,_L,_L,_L,_L,                /* 112-119 */_L,_L,_L,_P,_P,_P,_P,_C,                /* 120-127 */0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,            /* 128-143 */0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,            /* 144-159 */_S|_SP,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,    /* 160-175 */_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,    /* 176-191 */_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,    /* 192-207 */_U,_U,_U,_U,_U,_U,_U,_P,_U,_U,_U,_U,_U,_U,_U,_L,    /* 208-223 */_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,    /* 224-239 */_L,_L,_L,_L,_L,_L,_L,_P,_L,_L,_L,_L,_L,_L,_L,_L};    /* 240-255 */EXPORT_SYMBOL(_ctype);
_ctype數組中的每個元素的值對應ASCII碼為0-255的每個字元的類型,以字元的ASCII碼為索引即可擷取到相應字元的類型。

第四十八題

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?   int VarArguments(...)  {      /*....*/      return 0;  }
知識點講解:
對於帶有不定參數的函數,用va_start,va_arg,va_end對參數進行索引,核心代碼中va_*系列函數的實現在
include/acpi/platform/acenv.h中

#ifndef va_arg#ifndef _VALIST#define _VALISTtypedef char *va_list;#endif                /* _VALIST *//* * Storage alignment properties */#define  _AUPBND                (sizeof (acpi_native_int) - 1)#define  _ADNBND                (sizeof (acpi_native_int) - 1)/* * Variable argument list macro definitions */#define _bnd(X, bnd)            (((sizeof (X)) + (bnd)) & (~(bnd)))#define va_arg(ap, T)           (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND))))#define va_end(ap)              (void) 0#define va_start(ap, A)         (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND))))#endif                /* va_arg */
由如上定義可知,va_start返回第一個不定參數的地址,va_arg返回下一個不定參數的地址,va_end用來銷毀ap。
va_start和va_end總是成對使用。
va_start擷取第一個不定參數的地址時,必須知道最後一個固定參數A的地址,即函數必須提供至少一個固定參數。
故定義形如VarArguments(...)的函數是不正確的。

第四十九題

Write a C program to find the smallest of three integers, without using any of the comparision operators.
題目講解:
參考:
http://www.geeksforgeeks.org/smallest-of-three-integers-without-comparison-operators/
方法一:
int smallest(int x, int y, int z){  int c = 0;  while ( x && y && z )  {      x--;  y--; z--; c++;  }  return c;}
方法二:
#define CHAR_BIT 8/*Function to find minimum of x and y*/int min(int x, int y){  return  y + ((x - y) & ((x - y) >>            (sizeof(int) * CHAR_BIT - 1)));}/* Function to find minimum of 3 numbers x, y and z*/int smallest(int x, int y, int z){    return min(x, min(y, z));}
方法三:
// Using division operator to find minimum of three numbersint smallest(int x, int y, int z){    if (!(y/x))  // Same as "if (y < x)"        return (!(y/z))? y : z;    return (!(x/z))? x : z;}

 

第五十題

What does the format specifier %n of printf function do?
參考:
http://www.geeksforgeeks.org/g-fact-31/
如:
printf("geeks for %ngeeks ", &c);
將%n之前的字元數賦值給c。

C puzzles詳解【46-50題】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.