欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
考查嵌入式C開(kāi)發(fā)人員的最好的0x10道題

考查嵌入式C開(kāi)發(fā)人員的最好的0x10道題

考查一個(gè)初級嵌入式系統開(kāi)發(fā)人員的C基本功,附有答案題目由資深嵌入式系統專(zhuān)家擬定,目的是考查入門(mén)級的嵌入式軟件開(kāi)發(fā)人員 Gavin Shaw提供詳細解答

編者按:非?;娟P(guān)于C語(yǔ)言的問(wèn)題,一個(gè)信息類(lèi)(計算機,資訊工程,電子工程, 通信工程)專(zhuān)業(yè)的本科畢業(yè)生應該達到的水平。題目不難,全部都能快速地答完,當然也需要一定的知識儲備。
對于大多數人,我們預期你可能答錯 3)   4)  15)題,所以答錯3道以?xún)鹊?,我們認為你很棒
答錯5道題以?xún)?,我們認為你還不錯(你還可能答錯第9題)
如果你有6道以上的題目不能答對,基本上我們都不好說(shuō)什么了....

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

第1題: 考查對volatile關(guān)鍵字的認識
#include<setjmp.h>
static jmp_buf buf;

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

if(setjmp(buf)!=0)
{
printf("%d ", b);
exit(0);
}
b=5;
longjmp(buf , 1);
}
請問(wèn),這段程序的輸出是
(a) 3
(b) 5
(c) 0
(d) 以上均不是

第2題:考查類(lèi)型轉換
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) x^n (x的n次冪)
(b) x*n(x與n的乘積)
(c) n^x(n的x次冪)
(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個(gè)函數哪一個(gè)最可能引起指針?lè )矫娴膯?wèn)題

(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題:考查形式參數,實(shí)際參數,指針和數組
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類(lèi)型定義,函數指針
typedef int (*test) ( float * , float*)
test tmp;
 tmp 的類(lèi)型是

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


第13題:數組與指針的區別與聯(lián)系
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的變長(cháng)參數,就像標準函數庫里printf()那樣,這個(gè)話(huà)題一般國內大學(xué)課堂是不會(huì )講到的,不會(huì )也情有可原呵呵,

#include<stdarg.h>
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<n; ++j)
{
i = va_arg( p , int);
for (; i; i &=i-1 )
++k;
}
return k;
}
這段程序的輸出是:

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

第16題:考查靜態(tài)變量的知識
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字面意思是易于揮發(fā)的。這個(gè)關(guān)鍵字來(lái)描述一個(gè)變量時(shí),意味著(zhù) 給該變量賦值(寫(xiě)入)之后,馬上再讀取,寫(xiě)入的值與讀取的值可能不一樣,所以說(shuō)它"容易揮發(fā)"的。
這是因為這個(gè)變量可能一個(gè)寄存器,直接與外部設備相連,你寫(xiě)入之后,該寄存器也有可能被外部設備的寫(xiě)操作所改變;或者,該變量被一個(gè)中斷程序,或另一個(gè)進(jìn)程
改變了.
volatile 不會(huì )被編譯器優(yōu)化影響,在longjump 后,它的值 是后面假定的變量值,b最后的值是5,所以5被打印出來(lái).

setjmp : 設置非局部跳轉 /* 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: 執行一個(gè)非局部跳轉 /* 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)

更詳細介紹,請參閱 C語(yǔ)言的setjmp和longjmp

第2題:   (a)
結構題的成員在內存中的地址是按照他們定義的位置順序依次增長(cháng)的。如果一個(gè)結構體的指針被看成 它的第一個(gè)成員的指針,那么該指針的確指向第一個(gè)成員

第3題:  (a)
此題目較難.

這個(gè)程序的非遞歸版本
int  what ( int x , int  n)
{
int val;
int product;
product =1;
val =x;

while(n>0)
{
if (n%2 == 1)
product = product*val; /*如果是奇數次冪, x(val)
要先乘上一次,;
偶數次冪,最后返回時(shí)才會(huì )到這里
乘以1*/
val = val* val;
 n = n/2;
}
return product;
}
/* 用二元復乘策略 */
算法描述
(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)
a的類(lèi)型是一個(gè)整型數組,它有5個(gè)成員
&a的類(lèi)型是一個(gè)整型數組的指針
所以&a + 1指向的地方等同于 a[6]

