重拾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
", atof("109.999"));        //109.999000
 7     printf("%f
", atof("0.2350000"));        //0.235000
 8     printf("%f
", atof("       1.2350       5"));        //1.235000
 9     printf("%f
", 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
",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
",i);		//0
	printf("%d
",l);		//0
	printf("%d
",j);		//2130567168无效值 
	printf("%d
",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
", months[12]);		//0
	months[12] = 13;
	printf("%d
", months[12]);		//13
	months[14] = 15;
	months[13] = 14;
	printf("%d
", months[14]);		//15
}

字符数组初始化
    char s[] = “abcd”;
    char s[] = {‘a’, ‘b’, ‘c’, ‘d’};

 char s[] = {"abcd"};

附:

1、有一个人在一个森林里迷路了,他想看一下时间,可是又发现自己没带表。恰好他看到前面有两个小女孩在玩耍,于是他决定过去打听一下。更不幸的是这两个小女孩有一个毛病,姐姐上午说真话,下午就说假话,而妹妹与姐姐恰好相反。但他还是走近去他问她们:“你们谁是姐姐?”胖的说:“我是。”瘦的也说:“我是。”他又问:现在是什么时候?胖的说:“上午。”“不对”,瘦的说:“应该是下午。”这下他迷糊了,到底他们说的话是真是假?

2、有一个外地人路过一个小镇,此时天色已晚,于是他便去投宿。当他来到一个十字路口时,他知道肯定有一条路是通向宾馆的,可是路口却没有任何标记,只有三个小木牌。第一个木牌上写着:这条路上有宾馆。第二个木牌上写着:这条路上没有宾馆。第三个木牌上写着:那两个木牌有一个写的是事实,另一个是假的。相信我,我的话不会有错。假设你是这个投宿的人,按照第三个木牌的话为依据,你觉得你会找到宾馆吗?如果可以,那条路上有宾馆哪条路上有宾馆?

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

原文地址:https://www.cnblogs.com/lltong/p/3381709.html