在講類型轉換之前,我們先要理解下C語言中單引號和雙引號的區別。
先講雙引號,雙引號就是字符串,我們要證實我們的想法,我選擇寫一段代碼看看開:
#include <stdio.h>
int main() { printf("hello,world1"); return 0; }
然后我們編譯運行看看輸出什么:
hello,world1
我們的字符串被運行了。我學過Python,前端,我的潛意識認為單引號('')的含義也是代表字符串。讓我們試試
我們再寫一段代碼:
#include <stdio.h>
int main() { printf('1'); return 0; }
然后我編譯運行,看輸出信息:
rgument is of type ‘int’ extern int printf (const char *__restrict __format, ...);
我們發現報錯了。
從這里我們發現單引號和雙引號是有區別的,我們再來寫一段代碼:
#include <stdio.h>
int main() { printf("%d",'1'); return 0; }
然后我編譯運行,看輸出信息:
49
輸出的並不是1,而是49。
我對這里很眼熟,有可能剛學習編程的人不知道這是什么。這個49就是ASCII碼
00110001 | 49 | 31 | 1 |
這條信息的來源源自於:http://www.asciima.com/
自己去查就知道了。
通過我們的實踐告訴我們,雙引號是字符串,單引號是字符,輸出的是ASCII碼。並不是表面看到的那樣。
現在我們理解了這個。
下面我們來看這么一句話,我相信學習過C語言的人肯定接觸過[c-'0']
它到底是什么意思?怎么這么困擾?今天我們來揭開它的真實面紗。
我們還是來實踐,用代碼說話:
#include <stdio.h>
int main() { printf("%d",'3'-'0'); return 0; }
這里都是單引號,我前面講了,單引號輸出對應的ASCII碼,這里還是ASCII碼嗎?
我編譯運行看下輸出結果:
3
是不是有點驚訝。竟然是3。打開ASCII表,我們看到3的位置是51,0的位置是48。51-48=3,很合理。
下面我們開始講解我們的類型轉換,我直接上代碼,不廢話。
#include <stdio.h>
int atoi(char s[]) //定義atoi函數,函數()里面的是char類型的數組
{ int i,n=0; for(i=0;s[i]>='0' && s[i]<='9';i++) n=10*n+(s[i]-'0'); return n; } /* 限定s[i]中的值只能是字符串數字不能是字符串 */
/* 第一次循環的時候:i為0,s[0]='1',n=0; n=10*0+('1'-'0')=1 第二從循環的時候:i為1,s[1]='2',n=1; n=1*10+('2'-'0')=12 第三次循環的時候:i為3,s[2]='3',n=12;n=12*10+('3'-'0')=123 循環三次,輸出最終結果123 */
int main() { printf("%d\n",atoi("123")); //atoi函數調用
return 0;
然后我們編譯運行看看輸出結果:
123
OK,就這樣!