C語言學習筆記(2)

. C語言中的布爾類型

在C語言中,是沒有布爾類型的,0就是false,非0就是true。

於是,寫習慣了Java/C#的我們自然會很不習慣,這個時候,我們不妨用宏定義來使我們的代碼看起來更舒服一些。

  1. #define BOOL int  
  2. #define TRUE 1  
  3. #define FALSE 0  
  4.  
  5. int main (void)  
  6. {  
  7.     BOOL flag=TRUE;  
  8.     if(flag)  
  9.     {  
  10.         printf("true");  
  11.     }  
  12.     else 
  13.     {  
  14.         printf("false");  
  15.     }  

 

在C99中,長期缺乏布爾類型的問題得到的解決,但是在目前,C99標準還沒有得到很好的推廣。暫且不提。

2. limits.h

習慣了平臺無關的我們,在學習C語言時,必須需要注意他的平臺相關性。其中很典型的例子就是在不同的平臺下,不同的編譯器下,int的取值範圍是不同的。

在C#中,我們可以用Int32.MaxValue來獲得,那麼在C語言中,我們該怎麼獲得呢?

在C中,提供了一個頭文件limits.h,裏面有很多宏定義。

image

那麼我們就很容易得到int類型的取值範圍。

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <limits.h>  
  4.  
  5. int main (void)  
  6. {  
  7.     printf("int的最小值是:%d;最大值是:%d",INT_MIN,INT_MAX);  
  8.     return 0;  

 

 3. 浮點類型

在C語言中,提供了三種浮點類型:分別爲

float:單精度浮點數,

double:雙精度浮點數,

long double:擴展精度浮點數。

在一般要求不嚴格的情況下,float就足夠了,其次是double,long double幾乎不會用到。

在C99中,浮點類型包括兩種,分別爲實浮點類型,就是我們上面提到的。還有複數類型,分別對應爲float_Complex等等。

4. 字符類型

 

 

在C語言中,一般採用的ASCII編碼,而字符類型又分爲有符號型和無符號型。在C語言標準中,對此並無規定,因此是由不同的編譯器自己決定。

因此考慮到可移植性,如果涉及到符號相關,我們不要假設char是有符號還是無符號,而用signed和unsigned來顯式標識。

由於在C語言中,字符實際上是被作爲整數來處理的,因此在C89中,將字符類型和整數類型統稱爲整值類型。

C語言讀入字符不會跳過空白字符。我們可以看一個簡單的例子:

  1. int main (void)  
  2. {  
  3.     char ch;  
  4.     scanf("%c",&ch);  
  5.     printf("%c",ch);  
  6.     return 0;  

我現在鍵入一個換行:

image

他也把換行符讀入,然後打印出來。

那麼我們如何讀入一串字符串呢?

  1. int main (void)  
  2. {  
  3.     char ch='a';  
  4.     int count=0;  
  5.     do 
  6.     {  
  7.         scanf("%c",&ch);  
  8.         count++;  
  9.     }while(ch!='\n');  
  10.     printf("%d",count-1);  

 

當然,我們也可以這樣來寫:

  1. int main (void)  
  2. {  
  3.     char ch='a';  
  4.     int count=0;  
  5.     scanf("%c",&ch);  
  6.     while(ch!='\n')  
  7.     {  
  8.         count++;  
  9.         scanf("%c",&ch);  
  10.     }  
  11.     printf("%d",count);  

 

5. getchar和putchar

在C語言中,爲我們提供了專門輸入和輸出字符的函數,也就是getchar()和putchar().

讓我們看下getchar()和putchar()的定義。

_Check_return_ _CRTIMP int __cdecl getchar(void);

_Check_return_opt_ _CRTIMP int __cdecl putchar(_In_ int _Ch);

我們可以看到,其實他們返回的都是int類型的值。OK,讓我們看看他們都返回什麼。

  1. int main (void)  
  2. {  
  3.     char c;  
  4.     int result;  
  5.     c=getchar();  
  6.     result = putchar(c);  
  7.     printf("\nc:%c;result:%d",c,result);  

image

我們可以看到,他們都是返回其字符的ASCII碼。

那麼,既然C語言爲我們提供了這樣專門的函數,一定說明他在讀取和輸出字符方法比scanf和printf有着特殊的優勢。

A. 由於getchar和putchar函數實現比較簡單,因此較之效率更高。

B. 爲了額外的效率提升,通常getchar和putchar都是作爲宏來實現的。

總之,他們相較之略顯重量的scanf和printf效率更高。

另外,我們還可以用getchar來實現讀取字符的C語言慣用法。

  1. int main (void)  
  2. {  
  3.     while(getchar()!='\n');  
  4.     return 0;  

 

這樣的函數一直讀到換行終止。

另外:

  1. int main (void)  
  2. {  
  3.     char c;  
  4.     while((c=getchar())==' ');  
  5.     switch(c)  
  6.     {  
  7.     case 'a':  
  8.         printf("a");  
  9.         break;  
  10.     case 'q':  
  11.         printf("q");  
  12.         break;  
  13.     default:  
  14.         printf("others");  
  15.         break;  
  16.     }  

 

我們也可以這樣來實現忽略一切空白,當然也可以修改程序使之忽略其他字符。

另外,我們在前文說過,scanf在無法完成徹底模式匹配時,會把剩餘的字符放到緩衝區,供下次讀取。那麼我們來看這樣一段代碼:

  1. int main (void)  
  2. {  
  3.     int i ;  
  4.     char c;  
  5.     scanf("%d",&i);  
  6.     c=getchar();  
  7.     printf("%c",c);  

 

image

由此可知,getchar()也會首先打緩衝區裏去讀取字符。

 

 

本文出自 “kym” 博客,請務必保留此出處http://kymsha.blog.51cto.com/647951/289689

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章