據(jù)悉,深圳某工程師淪為C語(yǔ)言筆試槍手
事情是這樣的,昨晚晚上,有個(gè)網(wǎng)友發(fā)消息給我,說(shuō)他有幾道C語(yǔ)言筆試題不會(huì)寫(xiě),所以,就出現(xiàn)了解題的這一幕。
文章中,我只講解了一部分,有一些題目覺(jué)得沒(méi)必要講,然后我在pdf上做了注釋,想看的在公眾號(hào)留言「20201227」獲取pdf文檔。
1、第一題
#include?"stdio.h"
int?x?=?2;
int?y?=?0;?
int?main()
{
????if(x){
??????y++;
????}
????printf("%d\n",y);
????getchar();
????return?0;
}
這是送分題,就沒(méi)有怎么好說(shuō)的了,答案 1 .
2、解析一道比較有坑的。
#include?"stdio.h"
#include?"string.h"
int?a()
{
????static?int?i?=0;
????if(i>=1)
????{
????????return?--i;
????}
????return?i++;
}
int?main()
{
????int?A1?=?0;
????int?A2?=?0;
????int?A3?=?0;
????A1?=?a();
????A2?=?a();
????A3?=?a();
????printf("%d,%d,%d\n",A1,A2,A3);
????getchar();
????return?0;
}
這個(gè)題目,主要要搞清楚,return i++ ,是先return i 再++,那就問(wèn)題不大了。
3、這題應(yīng)該好好說(shuō)一下
#include?"stdio.h"
int?arg[]?=?{0,1,2,3};
int?*p?=?&arg[1];
int?v?=?0;
int?w?=?0;
int?main()
{
????int?i;
????*(p++)+=?5;
????v?=?*p;?
????*p?=?*p?+5;
????w=*p;
????printf("v:%d\n",v);
????printf("w:%d\n",w);
????for(i=0;i<4;i++)
??????printf("arg[%d]=%d\n",i,arg[i]);
????getchar();
????return?0;
}
這題乍一看其實(shí)沒(méi)有什么難度,但是實(shí)際寫(xiě)的時(shí)候,容易出問(wèn)題,特意拿出來(lái)說(shuō)一下。
核心在這行代碼 *(p++)+= 5;
分解出來(lái)就是 取得p指向的值,然后 +=5 ,再讓p指向下一個(gè)位置。
反匯編代碼是這樣的
mov?rax,QWORD?PTR?[rip+0x2f0f]?#?404040?
lea?rdx,[rax+0x4]?//這是讓指針指向下一個(gè)位置保存的寄存器
mov?QWORD?PTR?[rip+0x2f04],rdx?#?404040?
mov?edx,DWORD?PTR?[rax]?//這是用來(lái)也?5?運(yùn)算的寄存器
add?edx,0x5
mov?DWORD?PTR?[rax],edx
如果知道了這點(diǎn),其他的就容易很多了。
????int?i;
????*(p++)+=?5;??//arg[1]?=?6?p指向arg[2]
????v?=?*p;?//v?=?arg[2]?=?2
????*p?=?*p?+5;?//arg[2]?=?2+5?=?7
????w=*p;?//w?=?7
????printf("v:%d\n",v);
????printf("w:%d\n",w);
大家可以自己試試,如果把 *(p++)+= 5 改成 *(++p)+= 5 結(jié)果如何呢?
4、鏈表編程題
下面的題目我只寫(xiě)了第一題,后面的一題沒(méi)有繼續(xù)下,寫(xiě)鏈表的題目,我建議畫(huà)一張鏈表的連接圖,這樣寫(xiě)代碼的時(shí)候就會(huì)特別清晰了。
大家有不懂的,可以盡管問(wèn),另一個(gè)題目,歡迎留言寫(xiě)出來(lái),我覺(jué)得這樣的題目簡(jiǎn)單,但是也比較考驗(yàn)思維能力。
題目:

鏈表圖形

