有時候,寫類似如下的**:
會一直輸出,我們的本意是一次輸入完成,再進行一次輸入。
原因是scanf是從緩衝區讀取輸入進行賦值的,上次的輸入資料還在緩衝區,就導致程式一直在判斷上次的快取資料。
處理方法就是在scanf讀取緩衝區的資料之後,利用getchar函式把緩衝區的資料取出來。
c語言中有兩種整數運算:
其中無符號運算不存在「溢位問題」,因為無符號運算是以2地n次方為模;
如果算術運算子地乙個運算元是有符號整數,另乙個是無符號整數,有符號會自動轉換成無符號整數來進行運算,所以也儲存在「溢位問題」;
但是兩個有符號運算元進行運算的時候就可能溢位,而且溢位地結果是未定義的,解決方法就是將有符號數強制轉換為無符號數,或者宣告為long
來保證資料的範圍;
c語言中有四個運算子存在求值順序,分別是:
其中&&
和||
都是先對左側的運算元求值,在有需要的時候才對右側的運算元求值
a?b:c
是先求a的值,根據結果來去選擇b或者是c
,
逗號運算子是先對左側的運算元求值,返回的是最右側的運算元求值結果
包裹函式就是使用者自己實現的函式,函式中包裹了原函式的操作以及對原函式出錯的處理,相當於在原函式之上的又一層封裝。
看起來包裹函式就是對呼叫底層函式出錯的處理,測試原函式返回值,但實際上這種看似多餘的操作在多執行緒的時候會節省儲存出錯標誌的變數。因為包裹函式呼叫完畢之後會銷毀記憶體空間。
呼叫了 wait() 函式的父程序會馬上阻塞自己, 由 wait()函式自動分析是否當前程序的某乙個子程序已經退出, 如果找到了這樣乙個已經變成了僵程序的子程序, wait()函式就會收集這個子程序的資訊, 將他徹底終止並返回子程序結束狀態值, 如果沒有找到這樣的乙個子程序, wait()函式就會一直阻塞在這裡, 直到出現乙個變成僵程序的子程序出現為止, 但如果父程序還未呼叫 wait()函式就終止了, 此時子程序就將被 init 程序收管, 他將控制子程序退出後必須的清除工作。
fork建立的子程序只是與父程序共用**段,自己會開闢新的資料段。
父程序fork建立子程序之後,子程序相當於複製了父程序的所有**,但是子程序會從fork開始執行。因為程序是程式的動態執行,當父程序執行到fork的時候,前面的已經執行完畢,所以能夠複製過去的只有**(靜態?)和父程序當前的執行狀態了,子程序建立之後會以父程序的狀態進行執行。
fork之後,子程序是複製父程序的記憶體大小、命名空間、框架,而不是同乙個空間,所以裡面的資料可能是不一樣的。
子程序和父程序的執行狀況與cpu的執行狀態以及程序的排程方式有關,所以父子程序的先後執行順序不一定(平等競爭)。
父程序建立子程序之後,子程序就是乙個單獨的程序了,和父程序一同競爭cpu的使用資源。
另外對於gdb中涉及到子程序的建立,可以設定gdb追蹤模式來專門追蹤子程序,也可以是gdb繼續除錯當前程序。
預設是繼續執行子程序的,但是當在gdb中持續除錯的時候,遇到fork之後可能出現子程序執行的現象,這是因為父程序還在除錯中,子程序不受gdb的影響,先執行完畢了。同理,設定只追蹤子程序的時候,父程序一般會在子程序還在gdb的時候就執行完畢。
vfork建立的子程序是與父程序共享資料的,子程序上的記憶體空間和父程序共用,這樣帶來的影響就是,當變數在子程序中改變是,變數在父程序中的值也會隨之改變!。
每日一題 1
題目詳情 peter喜歡玩數字遊戲,但數獨這樣的遊戲對他來說太簡單了,於是他準備玩乙個難的遊戲。遊戲規則是在乙個n n的 裡填數,規則 對於每個輸入的n,從左上角開始,總是以對角線為起點,先橫著填,再豎著填。這裡給了一些樣例,請在樣例中找到規律並把這個n n的 列印出來吧。輸入描述 多組測試資料 資...
每日一題2018 3 21
leetcode 2 模擬十進位制運算考察單鏈表基本操作。題無難點,個人基礎需要提高。definition for singly linked list.struct listnode class solution while p while q if shi val s next null ret...
每日一題2018 3 22
leetcode 03 最長不重複子串 第一反應就是動態規劃。看到了網上的方法一。直接把問題簡化為找兩個重複字元間的最長距離,太巧妙了!class solution if i idx max locs s i i return max ling老師的方法二 仍舊轉化為動態規劃,但是為節省空間不再開個...