讀書筆記之:C程式設計-現代方法

來源:互聯網
上載者:User
《C程式設計-現代方法》這本C語言書是一本不錯的C語言的書。其中的講解挺有條理,並且每章後面的釋疑部分真的解答了我的很多疑問。

第2章 C語言基本概念
1. 在某些C語言的書中,main函數的結尾使用的是exit(0),而不是return 0,二者是否一樣?
    當出現在main函數中時,這兩種語句是完全等價的:二者都終止程式執行,並且向作業系統返回0值.
2. float類型的名字是由何而來的?
   float是floating-point的縮寫形式.有些語言中稱為real類型

第3章 格式化輸入/輸出
1. 轉換說明%i也可以用於讀寫整數,%i和%d之間的區別?
   在printf格式串中使用時,二者沒有區別.但是,在scanf格式串中%d只能與十進位形式的整數相匹配,而%i則可以匹配八進位,十進位和十六進位.
2.printf中顯示%的話可以使用%%
3. 如果v有副作用,那麼v+=e和v=v+e是不等價的。
   如:
   a[i++]+=2與a[i++]=a[i++]+2
4. C語言從Ken Thompson早期的B語言中繼承了++和--操作。Thompson是從BCPL語言進行改進創造了B語言,而他建立++操作符因為在B語言的編譯器中++i比i=i+1可以產生更簡潔的翻譯。

第6章 迴圈
1. 哪個無限迴圈格式更可取,while(1)還是for(;;)?
   C程式員傳統上喜歡for(;;)的高效性,因為早期的編譯器經常強製程序在每次執行while迴圈體時測試條件1.但是對現代編譯器來說,在效能上兩種無限迴圈應該沒有差別.
2. 聽說程式員應該永不使用continue語句,這種說法對嗎?
   continue語句確實很少使用.儘管如此,continue語句有時候還是非常方便的.
第7章 基本類型
1. 浮點常量為什麼儲存成double格式而不是float格式?
   由於曆史的原因,C語言更傾向於使用double類型,float類型則被看成"二等公民".
2. 為什麼使用%lf讀取double類型的值,而用%f進行顯示呢?
   這是一個十分難回答的問題.首先,注意,scanf函數和prinf函數都是不同尋常的函數,因為它們都沒有將函數的參數限制為固定數量.scanf函數和printf函數有可變長度的參數列表.當調用帶有可變長度參數列表的函數時,編譯器會安排float參數自動轉換成double類型,其結果是printf函數無法區分float類型和double類型的參數.這解釋了在printf函數調用中為何可以用%f既表示float類型又表示double類型的參數.
   另一方面,scanf函數是通過指標指向變數的.%f告訴scanf函數在所傳地址位置上儲存一個float類型的值,而%lf告訴scanf函數在該地址上儲存一個double類型值.這裡float和double的區別是非常重要的.如果給出了錯誤的轉換說明,那麼scanf函數將可能儲存錯誤的位元組數量(沒有提到的是,float類型的位元模式可能不同於double類型的位元模式)

第8章 數組
1. 下面的程式有可能導致無限迴圈.
  int a[10],i;
  for(i=0;i<=10;i++)
     a[i]=0;
2. 這個數組的初始化合法嗎?
   int a[]={4,9,1,8,[0]=5,7};
  合法.工作原理:編譯器在處理初始化式列表時,會記錄下一個待初始化的數組元素的位置.正常情況下,下一個元素是剛剛被初始化的元素後面那個.但是當列表中出現初始化式時,下一個元素會被強製為指示符對應的元素,即使該元素已經被初始化了.
  該初始化的效果類似:int a[]={5,7,1,8};
  數組長度是4
3. 將一個數組複製到另一個數組中的方法?
  (1) for迴圈的方式
      for(i=0;i<N;i++)
         a[i]=b[i];
  (2) 利用<string.h>頭的函數memcpy.該函數是一個底層函數,它把位元組從一個地方簡單的複製到另一個地方.為了把數組b複製到數組a中,使用函數memcpy的格式如下:
      memcpy(a,b,sizeof(a));