所以*(a+1) 等同于a[1]
ptr等同 a[6], ptr-1就等同與a[5]


第5題:  (b)


題目自身就給了足夠的提示
b[0][0]  = 4
b[1][0]  = 7


第6題:  (c)
考查逗號表達式,逗號表達式的優(yōu)先級是很低的,比 賦值(=)的優(yōu)先級 低. 逗號表達式的值就是最后一個(gè)元素的值
逗號表達式的還有一個(gè)作用就是分割函數的參數列表..

E1, E2, ..., En
上面這個(gè)表示式的左右是,E1, E2,... En的值被分別計算出來(lái),En計算出來(lái)的結構賦給整個(gè)逗號表達式
c=a,b;       / *yields c=a* /
d=(a,b); /* d =b */


第7題:  (a)

ptr是一個(gè)數組的指針,該數組有3個(gè)int成員


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

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

第10題:  (a)
很顯然選a.
f1交換*p 和 q的值,f1執行完后, *p 和 q的值的確交換了,  但 q的改變不會(huì )影響到  b的改變,  *p 實(shí)際上就是 a
所以執行f1后,  a=b=5
這道題考查的知識范圍很廣,包括typedef自定義類(lèi)型,函數指針,指針數組
void(*p[ 2 ]) ( int *, int);
定義了一個(gè)函數指針的數組p,p有兩個(gè)指針元素.  元素是函數的指針,函數指針指向的函數是一個(gè)帶2個(gè)參數,返回void的函數,所帶的兩個(gè)參數是 指向整型的指針,和整型
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)
分析函數聲明,建議不會(huì )的看看《C專(zhuān)家編程
這里介紹一個(gè)簡(jiǎn)單規則:從左往有,遇到括號停下來(lái),將第一個(gè)括號里的東西看成一個(gè)整體



第13題:  (c)

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


第14題:  (b)


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

(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標準形式時(shí),參數個(gè)數可變的函數的原型聲明是:
type funcname(type para1, type para2, ...)
這種形式至少需要一個(gè)普通的形式參數,后面的省略號不表示省略,而是函數原型的一部分。type是函數返回值和形式參數的類(lèi)型。

不同的編譯器,對這個(gè)可變長(cháng)參數的實(shí)現不一樣 ,gcc4.x中是內置函數.

關(guān)于可變長(cháng)參數,可參閱

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

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


程序分析

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

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

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

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

va_arg 用一個(gè)類(lèi)型名來(lái)決定返回的參數是何種類(lèi)型,以及在 var_arg的內部實(shí)現中決定移動(dòng)多大的距離才到達下一個(gè) 參數

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

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

舉個(gè)例子,就很好理解了
令  i= 9 = 1001
i-1 = 1000
(i-1) +1 = i
1000
+1
1 001

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


第16題:  (b)
答案是 (b)
相傳高斯小學(xué)一年級的時(shí)候就會(huì )做這類(lèi)等比數列的題目了.這道題考查的是靜態(tài)變量的知識,當每次調用完函數之后,靜態(tài)變量的值不會(huì )丟失,這與棧中的臨時(shí)局部變量明顯不同的地方.
所以,第一次調用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;


命題人信息 Ashok K. Pathak a member ( Research Staff ) at Bharat Electronics Limited (CRL) , Ghaziabad. He has been developing embedded application for the past five years .Ashok holds a M.E in computer science and engineering . Ashok recently completed a book about‘ "Advanced Test in C and Embedded System Programming" , Published by BPB , ND .

作者:Gavin Shaw   更新日期:2006-10-23

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
大神用10000字總結了嵌入式C語(yǔ)言必學(xué)知識點(diǎn)……
有關(guān)printf函數處理過(guò)程,值得注意
關(guān)于C語(yǔ)言同步調用,回調,異步調用
回調函數
讓你的 C 程序更有效率的 10 種方法
C語(yǔ)言可變參數(va_arg,va_list,va_start,va_end)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久