重拾C,一天一點點_7


標准庫,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、有一個外地人路過一個小鎮,此時天色已晚,於是他便去投宿。當他來到一個十字路口時,他知道肯定有一條路是通向賓館的,可是路口卻沒有任何標記,只有三個小木牌。第一個木牌上寫着:這條路上有賓館。第二個木牌上寫着:這條路上沒有賓館。第三個木牌上寫着:那兩個木牌有一個寫的是事實,另一個是假的。相信我,我的話不會有錯。假設你是這個投宿的人,按照第三個木牌的話為依據,你覺得你會找到賓館嗎?如果可以,那條路上有賓館哪條路上有賓館?

原文博客地址:http://www.cnblogs.com/lltong/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM