幾道C語言的題目

來源:互聯網
上載者:User
【1 使用宏】


1.1
   #ifdef NDEBUG
    #define TRACE(S) S
   #else
    #define TRACE(S) printf("%s;/n", #S); S
   #endif

問:以上TRACE()宏的作用是什嗎?

1.2 #error的作用?

1.3 定義一個宏,求出給定數組中的元素的個數
#define NELEMENTS(array) ??

1.4 定義一個宏,求出給定結構中給定成員的位移量
#define OFFSET(structure, member) ??


【2 資料聲明和定義】

給定以下類型的變數a的定義式:

a) An integer
b) A pointer to an integer
c) A pointer to a pointer to an integer
d) An array of 10 integers
e) An array of 10 pointers to integers
f) A pointer to an array of 10 integers
g) A pointer to a <I>function</I> that takes an integer as an argument and returns an integer
h) An array of ten pointers to <I>function</I>s that take an integer argument and return an integer

【3 複雜類型(1)】

有如下運算式:

   char (*(*x())[])();

請用文字描述x是什麼。


【4 複雜類型(2)】

jmp_buf的定義:

   typedef struct _jmp_buf
   {
    REG_SET  reg;
    int      extra[3];
   } jmp_buf[1];

setjmp函數的原型:

   extern int setjmp (jmp_buf __env);

問:調用setjmp時傳遞__env的內容,還是傳遞指標?


【5 標頭檔】

問:為什麼標準標頭檔都有類似以下的結構?

   #ifndef __INCvxWorksh
   #define __INCvxWorksh

   #ifdef __cplusplus
   extern "C" {
   #endif

   /*...*/

   #ifdef __cplusplus
   }
   #endif

   #endif /* __INCvxWorksh */

【6 static關鍵字】

請說出static關鍵字的3種用處:
(1)用於全域變數;
(2)用於局部變數;
(3)用於函數。

/* file.c */
static int a;
int b;

static int fn()
{
 static int x;
 int y;
}


【7 const關鍵字】

7.1 const關鍵字的意義是什嗎?
7.2 解釋以下的變數定義:

const int a1;
int const a2;
const int *a3;
int * const a4;
int const * const a5;

【8 volatile關鍵字】

8.1 volatile意義?例如
volatile int *p;

8.2 volatile能和const一起使用嗎?例如
volatile const int *p;

【9 sizeof()】

有以下定義:

   char *pmsg = "A";
   char msg[] = "A";
   char ch    = 'A';

問:
sizeof(pmsg) = ?
sizeof(msg)  = ?
sizeof(“A”)  = ?
sizeof(ch)   = ?
sizeof(‘A’)  = ? (在C++中等於多少?)

void f(char param[100])
{
// sizeof(param) = ?
}

【10 字串】

有以下代碼

   char *pmsg = "hello, world!";
   strcpy(pmsg, "hi, there.");

試評論該代碼。


【11 混合運算】

有以下代碼:

void foo()
{
 unsigned int a = 6;
 int b = -20;
 (a+b > 6) ? puts("> 6") : puts(" < = 6");
}

請問調用foo()的輸出?

【12 記憶體訪問】

有以下代碼:

void fn()
{
  int a[100];
  int *p;

    p = (int *)((unsigned int)a + 1);
    printf(“p=0x%x/n”, *p);
}

試評論以上代碼。

【13 C庫函數】

請說明以下函數的意義:

void perror(const char *__s);
fdprintf(int, const char *, ...);

isspace(), isxdigit(), strerr(), sprintf()

 

答案,僅供參考: 

1.1 這道題主要考察#的功能,S是一個運算式。TRACE()的作用就是在DEBUG狀態下,計算運算式S的值之前先列印S。 

1.2 #error用於向編譯器報錯,並輸出它後面帶的錯誤資訊。例如: 
#ifndef SOMETHING 
#error SOMETHING not defined! 
#endif 
如果在這段代碼之前未定義過SOMETHING,則在編譯時間出錯,並給出"SOMETHING not defined!"的錯誤資訊。 

1.3 #define NELEMENTS(array) (sizeof(array) / sizeof((array)[0])) 

1.4 #define OFFSET(structure, member) ((int) &(((structure *)0)->member)) 

2 (a) An integer:int a; 
(b) A pointer to an integer:int *a; 
(c) A pointer to a pointer to an integer:int **a; 
(d) An array of 10 integers:int a[10]; 
(e) An array of 10 pointers to integers:int *a[10]; 
(f) A pointer to an array of 10 integers:int (*a)[10]; 
(g) A pointer to a <I>function</I> that takes an integer as an argument and returns an integer:int (*a)(int); 
(h) An array of 10 pointers to <I>function</I>s that take an integer argument and return an integer: int (*a[10])(int); 

3 char (*(*x())[])(); 
這道題來自"The C Programming Language"中的一個例子。 
首先,確定標識符:x 
x是一個函數,沒有參數:x() 
傳回值是一個指標:*x() 
這個指標指向一個數組:(*x())[] 
數組中的每個元素是指標:*(*x())[] 
指向一個不帶參數的函數:(*(*x())[])() 
函數的傳回值是char:char (*(*x())[])() 
這裡,要知道*、()和[]的優先順序。 

4 這個定義有點怪,它的意思是:jmp_buf這種類型是一個數組,只有一個元素,元素類型為struct{...}。數組名作為函數參數時,應該是傳遞地址/指標。 