直接上代碼吧
#include?"stdio.h"
#include?"string.h"
#include?"stdlib.h"
typedef?struct?_STUDENT_INFO
{
?int?IDx;
?char?Name[32];
?struct??_STUDENT_INFO?*Next;
}?STUDENT_INFO_DEF;
STUDENT_INFO_DEF?*?creat(void)
{
????STUDENT_INFO_DEF?*?h?=?(STUDENT_INFO_DEF?*)malloc(sizeof(STUDENT_INFO_DEF));
????h->Next?=?NULL;
????return?h;
}
int?InsertStu(STUDENT_INFO_DEF?*head,STUDENT_INFO_DEF?stu)
{
????if(head?==?NULL){
????????printf("head?NULL\n");
????????return?-1;
????}
????STUDENT_INFO_DEF?*?temp?=?head;
?STUDENT_INFO_DEF?*?new?=?(STUDENT_INFO_DEF?*)malloc(sizeof(STUDENT_INFO_DEF));
????
????new->IDx?=?stu.IDx;
????strncpy(new->Name,stu.Name,strlen(stu.Name));
????new->Next?=?NULL;
????while?(temp->Next?!=?NULL)?{temp=temp->Next;}
????
????temp->Next?=?new;
????printf("[InsertStu]?IDx:%d?Name:%s?Ok\n",new->IDx,new->Name);
????return?(0);
}
/*遍歷鏈表*/
int?TraverseStu(STUDENT_INFO_DEF?*head)
{
????STUDENT_INFO_DEF?*?temp?=?head;
????if(head?==?NULL){
????????printf("head?NULL\n");
????????return?-1;
????}
????while(temp->Next!=NULL)
????{
????????temp?=?temp->Next;
????????printf("[TraverseStu]IDx:%d?Name:%s\n",temp->IDx,temp->Name);
????}
????return?(0);
}
int?FindAndDelete(STUDENT_INFO_DEF?*head,STUDENT_INFO_DEF?stu)
{
????STUDENT_INFO_DEF?*?temp?=?head;
????STUDENT_INFO_DEF?*?temp1?=?NULL;
????if(head?==?NULL){
????????printf("head?NULL\n");
????????return?-1;
????}
????while(temp->Next!=NULL)
????{
????????temp?=?temp->Next;
????????if(temp->IDx?==?stu.IDx)?break;
????}
????temp1?=?temp->Next;
????temp->Next?=?NULL;
????while(temp1!=NULL)
????{
????????free(temp1);
????????temp1?=?temp1->Next;
????}
????printf("[FindAndDelete]\n");
????return?0;
}
int?main()
{
????int?i;
????/*創(chuàng)建鏈表頭*/
????STUDENT_INFO_DEF?*head;?
????STUDENT_INFO_DEF?stu;
????head=creat();
?
????for(i=0;i<5;i++)
????{
????????stu.IDx?=?i+1;
????????snprintf(stu.Name,?strlen("student")+2,?"student%d",?i+1);
????????InsertStu(head,stu);
????}
????TraverseStu(head);
????stu.IDx?=?2;
????FindAndDelete(head,stu);
????TraverseStu(head);
????getchar();
?return?0;
}
代碼輸出
weiqifa@bsp-ubuntu1804:~/c/mianshi$?gcc?lianbiao.c?&&?./a.out
[InsertStu]?IDx:1?Name:student1?Ok
[InsertStu]?IDx:2?Name:student2?Ok
[InsertStu]?IDx:3?Name:student3?Ok
[InsertStu]?IDx:4?Name:student4?Ok
[InsertStu]?IDx:5?Name:student5?Ok
[TraverseStu]IDx:1?Name:student1
[TraverseStu]IDx:2?Name:student2
[TraverseStu]IDx:3?Name:student3
[TraverseStu]IDx:4?Name:student4
[TraverseStu]IDx:5?Name:student5
[FindAndDelete]
[TraverseStu]IDx:1?Name:student1
[TraverseStu]IDx:2?Name:student2

評(píng)論
圖片
表情