4.在函數調用f(a,b)中,編譯器如何知道逗號是標點符號還是運算子號呢?
   函數調用中的實際參數不能是任意的運算式,而必須是"賦值運算式".在賦值運算式中,不能用逗號作為運算子,除非逗號是在圓括弧中.換句話說,在函數調用f(a,
   b)中,逗號是標點符號;而在f((a,b))中,逗號是運算子.

5. 如果幾個函數具有相同的傳回型別,能否把他們的聲明合并?例如void print_pun(void),print_count(int n);合法嗎?
   合法的.事實上,C語言甚至允許把函式宣告和變數聲明合并在一起:
   double x,y,average(double a,double b);
6. 為什麼可以留著數組中第一維的參數不進行說明,但是其他維數必須說明呢?
   首先,需要知道C語言是如何傳遞數組的.在把數組傳遞給函數時,是把指向數組第一個元素的指標給了函數.
   其次,需要知道取下標運算子是如何工作的.C語言是按照行主序儲存數組的,如果要計算下一個元素的指標,必須知道一個元素的大小,所以必須給出其他維的大小,這樣才能知道一行的大小.
7. 間接遞迴:f1調用f2,f2調用f1,這其中涉及到一個地方:提前進行函數的聲明.

第10章 程式結構
1. 局部變數
  特性:(1)自動儲存期限:局部變數的儲存單元是在包含該變數的函數被調用時自動分配的,函數返回時收回分配,所以稱這種變數具有自動的儲存期限.
       (2) 塊範圍
  靜態局部變數:
   靜態儲存期限的變數擁有永久的儲存單元,在整個程式執行期間都會保留變數的值.即在程式執行期間它所佔據的記憶體單元是不變的.
   但是它是塊範圍,即它相對於其他函數是隱藏的,但是它會為將來同一個函數的再調用保留這些資料.
  形式參數:
  形式參數擁有和局部變數一樣的性質,即自動儲存期限和塊範圍.事實上,形式參數和局部變數的唯一真正的區別是,在每次函數調用時對形式參數自動進行初始化.
2. 外部變數(全域變數)
  特性:(1)靜態儲存期限:
       (2)檔案範圍:從變數被聲明的點開始一直到所在的檔案的末尾 
3. 具有靜態儲存期限的局部變數會對遞迴函式產生什麼影響?
  當函數是遞迴函式時,每次調用它都會產生其自動變數的新副本.靜態變數就不會發生這種情況,相反,所有的遞迴函式都共用一個靜態變數.

第11章 指標
1. const int *p;
   int const *p;
   int* const p;
   前兩個是一樣的,都是不允許修改p所指向的值.第3個是指標p是不允許改變的

第13章 字串
1. 用printf函數和puts函數寫字串
   printf函數會逐個寫字串中的字元,直到遇到Null 字元才停止.(如果Null 字元丟失,printf函數會越過字串的末尾繼續寫,知道最終在記憶體的某個地方找到Null 字元為止).
   ======這兒可以進行一下實驗,手動改記憶體中的資料,然後....
2. 用scanf函數和gets函數讀字串
  (1)gets函數不會在開始讀字串之前跳過空白字元(scanf函數會跳過,scanf讀入的字串永遠不會包含空白字元)
  (2)gets函數會持續讀入直到找到分行符號才停止(scanf函數會在任意空白字元處停止).此外,gets函數會忽略掉分行符號,不會把它儲存到數組中,用Null 字元代替分行符號.
3. 字串函數庫
  strcpy,strncpy,strlen,strcat,strcmp
4. 為什麼不把字串字面量稱為"字串常量"?
  因為他們並不一定是常量.由於字串字面量是通過指標訪問的,所以沒有辦法避免程式修改字串字面量中的字元.
5.一些編譯器試圖通過只為相同的字串字面量儲存一份副本來節約記憶體.
   char *p="abc",*q="abc";
   編譯器可能只儲存"abc"一次,修改會使程式出現問題
第14章 前置處理器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.