TOP

淺談C的應用與常見error(一)
2015-11-19 23:06:52 】 瀏覽:10252
Tags:

我下面所寫的都是用“.c”后綴的。“.c”后綴是c源文件的后綴,“.cpp”后綴是c++源文件的后綴。c++繼承了 c語言的一些特性,所以有些bug在“.cpp”里是可以通過的。
  1、scanf()你真的了解了么?;
    scanf()是有返回值的,返回值類型是int,這個你知道么?它返回了成功讀入輸入信息的個數。
    那么我們可以利用它來做什么呢?
    非零即真,這句話你一定聽說過,而且不止一次。那么我們看一下下面的代碼。
    int a;
   while (scanf("%d", &a) == 0)
   {
   printf("請輸入合法字符:");
   }
    這樣寫代碼是不是好一點,再輸入的同時判斷了輸入的是否正確。但這會使你進入一個死循環。為什么會這樣呢?
      我們在輸入時,我們的鍵值需要一塊緩沖區在存放鍵值,如果輸入的鍵值不被scanf()接受,那么它會一直在緩沖區中,那么再仔細看一看上面的代碼,你是不是明白了呢。
    解決這個問題并不難,只要將輸入的鍵值接受,他就不會在緩沖區中影響你的程序了。看看下面的代碼,有沒有豁然開朗优乐棋牌app下载,哇,scanf()還可以這么使用!
   int a;
   while (scanf("%d", &a) == 0)
   {
   getchar();
   printf("請輸入合法字符:");
   }
    2、你還在糾結while(),for();
    初學者可能會糾結什么場合用while(),什么場合用for()。
    在我看來,這根本不存不值得我去糾結,我們應該想的是使用哪個可以使程序更簡單,別人更容易看懂。
    while(),for()的本質都是循環,只是形式不一樣而已。
    int i = 0;            int i;
    while (i<10)           for (i=0; i<10; i++)
    {                {
      i++;
    }                }
    上面的代碼當然是for()更簡明一寫,但1、中的例子卻是使用while()。for()比while()在語句要多一些,這是你需要的么?
    根據每個人的代碼風格不同优乐棋牌app下载,不能統一要求使用for()或者while()。建議初學者可以兩個都試一下,感覺他們之間的不同,寫出漂亮的代碼。
  3、switch()你會使用么?
    switch(n)
    {
    case 1:
      break;
    case 2:
      break;
    default:
    }
    你一直這么使用么?
    我們都知道case 后面不加break,會一直執行下面的代碼,直到代碼全不執行完或者遇到break。
    利用這個特性,我們是不是可以做一些其他的事,比如加法,一年有十二個月,我想算出4月6號是今年的第幾天,你想到怎么使用了么?我們看一下下面的代碼。
    switch (month-1)
   {
    case 11: sumMonth += 30;
    case 10: sumMonth += 31;
    case 9: sumMonth += 30;
    case 8: sumMonth += 31;
    case 7: sumMonth += 31;
    case 6: sumMonth += 30;
    case 5: sumMonth += 31;
    case 4: sumMonth += 30;
    case 3: sumMonth += 31;
    case 2:
   if ((i%4==0 && i%100!=0) || i%400==0)
   {
  sumMonth += 29;
   }
   else
    {
   sumMonth += 28;
   }
    case 1: sumMonth += 31;
}
    你看懂了么?只是提供一個思路,將我們思維打開,你會看見另一片天空。
    你在case中定義過變量么?
    case中為什么不能定義變量呢?
   int a;
   switch (a)
  {
  case 1:
  int b;
  break;
  case 2:
  b = 0;
  break;
  }
    你這么任性,編譯器怎么辦!
    那我們為什么不規定case 1定義的變量只能在case 1中使用呢?在6、變量作用域中你將會找到答案。
    當然,我們不應該只局限于switch(),if() else也一樣可以完成多重選擇的任務,不過switch()內置3-999個標簽,使用switch()的程序運行速度可能稍快一些,代碼也更簡潔。
  4、if()的使用
    我們都知道if()用于判斷。那么當你判斷兩個字符相等時,你會怎么寫?
    int a;
   if (a == 5)
    如果是我,我會寫成
    int a;
   if (5 == a)
    功能是一樣的,何必這么麻煩?我們在做一個項目時优乐棋牌app下载,不可能十行代碼調試半個小時,當我們思維在鍵盤上飛舞時,我才體會到一個程序員的快樂。在我們正在體驗這種快樂時,手誤在所難免,如果寫成if(a=5),這個錯誤夠你找兩天的。但是if(5=a),編譯器就可以幫你找到。
    當你想判斷兩個字符串是否相等時,你會不會這樣寫?
    char c_c1[10] = "acdefg";
    char c_c2[10] = "qwerty";
    if (c_c1 == c_c2)或者if (c_c1[10] == c_c2[10])
    總之都是不對的。字符串,數組,指針后面還會有所涉及,這里不做詳談。
    比較兩個字符串我們用到了C函數庫中提供的strcmp()函數,它包含在頭文件中。strcmp()返回了一個int類型的值,-1,0,1。0代表兩個字符串相等,-1,1是由于字符之間的比較(ASCII)決定的。下面我看一個例子。
    char c_ch[10] = "qwertyui"  //最多可以存放9個字符,最后一位是”\0“
    char *p_ch = "adfgf"
    strcmp(c_ch, p_ch);  //strcmp()中的兩個參數是兩個字符串的地址
    strcmp("qwertyui", "adfgf");  //這樣也是可以的,字符串存放的也是首字母的地址,后面會提到。
  5、你知道頭文件的作用么?
  我們寫代碼都習慣把#include 最先寫上,但你知道它的作用么?
  #include :文件包含
  當預處理器發現#include 指令后,就會尋找 <>中的文件名并把這個文件包含到你寫的程序代碼,替換源文件(就是你寫的文件)中的#include。雖然你只寫了一行代碼,但是編譯器卻

請關注公眾號獲取更多資料



首頁 上一頁 1 2 下一頁 尾頁 1/2/2
】【打印繁體】【】【】 【】【】【】 【關閉】 【返回頂部
上一篇C編譯器剖析-匯編代碼生成寄存器.. 下一篇Object-C學習札記 NSString常用方..