. C語言中的布爾類型
在C語言中,是沒有布爾類型的,0就是false,非0就是true。
於是,寫習慣了Java/C#的我們自然會很不習慣,這個時候,我們不妨用宏定義來使我們的代碼看起來更舒服一些。
- #define BOOL int
- #define TRUE 1
- #define FALSE 0
- int main (void)
- {
- BOOL flag=TRUE;
- if(flag)
- {
- printf("true");
- }
- else
- {
- printf("false");
- }
- }
在C99中,長期缺乏布爾類型的問題得到的解決,但是在目前,C99標準還沒有得到很好的推廣。暫且不提。
2. limits.h
習慣了平臺無關的我們,在學習C語言時,必須需要注意他的平臺相關性。其中很典型的例子就是在不同的平臺下,不同的編譯器下,int的取值範圍是不同的。
在C#中,我們可以用Int32.MaxValue來獲得,那麼在C語言中,我們該怎麼獲得呢?
在C中,提供了一個頭文件limits.h,裏面有很多宏定義。
那麼我們就很容易得到int類型的取值範圍。
- #include <stdio.h>
- #include <stdlib.h>
- #include <limits.h>
- int main (void)
- {
- printf("int的最小值是:%d;最大值是:%d",INT_MIN,INT_MAX);
- 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語言讀入字符不會跳過空白字符。我們可以看一個簡單的例子:
- int main (void)
- {
- char ch;
- scanf("%c",&ch);
- printf("%c",ch);
- return 0;
- }
我現在鍵入一個換行:
他也把換行符讀入,然後打印出來。
那麼我們如何讀入一串字符串呢?
- int main (void)
- {
- char ch='a';
- int count=0;
- do
- {
- scanf("%c",&ch);
- count++;
- }while(ch!='\n');
- printf("%d",count-1);
- }
當然,我們也可以這樣來寫:
- int main (void)
- {
- char ch='a';
- int count=0;
- scanf("%c",&ch);
- while(ch!='\n')
- {
- count++;
- scanf("%c",&ch);
- }
- 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,讓我們看看他們都返回什麼。
- int main (void)
- {
- char c;
- int result;
- c=getchar();
- result = putchar(c);
- printf("\nc:%c;result:%d",c,result);
- }
我們可以看到,他們都是返回其字符的ASCII碼。
那麼,既然C語言爲我們提供了這樣專門的函數,一定說明他在讀取和輸出字符方法比scanf和printf有着特殊的優勢。
A. 由於getchar和putchar函數實現比較簡單,因此較之效率更高。
B. 爲了額外的效率提升,通常getchar和putchar都是作爲宏來實現的。
總之,他們相較之略顯重量的scanf和printf效率更高。
另外,我們還可以用getchar來實現讀取字符的C語言慣用法。
- int main (void)
- {
- while(getchar()!='\n');
- return 0;
- }
這樣的函數一直讀到換行終止。
另外:
- int main (void)
- {
- char c;
- while((c=getchar())==' ');
- switch(c)
- {
- case 'a':
- printf("a");
- break;
- case 'q':
- printf("q");
- break;
- default:
- printf("others");
- break;
- }
- }
我們也可以這樣來實現忽略一切空白,當然也可以修改程序使之忽略其他字符。
另外,我們在前文說過,scanf在無法完成徹底模式匹配時,會把剩餘的字符放到緩衝區,供下次讀取。那麼我們來看這樣一段代碼:
- int main (void)
- {
- int i ;
- char c;
- scanf("%d",&i);
- c=getchar();
- printf("%c",c);
- }
由此可知,getchar()也會首先打緩衝區裏去讀取字符。
本文出自 “kym” 博客,請務必保留此出處http://kymsha.blog.51cto.com/647951/289689