5 在編譯源檔案時,C編譯器和C++編譯器都會對符號(函數或變數)名作某些修正,但兩者採用的修正方法不同,所以兩者產生的目標檔案不能互相連結。在 C++中使用extern "C"可以讓C++符號獲得C連結特性。由於C++編譯器會自動定義__cplusplus宏,所以在C語言標頭檔中採用這種 結構可以保證無論使用何種編譯器,產生的目標檔案都具有C連結特性,能夠與標準C編譯器所產生的目標檔案相連結。 

6 (1)用於全域變數:外部靜態變數,只能在本源檔案中被引用,不能被其它源檔案所引用。 
(2)用於局部變數:局部靜態變數,在函數返回後儲存單元不釋放;下一次調用該函數時,該變數為上次函數返回時的值。 
(3)用於函數:內建函式,只能被本源檔案中的函數所調用,不能被其它源檔案調用。 

7.1 const關鍵字在C語言中用於聲明"常變數",其值不可修改,但具有確定的資料類型。C編譯器總是為其分配相應的儲存單元。 
在C++中,const關鍵字用於聲明常量,C++編譯器視具體情況決定是為其分配儲存單元還是僅將其作為編譯期間的常量。 

7.2 const int a1; a1是整型常量。 
int const a2; a2是整型常量。等同於const int a2; 
const int *a3; a3是指標(a3是可變的),指向一個整型常量。等同於int const *a3; 
int * const a4; a4是常量指標(a4不可變),指向一個整型變數。 
int const * const a5; a5是常量指標(a5不可變),指向一個整型常量。等同於const int * const a5; 

8.1 volatile關鍵字用於聲明記憶體映射的易失型變數,這類變數的值隨時可能由於某種編譯器所不知道的原因(例如,外部裝置對其寫入)所改變,所以編譯器在進行代碼最佳化時不能對其做任何的假設和依賴。 

8.2 volatile可以和const一起使用,不過很少見。 
const關鍵字的意思是限制編程者自己不能修改變數的值;兩者並不矛盾。 
例如一個記憶體映射的、唯讀硬體寄存器,假設它的地址是p,則可以這樣聲明:volatile const UINT32 *p; 

9 sizeof(pmsg) = 指標變數的長度 
sizeof(msg) = 2 (字元數組的長度) 
sizeof("A") = 2 (字串的長度) 
sizeof(ch) = 1 (字元變數的長度) 
sizeof(‘A’) = 整型變數的長度 (在C語言中,字元常量的資料類型實際上是int;在C++中,它的資料類型是char,從而原式等於1) 
sizeof(param) = 指標變數的長度 (數組名作參數時,傳遞的是數組的起始地址) 

10 這種寫法是和編譯器&作業系統相關的,所以不應當這樣寫。在WIN2K+VC環境下debug程式時會出現異常。 
不過這樣寫,編譯器不會報錯。按道理,"hello..."的類型是const char [N],它是不能賦值給char *的, 
因為會丟失常量屬性。但在const關鍵字成為C標準之前,大家都這樣寫程式,所以char *pmsg = "hello..." 
這種寫法被給予特別豁免,即使在C++中也是如此,在"The C++ Programming Language"的附錄裡對此有討論。 

"hello, world!"是字串常量(string literal),它的類型是const char [N],N為字串的長度(包括結尾的0)。 
"The C Programming Language"指出,寫字串常量的結果是未定義的(undefined)。所以在有些平台(作業系統+編譯器) 
上程式不會出錯,而在其它平台上程式出現異常。 

GNU手冊裡這樣說: 
Writing into string constants is a very bad idea; "constants" should be constant. 
不過在GNU中它提供另外的選擇:使用-fwritable-strings進行編譯就可以。 

那麼,為什麼不允許修改字串常量呢(它不也在記憶體中嗎)? 
這可能和另外一個特點有關,即重複字串的合并。現在的編譯器應該會主動協助我們合并程式中相同的字串常量 
以節省記憶體。如果string literal可寫,就會出現問題。例如: 
void foo() 

printf("%s/n", "how are you?"); 

void bar() 

char *p = "how are you?"; 
strcpy(p, "WHO ARE YOU?"); 

調用foo()當然會列印"how are you"。但如果編譯器合并字串,那麼先調用bar(),再調用foo(),foo()列印的就是 
"WHO ARE YOU?"。這當然不是我們想要的結果。 
另外一方面,這樣寫也有問題(確實有人這麼寫): 
if (func() == "something") 
... 
func()是: 
char *func() 

... 
return "something"; 

這就假設編譯器一定會幫我們合并字串,然而那也不一定。 

11 輸出"> 6"。 
混合運算時的資料類型轉換次序:int --> unsigned --> long --> double。 
另外,char和short必定轉換為int,float必定轉換為double。 

12 p = (int *)((unsigned int)a + 1); 
代碼的意圖是想使p指向數組的第二個元素,但通常的寫法是:p=a+1。這裡存在這樣的問題:a是個常量地址, 
a+1指向下一個數組元素,而((unsigned int)a + 1)指向下一個記憶體位址。如果地址是位元組計數的,則p指向的 
是數組第一個元素的第二個位元組。還有一個效果就是:在RISC上該printf語句會出異常,因為不允許非對齊訪問 
(mis-aligned access)。對齊訪問就是訪問2位元組變數的地址要能被2整除,4位元組變數的地址要能被4整除,etc。 

13 這些函數到處都查得到,就不用做了吧.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.