国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

考查初級嵌入式開發人員C基本功的16道題

發布時間:2010-1-3 08:14    發布者:李寬
關鍵詞: 初級 , 基本功 , 開發 , 考查 , 嵌入式
非;娟P于C語言的問題,一個信息類(計算機,資訊工程,電子工程, 通信工程)專業的本科畢業生應該達到的水平,如果你有3道以上的題目不能答對,基本上我們都不好說什么了....題目不難,全部都能快速地答完,當然也需要一定的知識儲備.

約定:
   1) 下面的測試題中,認為所有必須的頭文件都已經正確的包含了
    2)數據類型   
        char 一個字節 1 byte
        int 兩個字節 2 byte (16位系統,認為整型是2個字節)
        long int 四個字節 4 byte
        float  四個字節4 byet
        double 八個字節 8 byte
        long double 十個字節 10 byte
        pointer 兩個字節 2 byte(注意,16位系統,地址總線只有16位)

第1題: 考查對volatile關鍵字的認識

#include
static jmp_buf  buf;

main()   
{
  volatile  int b;
  b =3;

  if(setjmp(buf)!=0)  
  {
    printf("%d ", b);  
    exit(0);
  }
  b=5;
  longjmp(buf , 1);
}   

請問,這段程序的輸出是
(a) 3
(b) 5
(c) 0
(d) 以上均不是

第2題:考查類型轉換

main()
{
   struct node
   {
     int a;
     int b;
     int c;     
   };
   struct node  s= { 3, 5,6 };
   struct node *pt = &s;
   printf("%d" ,  *(int*)pt);

}
  

這段程序的輸出是:
(a) 3
(b) 5
(c) 6
(d) 7

第3題:考查遞歸調用

int  foo ( int x , int  n) 
{
  int val;
  val =1;
  
  if (n>0)
  {
    if (n%2 == 1)  val = val *x;
   
    val = val * foo(x*x , n/2);
  }
  return val;
}


這段代碼對x和n完成什么樣的功能(操作)?
(a) xn
(b) x*n
(c) nx
(d) 以上均不是

第4題:考查指針

main()
{
  int  a[5] = {1,2,3,4,5};
  int *ptr =  (int*)(&a+1);

  printf("%d %d" , *(a+1), *(ptr-1) );

}
  

這段程序的輸出是:

(a) 2 2
(b) 2 1
(c) 2 5
(d) 以上均不是

第5題:考查多維數組與指針

void foo(int [][3] );     

main()
{
  int a [3][3]= { { 1,2,3} , { 4,5,6},{7,8,9}};
  foo(a);
  printf("%d" , a[2][1]);
}

void foo( int b[][3])   
{
  ++ b;
  b[1][1] =9;
}
  

這段程序的輸出是:

(a) 8
(b) 9
(c) 7
(d)以上均不對


第6題目:考查逗號表達式

main()
{
  int a, b,c, d;
  a=3;
  b=5;
  c=a,b;
  d=(a,b);

  printf("c=%d" ,c);
  printf("d=%d" ,d);

}

這段程序的輸出是:

(a) c=3 d=3
(b) c=5 d=3
(c) c=3 d=5
(d) c=5 d=5

第7題:考查指針數組

main()
{
  int a[][3] = { 1,2,3 ,4,5,6};
  int (*ptr)[3] =a;

  printf("%d %d "  ,(*ptr)[1], (*ptr)[2] );

  ++ptr;
  printf("%d %d"  ,(*ptr)[1], (*ptr)[2] );
}

這段程序的輸出是:

(a) 2 3 5 6
(b) 2 3 4 5
(c) 4 5 0 0
(d) 以上均不對

第8題:考查函數指針

int *f1(void)
{
  int x =10;
  return(&x);
}

int *f2(void)
{
  int*ptr;
  *ptr =10;
  return ptr;
}

int *f3(void)
{
  int *ptr;
  ptr=(int*) malloc(sizeof(int));
  return ptr;
}

上面這3個函數哪一個最可能引起指針方面的問題

(a) 只有 f3
(b) 只有f1 and f3
(c) 只有f1 and f2
(d) f1 , f2 ,f3

第9題:考查自加操作(++)

main()
{
  int i=3;
  int j;

  j = sizeof(++i+ ++i);

  printf("i=%d j=%d", i ,j);
}

這段程序的輸出是:

(a) i=4 j=2
(b) i=3 j=2
(c) i=3 j=4
(d) i=3 j=6

第10題:考查形式參數,實際參數,指針和數組

void f1(int *, int);
void f2(int *, int);
void(*p[2]) ( int *, int);

main()
{
  int a;
  int b;

  p[0] = f1;
  p[1] = f2;
  a=3;
  b=5;

  p[0](&a , b);
  printf("%d\t %d\t" , a ,b);

  p[1](&a , b);
  printf("%d\t %d\t" , a ,b);
}

void f1( int* p , int q)
{
  int tmp;
  tmp =*p;
  *p = q;
  q= tmp;
}

void f2( int* p , int q)
{
  int tmp;
  tmp =*p;
  *p = q;
  q= tmp;
}  

這段程序的輸出是:

(a) 5 5 5 5
(b) 3 5 3 5
(c) 5 3 5 3
(d) 3 3 3 3

第11題:考查自減操作(--)

void e(int );   

main()
{
  int a;
  a=3;
  e(a);
}

void e(int n)
{
  if(n>0)
  {
    e(--n);
    printf("%d" , n);
    e(--n);
  }
}

這段程序的輸出是:

(a) 0 1 2 0
(b) 0 1 2 1
(c) 1 2 0 1
(d) 0 2 1 1

第12題:考查typedef類型定義,函數指針

typedef int (*test) ( float * , float*)
test tmp;

tmp 的類型是

(a) 函數的指針,該函數以 兩個指向浮點數(float)的指針(pointer)作為參數(arguments)
      Pointer to function of having two arguments that is pointer to float
(b) 整型
(c) 函數的指針,該函數以 兩個指向浮點數(float)的指針(pointer)作為參數(arguments),并且函數的返回值類型是整型
      Pointer to function having two argument that is pointer to float and return int
(d) 以上都不是


第13題:數組與指針的區別與聯系

main()
{
  char *p;
  char buf[10] ={ 1,2,3,4,5,6,9,8};
  p = (buf+1)[5];
  printf("%d" , p);
}

這段程序的輸出是:

(a) 5
(b) 6
(c) 9
(d) 以上都不對

第14題: 考查指針數組的指針

Void f(char**);

main()
{
  char * argv[] = { "ab" ,"cd" , "ef" ,"gh", "ij" ,"kl" };
  f( argv );
}

void f( char **p )
{
  char* t;

  t= (p+= sizeof(int))[-1];

  printf( "%s" , t);
}

這段程序的輸出是:

(a) ab
(b) cd
(c) ef
(d) gh

第15題:此題考查的是C的變長參數,就像標準函數庫里printf()那樣,這個話題一般國內大學課堂是不會講到的,不會也情有可原呵呵,

#include
int ripple ( int , ...);

main()
{
  int num;
  num = ripple ( 3, 5,7);
  printf( " %d" , num);
}

int ripple (int n, ...)
{
  int i , j;
  int k;  
  va_list p;

  k= 0;
  j = 1;
  va_start( p , n);     

  for (; j   {
    i =  va_arg( p , int);
    for (; i;    i &=i-1  )
      ++k;
  }
  return k;
}

這段程序的輸出是:

(a) 7
(b) 6
(c) 5
(d) 3

第16題:考查靜態變量的知識

int counter (int i)
{
  static int count =0;
  count = count +i;
  return (count );
}
main()
{
  int i , j;

  for (i=0; i <=5; i++)
    j = counter(i);
}

本程序執行到最后,j的值是:

(a) 10
(b) 15
(c) 6
(d) 7




詳細參考答案

第1題:   (b)
volatile字面意思是易于揮發的。這個關鍵字來描述一個變量時,意味著 給該變量賦值(寫入)之后,馬上再讀取,寫入的值與讀取的值可能不一樣,所以說它"容易揮發"的。
這是因為這個變量可能一個寄存器,直接與外部設備相連,你寫入之后,該寄存器也有可能被外部設備的寫操作所改變;或者,該變量被一個中斷程序,或另一個進程
改變了.
volatile variable isn't affected by the optimization. Its value after the longjump is the last value variable assumed.

b last value is 5 hence 5 is printed.

setjmp : Sets up for nonlocal goto /* setjmp.h*/

Stores context information such as register values so that the lomgjmp function can return control to the statement following the one calling setjmp.Returns 0 when it is initially called.

Lonjjmp: longjmp Performs nonlocal goto /* setjmp.h*/

Transfers control to the statement where the call to setjmp (which initialized buf) was made. Execution continues at this point as if longjmp cannot return the value 0.A nonvolatile automatic variable might be changed by a call to longjmp.When you use setjmp and longjmp, the only automatic variables guaranteed to remain valid are those declared volatile.

Note: Test program without volatile qualifier (result may very)


第2題:   (a)
The members of structures have address in increasing order of their declaration. If a pointer to a structure is cast to the type of a pointer to its first member, the result refers to the first member.

第3題:  (a)
Non recursive version of the program

int  what ( int x , int  n)
{
  int val;
  int product;
  product =1;
  val =x;

  while(n>0)
  {
    if (n%2 == 1)  
      product = product*val;
    n = n/2;
    val = val* val;
  }
}

/* Code raise a number (x) to a large power (n) using binary doubling strategy */
Algorithm description

(while n>0)  
{
  if  next most significant binary digit of  n( power)  is one
  then multiply accumulated product by current val  ,
  reduce n(power)  sequence by a factor of two using integer division .
  get next val by multiply current value of itself                  
}



第4題:  (c)
type of a is array of int
type of &a is pointer to array of int



Taking a pointer to the element one beyond the end of an array is sure to work.

第5題:  (b)




第6題:  (c)
The comma separates the elements of a function argument list. The comma is also used as an operator in comma expressions. Mixing the two uses of comma is legal, but you must use parentheses to distinguish them. the left operand E1 is evaluated as a void expression, then E2 is evaluated to give the result and type of the comma expression. By recursion, the expression

E1, E2, ..., En

results in the left-to-right evaluation of each Ei, with the value and type of En giving the result of the whole expression.

c=a,b;  / *yields c=a* /
d=(a,b); /* d =b  */



第7題:  (a)



/* ptr is pointer to array of 3 int */


第8題:  (c)
f1顯然有問題,它返回一個局部變量的指針,局部變量是保存在stack中的,退出函數后,局部變量就銷毀了,保留其指針沒有意義,因為其指向的stack空間可能被其他變量覆蓋了
f2也有問題, ptr是局部變量,未初始化,它的值是未知的,*ptr不知道指向哪里了,直接給*ptr賦值可能會覆蓋重要的系統變量,這就是通常說的野指針的一種

第9題:  (b)
sizeof  操作符給出其操作數需要占用的空間大小,它是在編譯時就可確定的,所以其操作數即使是一個表達式,也不需要在運行時進行計算.( ++i + ++ i  )是不會執行的,所以
i 的值還是3

第10題:  (a)
很顯然選a.
f1交換*p 和 q的值,f1執行完后, *p 和 q的值的確交換了,  但 q的改變不會影響到  b的改變,  *p 實際上就是 a
所以執行f1后,  a=b=5
這道題考查的知識范圍很廣,包括typedef自定義類型,函數指針,指針數組
void(*p[ 2 ]) ( int *, int);
定義了一個函數指針的數組p,p有兩個指針元素.  元素是函數的指針,函數指針指向的函數是一個帶2個參數,返回void的函數,所帶的兩個參數是 指向整型的指針,和整型
p[ 0 ] = f1; p[ 1 ] = f2 contain address of function .function name without parenthesis represent address of function Value and address of variable is passed to function only argument that is effected is a (address is passed). Because of call by value f1, f2 can not effect b

第11題:  (a)



考查--操作和遞歸調用,仔細分析一下就可以了

第12題:  (c)
建議不會的看看C專家編程
從左往有,遇到括號停下來,將第一個括號里的東西看成一個整體



第13題:  (c)

考查什么時候數組就是指針.對某些類型T而言,如果一個表達式是 T[]  (T的數組),  這個表達式的值實際上就是指向該數組的第一個元素的指針.所以(buf+1)[5]實際上就是*(buf +6)或者buf[6]


第14題:  (b)



sizeof(int)的值是2,所以p+=sizeof(int) 指向 argv[2],這點估計大家都沒有什么疑問

(p+=sizeof(int))[-1] 指向 argv[1],能理解嗎,因為(p+=sizeof(int))[-1]  就相當于 (p+=2)[-1] ,也就是(p+2-1)

第15題:  (c)

在C編譯器通常提供了一系列處理可變參數的宏,以屏蔽不同的硬件平臺造成的差異,增加程序的可移植性。這些宏包括va_start、 va_arg和va_end等。
采用ANSI標準形式時,參數個數可變的函數的原型聲明是:
type funcname(type para1, type para2, ...)
這種形式至少需要一個普通的形式參數,后面的省略號不表示省略,而是函數原型的一部分。type是函數返回值和形式參數的類型。

不同的編譯器,對這個可變長參數的實現不一樣 ,gcc4.x中是內置函數.

關于可變長參數,可參閱

http://www.upsdn.net/html/2004-11/26.html

http://www.upsdn.net/html/2004-11/24.html


程序分析

va_list p;  /*定義一個變量 ,保存  函數參數列表 的指針*/
va_start( p , n);     /*用va_start宏 初始化 變量p,   
                             va_start宏的第2個參數n  ,
                            是一個固定的參數,
                          必須是我們自己定義的變長函數的最后一個入棧的參數
                            也就是調用的時候參數列表里的第1個參數*/
for (; j {
    i =  va_arg( p , int);      /*va_arg取出當前的參數,
                                      并認為取出的參數是一個整數(int)  */
    for (; i;    i &=i-1  )      /*判斷取出的i是否為0*/
      ++k;                              /* 如果i不為0,   k自加,  
                                      i與i-1進行與邏輯運算, 直到i 為0
                                     這是一個技巧,下面會談到它的功能*/
}

當我們調用ripple函數時,傳遞給ripple函數的 參數列表的第一個參數n的值是3 .

va_start 初始化 p士氣指向第一個未命名的參數(n是有名字的參數) ,也就是 is 5 (第一個).

每次對 va_arg的調用,都將返回一個參數,并且把 p 指向下一個參數.

va_arg 用一個類型名來決定返回的參數是何種類型,以及在 var_arg的內部實現中決定移動多大的距離才到達下一個 參數

(; i; i&=i-1) k++        /* 計算i有多少bit被置1 */


5用二進制表示是 (101) 2
7用二進制表示 (111) 3
所以 k 返回 5(2+3),也即本題應該選c

舉個例子,就很好理解了

令  i= 9 = 1001
     i-1  = 1000        
    (i-1) +1 = i
               1000
                 +1
              1 001

因為i與i-1的最右邊的那位(最低位) 肯定是不同,如果i1,i-1肯定是0,反之亦然.     i & i-1 這個運算,在二相補的數字系統中,將會 消除最右邊的1位


第16題:  (b)
答案是 (b)
相傳高斯小學一年級的時候就會做這類等比數列的題目了.這道題考查的是靜態變量的知識,當每次調用完函數之后,靜態變量的值不會丟失,這與棧中的臨時局部變量明顯不同的地方.
所以,第一次調用counter(0)之后,count =0
第二次調用 counter(1)后 count = 0+1;
第三次調用 counter(2) count = 1+2;    /* count = count +i */
第四次調用 counter(3) count = 3+3;
第五次調用 counter(4) count = 6+4;
第六次調用 counter(5) count = 10+5;
本文地址:http://m.qingdxww.cn/thread-7187-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
freedomzlp 發表于 2010-5-28 09:08:56
呵呵  干嗎 英文和漢語摻著來?中毒了?
pjar 發表于 2010-6-1 08:50:32
好東西
heguangjing 發表于 2010-7-1 19:11:42
受教
zhujunfeng0117 發表于 2010-9-4 15:53:12
樓上受驚(精)了。。。
罪過罪過。。。
刺客 發表于 2010-9-20 16:40:38
看來C很重要啊!
oyty87 發表于 2010-9-21 14:04:50
好東西
shinhwaforever 發表于 2010-10-21 15:07:15
學習了,謝謝樓主的分享啊.
zwc6658305 發表于 2010-11-12 17:15:24
錯3個
m1221m 發表于 2010-11-18 20:37:34
樓主辛苦,謝謝分享
wangxutao 發表于 2011-1-1 21:30:34
thank you!
shenyan 發表于 2011-1-14 22:36:01
學習了
lala1008 發表于 2011-1-25 11:46:57
謝謝
lhj76310 發表于 2011-2-25 21:09:16
謝謝了,我會好好學習一下的
cqzy6666 發表于 2011-3-1 10:02:22
不錯
shalione 發表于 2011-3-21 19:35:25
wuafeng 發表于 2011-3-30 09:15:33
受教了
williamkmcn 發表于 2011-4-20 11:56:26
thanks, learn it
sw9518 發表于 2011-4-26 11:55:09
ckq1988 發表于 2011-5-22 23:57:13
頂起。
12下一頁
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 四虎在线视频| 国产小视频免费看| 欧美特级特黄AAAAA片| 亚洲国产综合视频| 人妖videosex人妖xxx| 亚洲高清免费观看| 一个人免费观看的视频| 狠狠色狠狠色综合日日小说| 亚洲精品在线影院| 日韩欧美专区| 亚洲区欧美| 在线播放亚洲精品富二代91| 久久久久久免费高清电影| 亚洲一区二区中文字幕| 青娱乐国产精品视频| 色射综合| 99热这里只有精品88| 99久久精品免费看国产一区二区| 欧美成a人片免费看久久| 亚洲在线2018最新无码| 欧美三级黄色大片| 天天看夜夜操| 亚洲综合亚洲| 九九久久国产精品免费热6| 色屁屁影院| 青娱乐免费视频观看| 四虎永久在线精品网址| jizz国产丝袜18老师美女| 窝窝影院午夜看片毛片| 亚洲精品亚洲人成在线观看麻豆| 午夜久久精品| 一区二区不卡久久精品| 麻豆传煤网站网址入口在线下载 | 少妇系列之白嫩人妻| 日韩综合在线视频| 亚洲国产精品久久婷婷| 在健身器材上做a| 欧美重口绿帽video| 日本中文一二区有码在线观看| 婷婷色在线观看| 一区二区三区高清不卡|