据悉,深圳某工程师沦为C语言笔试枪手
生活随笔
收集整理的這篇文章主要介紹了
据悉,深圳某工程师沦为C语言笔试枪手
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
事情是這樣的,昨晚晚上,有個網友發消息給我,說他有幾道C語言筆試題不會寫,所以,就出現了解題的這一幕。
文章中,我只講解了一部分,有一些題目覺得沒必要講,然后我在pdf上做了注釋,想看的在公眾號留言「20201227」獲取pdf文檔。
1、第一題
#include?"stdio.h"int?x?=?2; int?y?=?0;?int?main() {if(x){y++;}printf("%d\n",y);getchar();return?0; }這是送分題,就沒有怎么好說的了,答案 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; }這個題目,主要要搞清楚,return i++ ,是先return i 再++,那就問題不大了。
3、這題應該好好說一下
#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; }這題乍一看其實沒有什么難度,但是實際寫的時候,容易出問題,特意拿出來說一下。
核心在這行代碼 *(p++)+= 5;
分解出來就是 取得p指向的值,然后 +=5 ,再讓p指向下一個位置。
反匯編代碼是這樣的
mov?rax,QWORD?PTR?[rip+0x2f0f]?#?404040?<p> lea?rdx,[rax+0x4]?//這是讓指針指向下一個位置保存的寄存器 mov?QWORD?PTR?[rip+0x2f04],rdx?#?404040?<p> mov?edx,DWORD?PTR?[rax]?//這是用來也?5?運算的寄存器 add?edx,0x5 mov?DWORD?PTR?[rax],edx如果知道了這點,其他的就容易很多了。
????int?i;*(p++)+=?5;??//arg[1]?=?6?p指向arg[2]v?=?*p;?//v?=?arg[2]?=?2*p?=?*p?+5;?//arg[2]?=?2+5?=?7w=*p;?//w?=?7printf("v:%d\n",v);printf("w:%d\n",w);大家可以自己試試,如果把 *(p++)+= 5 改成 *(++p)+= 5 結果如何呢?
4、鏈表編程題
下面的題目我只寫了第一題,后面的一題沒有繼續下,寫鏈表的題目,我建議畫一張鏈表的連接圖,這樣寫代碼的時候就會特別清晰了。
大家有不懂的,可以盡管問,另一個題目,歡迎留言寫出來,我覺得這樣的題目簡單,但是也比較考驗思維能力。
題目:
鏈表圖形
直接上代碼吧
#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;/*創建鏈表頭*/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推薦閱讀:
專輯|Linux文章匯總
專輯|程序人生
專輯|C語言
我的知識小密圈
總結
以上是生活随笔為你收集整理的据悉,深圳某工程师沦为C语言笔试枪手的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 兄弟j220怎么清零_兄弟打印机MFC_
- 下一篇: 基于matplotlib对iris数据集