<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          據(jù)悉,深圳某工程師淪為C語(yǔ)言筆試槍手

          共 2360字,需瀏覽 5分鐘

           ·

          2020-12-31 16:42


          事情是這樣的,昨晚晚上,有個(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


          推薦閱讀:
          專輯|Linux文章匯總
          專輯|程序人生
          專輯|C語(yǔ)言
          我的知識(shí)小密圈

          瀏覽 53
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  奇米四区 | 蜜臀久久99精品久久久久久宅男 | 99热亚洲精品 | 欧美成人三级片网站 | 午夜无码蜜桃 |