亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

C語言

c語言經(jīng)典筆試題

時(shí)間:2024-10-06 17:15:16 C語言 我要投稿
  • 相關(guān)推薦

c語言經(jīng)典筆試題

  引導(dǎo)語:C語言是一種計(jì)算機(jī)程序設(shè)計(jì)語言,它既具有高級語言的特點(diǎn),又具有匯編語言的特點(diǎn)。以下是小編整理的c語言經(jīng)典筆試題,歡迎參考閱讀!

c語言經(jīng)典筆試題

  1.用預(yù)處理指令#define聲明一個(gè)常數(shù),用以;#defineSECONDS_PER_YEAR(;2.寫一個(gè)“標(biāo)準(zhǔn)”宏MIN,這個(gè)宏輸入兩個(gè)參數(shù)并;#defineMIN(A,B)((A)<=;4.嵌入式系統(tǒng)中經(jīng)常要用到無限循環(huán),你怎么樣用C;這個(gè)問題用幾個(gè)解決方案;while(1);一些程序員更喜歡如下方案:;for(;;);第三個(gè)方案是用goto;

  1. 用預(yù)處理指令#define 聲明一個(gè)常數(shù),用以表明1年中有多少秒(忽略閏年問題)

  #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

  2. 寫一個(gè)“標(biāo)準(zhǔn)”宏MIN,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)。

  #define MIN(A,B) ((A) <= (B) (A) : (B))

  4. 嵌入式系統(tǒng)中經(jīng)常要用到無限循環(huán),你怎么樣用C編寫死循環(huán)呢?

  這個(gè)問題用幾個(gè)解決方案。我首選的方案是:

  while(1)

  {

  }

  一些程序員更喜歡如下方案:

  for(;;)

  {

  }

  第三個(gè)方案是用 goto

  Loop:

  ...

  goto Loop;

  5. 用變量a給出下面的定義

  a) 一個(gè)整型數(shù)(An integer)

  b) 一個(gè)指向整型數(shù)的指針(A pointer to an integer)

  c) 一個(gè)指向指針的的指針,它指向的指針是指向一個(gè)整型數(shù)(A pointer to a pointer to an integer) d) 一個(gè)有10個(gè)整型數(shù)的數(shù)組(An array of 10 integers)

  e) 一個(gè)有10個(gè)指針的數(shù)組,該指針是指向一個(gè)整型數(shù)的(An array of 10 pointers to integers)

  f) 一個(gè)指向有10個(gè)整型數(shù)數(shù)組的指針(A pointer to an array of 10 integers)

  g) 一個(gè)指向函數(shù)的指針,該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)(A pointer to a function that takes an integer as an argument and returns an integer)

  h) 一個(gè)有10個(gè)指針的數(shù)組,該指針指向一個(gè)函數(shù),該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)( An array of ten pointers to functions that take an integer argument and return an integer )

  答案是:

  a) int a; // An integer

  b) int *a; // A pointer to an integer

  c) int **a; // A pointer to a pointer to an integer

  d) int a[10]; // An array of 10 integers

  e) int *a[10]; // An array of 10 pointers to integers

  f) int (*a)[10]; // A pointer to an array of 10 integers

  g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer

  h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

  6. 關(guān)鍵字static的作用是什么?

  這個(gè)簡單的問題很少有人能回答完全。在C語言中,關(guān)鍵字static有三個(gè)明顯的作用:

  1). 在函數(shù)體,一個(gè)被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過程中維持其值不變。

  2). 在模塊內(nèi)(但在函數(shù)體外),一個(gè)被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問。它是一個(gè)本地的全局變量。

  3). 在模塊內(nèi),一個(gè)被聲明為靜態(tài)的函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用。那就是,這個(gè)函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用。

  7.關(guān)鍵字const是什么含意?

  const int a;

  int const a;

  const int *a;

  int * const a;

  int const * a const;

  前兩個(gè)的作用是一樣,a是一個(gè)常整型數(shù)。第三個(gè)意味著a是一個(gè)指向常整型數(shù)的指針(也就是,整型數(shù)是不可修改的,但指針可以)。第四個(gè)意思a是一個(gè)指向整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是可以修改的,但指針是不可修改的)。最后一個(gè)意味著a是一個(gè)指向常整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是不可修改的,同時(shí)指針也是不可修改的)。如果應(yīng)試者能正確回答這些問題,那么他就給我留下了一個(gè)好印象。

  8. 關(guān)鍵字volatile有什么含意 并給出三個(gè)不同的例子。

  一個(gè)定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設(shè)這個(gè)變量的值了。精確地說就是,優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀取這個(gè)變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個(gè)例子:

  1). 并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)

  2). 一個(gè)中斷服務(wù)子程序中會訪問到的非自動變量(Non-automatic variables)

  3). 多線程應(yīng)用中被幾個(gè)任務(wù)共享的變量

  1). 一個(gè)參數(shù)既可以是const還可以是volatile嗎?解釋為什么。

  2). 一個(gè)指針可以是volatile 嗎?解釋為什么。

  3). 下面的函數(shù)有什么錯(cuò)誤:

  int square(volatile int *ptr)

  {

  return *ptr * *ptr;

  }

  Ptr內(nèi)容可能被修改,無法保證兩次取得同一個(gè)值,應(yīng)該先取出值放入一個(gè)變量中,然后通過這個(gè)變量來計(jì)算

  9. 嵌入式系統(tǒng)總是要用戶對變量或寄存器進(jìn)行位操作。給定一個(gè)整型變量a,寫兩段代碼,第一個(gè)設(shè)置a的bit 3,第二個(gè)清除a 的bit 3。在以上兩個(gè)操作中,要保持其它位不變。

  #define BIT3 (0x1<<3)

  static int a;

  void set_bit3(void)

  {

  }

  void clear_bit3(void)

  {

  a &= ~BIT3;

  }

  10. 嵌入式系統(tǒng)經(jīng)常具有要求程序員去訪問某特定的內(nèi)存位置的特點(diǎn)。在某工程中,要求設(shè)置一絕對地址為0x67a9的整型變量的值為0xaa66。編譯器是一個(gè)純粹的ANSI編譯器。寫代碼去完成這一任務(wù)。 Int *p;

  P=(int*)0x67a9;

  *p=0xaa66;

  11. 中斷是嵌入式系統(tǒng)中重要的組成部分,這導(dǎo)致了很多編譯開發(fā)商提供一種擴(kuò)展—讓標(biāo)準(zhǔn)C支持中斷。具代表事實(shí)是,產(chǎn)生了一個(gè)新的關(guān)鍵字__interrupt。下面的代碼就使用了__interrupt關(guān)鍵字去定義了一個(gè)中斷服務(wù)子程序(ISR),請?jiān)u論一下這段代碼的。

  __interrupt double compute_area (double radius)

  {

  double area = PI * radius * radius;

  printf(" Area = %f", area);

  return area;

  }

  12 . 下面的代碼輸出是什么,為什么?

  void foo(void)

  {

  unsigned int a = 6;

  int b = -20;

  (a+b > 6) puts("> 6") : puts("<= 6");

  }

  >6

  13. 評價(jià)下面的代碼片斷:

  unsigned int zero = 0;

  unsigned int compzero = 0xFFFF;

  /*1's complement of zero */

  14. 盡管不像非嵌入式計(jì)算機(jī)那么常見,嵌入式系統(tǒng)還是有從堆(heap)中動態(tài)分配內(nèi)存的過程的。那么嵌入式系統(tǒng)中,動態(tài)分配內(nèi)存可能發(fā)生的問題是什么?

  主要有三種類型:內(nèi)存泄露、內(nèi)存碎片和內(nèi)存崩潰 內(nèi)存崩潰是內(nèi)存使用最嚴(yán)重的結(jié)果,主要原因有數(shù)組訪問越界、寫已經(jīng)釋放的內(nèi)存、指針計(jì)算錯(cuò)誤、訪問堆棧地址越界等等。碎片收集的問題,變量的持行時(shí)間等等

  下面的代碼片段的輸出是什么,為什么?

  if ((ptr = (char *)malloc(0)) == NULL)

  puts("Got a null pointer");

  else

  puts("Got a valid pointer");

  該代碼的輸出是“Got a valid pointer”。

  15. Typedef 在C語言中頻繁用以聲明一個(gè)已經(jīng)存在的數(shù)據(jù)類型的同義字。也可以用預(yù)處理器做類似的事。例如,思考一下下面的例子:

  #define dPS struct s *

  typedef struct s * tPS;

  答案是:typedef更好。思考下面的例子:

  dPS p1,p2;

  tPS p3,p4;

  第一個(gè)擴(kuò)展為

  struct s * p1, p2;

  上面的代碼定義p1為一個(gè)指向結(jié)構(gòu)的指,p2為一個(gè)實(shí)際的結(jié)構(gòu),這也許不是你想要的。第二個(gè)例子正確地定義了p3 和p4 兩個(gè)指針。

  16. C語言同意一些令人震驚的結(jié)構(gòu),下面的結(jié)構(gòu)是合法的嗎,如果是它做些什么?

  int a = 5, b = 7, c;

  c = a+++b;

  上面的代碼被處理成:

  c = a++ + b;

  因此, 這段代碼持行后a = 6, b = 7, c = 12。

  17.找錯(cuò)題

  試題1:

  void test1()

  {

  char string[10];

  char* str1 = "0123456789";

  strcpy( string, str1 );

  }

  試題2:

  void test2()

  {

  char string[10], str1[10];

  int i;

  for(i=0; i<10; i++)

  {

  str1[i] = 'a';

  }

  strcpy( string, str1 );

  }

  試題3:

  void test3(char* str1)

  {

  char string[10];

  if( strlen( str1 ) <= 10 )

  {

  strcpy( string, str1 );

  }

  }

  解答:

  試題1字符串str1需要11個(gè)字節(jié)才能存放下(包括末尾的?