標准庫,atof()函數包含在頭文件<stdlib.h>中
/******把字符串s轉換為相應的雙精度浮點數*******/
1 #include <stdio.h> 2 #include <ctype.h> 3 double atof(char s[]); 4 5 main(){ 6 printf("%f\n", atof("109.999")); //109.999000 7 printf("%f\n", atof("0.2350000")); //0.235000 8 printf("%f\n", atof(" 1.2350 5")); //1.235000 9 printf("%f\n", atof("-1.235")); //-1.235000 10 } 11 /******把字符串s轉換為相應的雙精度浮點數*******/ 12 double atof(char s[]){ 13 double val, power; 14 int i, sign; 15 for(i=0; isspace(s[i]); i++){ 16 ; 17 } 18 sign = s[i] == '-' ? -1 : 1; 19 if('+' == s[i] || '-' == s[i]){ 20 i++; 21 } 22 for(val=0.0; isdigit(s[i]); i++){ 23 val = 10.0 * val + (s[i] - '0'); 24 } 25 if('.' == s[i]){ 26 i++; 27 } 28 29 //把小數部分跟整數一樣處理,記錄位數,再除位數得值 30 for(power=1.0; isdigit(s[i]); i++){ 31 val = 10.0 * val + (s[i] - '0'); 32 power *= 10.0; 33 } 34 35 return sign * val / power; 36 }
C語言不允許在一個函數定義其他函數。不像JS,可以這樣。
<script> function test(){ var i = 1, j = 2; function test2(){ i += 2; return i + j; } return test2(); } console.log(test()); //5 </script>
外部變量(全局變量):永久存在。
默認情況下,外部變量與函數具有下列性質:通過同一個名字對外部變量的所有引用(即使這種引用來自於單獨編譯的不同函數)實際上都是引用同一個對象(標准中這一性質稱為外部鏈接)
內部變量(局部變量):函數內有效。
逆波蘭表示法:
(1 - 2) * (4 + 5) 可表示為:1 2 – 4 5 + *
靜態變量:
外部的static聲明通常多用於變量,也可用於聲明函數。
通常情況下,函數是可全局訪問的,但聲明為static類型函數,僅對該函數所在的文件可見,其他文件無法訪問。
static也可聲明局部變量,與普通局部變量不同的是,它的值一直存在。
#include <stdio.h> static int i = 0; main(){ int j; for(j=0; j<10; j++){ i++; } printf("%d\n",i); //10 }
寄存器變量
register變量放在機器的寄存器中,這樣可以使程序更小、執行速度更快。但編譯器可以忽略此選項。
register int x;
register char c;
register聲明只適用於自動變量以及函數的形式參數。
f(register unsigned m, register long n){
register int i;
….
}
實際使用時,底層硬件環境對寄存器變量的使用會有一些限制。每個函數中只有很少的變量可以保存在寄存器中,且只允許某些類型的變量。但是,過量的寄存器聲明並沒有什么害處,因為編譯器可以忽略過量的或不支持的寄存器變量聲明。另外,無論寄存器變量實際上是不是存放在寄存器中,它的地址都是不能訪問的。在不同的機器中,對寄存器變量的數量和類型的具體限制也不同。
初始化:在不進行顯式初始化的情況下,外部變量和靜態變量都被初始化為0,而自動變量和寄存器變量的初值沒有定義(即初值為無用的信息)。
#include <stdio.h> int i; static long l; main(){ int j; register int k; printf("%d\n",i); //0 printf("%d\n",l); //0 printf("%d\n",j); //2130567168無效值 printf("%d\n",k); //4199260無效值 }
全局變量與靜態變量,初始化表達式必須是常量表達式,且只初始化一次。
局部變量與寄存器變量,初始化可以包含在此表達式之前已定義的值,包括函數調用。
定義數組
int months[] = {1,2,3,4,5,6,7,8,9,10,11,12}; //12
當不指定數組長度時,編譯器把花括號初始化表達式的個數作為數組長度。
如果初始化表達式的個數比數組元素少,則對全局變量、靜態變量和局部變量來說,沒有初始化表達式的元素的值為0。反之,則是錯誤的。不能一次將一個初始化表達式指定給多個數組元素。
#include <stdio.h> main(){ int months[15] = {1,2,3,4,5,6,7,8,9,10,11,12}; //int arr[3] = {1,2,3,4}; //error printf("%d\n", months[12]); //0 months[12] = 13; printf("%d\n", months[12]); //13 months[14] = 15; months[13] = 14; printf("%d\n", months[14]); //15 }
字符數組初始化
char s[] = “abcd”;
char s[] = {‘a’, ‘b’, ‘c’, ‘d’};
char s[] = {"abcd"};
附:
1、有一個人在一個森林里迷路了,他想看一下時間,可是又發現自己沒帶表。恰好他看到前面有兩個小女孩在玩耍,於是他決定過去打聽一下。更不幸的是這兩個小女孩有一個毛病,姐姐上午說真話,下午就說假話,而妹妹與姐姐恰好相反。但他還是走近去他問她們:“你們誰是姐姐?”胖的說:“我是。”瘦的也說:“我是。”他又問:現在是什么時候?胖的說:“上午。”“不對”,瘦的說:“應該是下午。”這下他迷糊了,到底他們說的話是真是假?
2、有一個外地人路過一個小鎮,此時天色已晚,於是他便去投宿。當他來到一個十字路口時,他知道肯定有一條路是通向賓館的,可是路口卻沒有任何標記,只有三個小木牌。第一個木牌上寫着:這條路上有賓館。第二個木牌上寫着:這條路上沒有賓館。第三個木牌上寫着:那兩個木牌有一個寫的是事實,另一個是假的。相信我,我的話不會有錯。假設你是這個投宿的人,按照第三個木牌的話為依據,你覺得你會找到賓館嗎?如果可以,那條路上有賓館哪條路上有賓館?