04 2010 档案
摘要:1. Javascript的数值类型 《Javascript语言精粹》中有这样一句话:Javascript只有单一的数字类型。 在我看来,这句话说的并不准确,应该说,Javascript在声明时,只有单一的数据类型。或者说,Javascript的所有数值类型都被存储成同一种格式,就是64位的浮点数类型。 这样说比较准确。 这样无论把i换成整数还是浮点数,都会得到Number的结果。但是我说...
阅读全文
摘要:1. 连接器 C语言有个思想是分别编译,也就是把一个C语言的项目分成若干个源程序,让他们在不同的时候单独进行编译,然后在恰当的时候整合到一起。这个整合的过程就是由连接器完成的。 大多数时候,连接器和编译器都是分开的,连接器本身并不懂得太多C语言的语法规则。因为他一般不与C直接接触,我们想想之前说过C语言的编译运行过程,编译器的责任其实就是将C语言翻译成连接器能够理解的形式。 连接器把由编译器...
阅读全文
摘要:在C语言中,经常会出现一些复杂的类型声明。而大多数都是涉及到指针的类型。 那么就在这一节来集中认识一下。 首先,我们先来了解*,()和[]的组合。在看实际例子前,先来看一个重要的规则: 在做选择时,始终使[]和()的优先级大于*。举个简单的例子: int *arr[10]。由于[]的优先级大于*。也就代表,首先这是一个含有10个元素数组,那么数组内的内容是什么呢?是int *arr。去掉类...
阅读全文
摘要:编译器中负责将程序分解成一个一个token的部分,就是词法分析器。 token:程序的最基本组成单元,是程序表义的基本单元。一个token,无论出现在哪里,都应该表示同样的意思,同样的语义。 在C语言编译器进行词法分析时,会采用“贪心法”的处理策略。 意思就是说,每一个token都会包含尽可能多的字符,具体地说,编译器从左到右一个字符一个字符地杜甫,如果该字符可能组成...
阅读全文
摘要:1. 位域 我们来看一个表示日期的结构体: 但是我们可以发现,其实year最大也不会超过四位数,month也就是12,而day最大也就是31。但是我们在上述的结构体中,却为其分配了4*3=12字节的内存,是不是很浪费呢?C语言为了解决这个问题,提出了一个概念,叫位域。看段代码:这个的意思是,我为结构体中的每一个字段分配指定的位数,比如,我为year分配了7位。这样就有效地节省了内存。网上有着有...
阅读全文
摘要:1. 动态内存分配 先来介绍三个动态内存分配的函数:malloc,calloc和realloc。说来惭愧,以前只知道malloc。现在来看下他们的区别: malloc:最常用的分配内存块,但是不对内存进行初始化。 calloc:分配内存块,但是对内存块进行清零操作,这就造成此函数的效率要比malloc要低。 realloc:调整(增加或者减少)之前分配内存块的大小。 由于上面的函数只是开...
阅读全文
摘要:1. 结构体声明学习C#/Java的我们,结构体相信都非常熟悉了。简单先来介绍下语法,声明一个结构体:当然,我们也可以在声明时直接初始化:但是我们在这里可以发现一点,声明的结构体是不能重用的,也就是说,必须要在结构体后一次性地把所有需要用到的结构体变量全部初始化,于是,我们更多的是这么做。如果你写习惯了Person person1这样的代码而对在结构体名字前跟着struct而感到不爽,那你也可以这...
阅读全文
摘要:1. 条件编译 条件编译是指预处理根据测试的结果来包含或排除程序的片段。 2. #if和#endif 也不多说,举个例子就懂了。 其实效果就是类似于这样的代码:不同的是:预处理命令是由预处理器来处理。#if指令会测试DEBUG的值,如果DEBUG的值是0,那么这个printf就不会保存在目标程序中占用空间,也不会消耗程序的运行时时间。因此,我们在测试时可以将这段代码保存到最终代码中。3. ...
阅读全文
摘要:1. 预处理指令 在第一篇文章中,我们就提到了预处理器的概念。预处理器就是用来处理预处理指令。预处理指令包含以下三种: A. 宏定义 #define B. 文件包含 #include C. 条件编译 #if #ifdef等等。 2. 简单的宏定义 在之前我们就广泛地运用了宏定义,在此不在赘述。 3. 带参数的宏定义 带参数的宏定义,也称为函数式宏。 举个简单的例子: ...
阅读全文
摘要:在这一节,我想主要来介绍一下C语言操作字符串的常用函数。 C语言的字符串函数的原型都驻留在<string.h>头文件中,因此我们在处理字符串时,需要引入这个头文件。 但是,我不希望只是单纯地介绍每个函数的用法,如果那样,看API就可以了,我希望在介绍每个函数时都自己来实现一次。 1. strcpy函数 string copy,我们先来看一下该函数的用法。 在上段代码中,我们注...
阅读全文
摘要:一切都静下来了,安顿下来了,该是好好补补基础的时候了,从C语言开始。C语言学习笔记(1)C语言学习笔记(2)C语言学习笔记(3)C语言学习笔记(4)C语言学习笔记(5)C语言学习笔记(6)C语言学习笔记(7)C语言学习笔记(8)未完持续,大家多多提意见。
阅读全文
摘要:1. 字符串入门 字符串也称字符串字面量,是用一对双引号括起来的字符序列。 我们也许经常会遇到字符串特别长的情况,在C#中,我们一般会用@符号来表示。 但是在C中,我们会这样来写:还记得我曾经讲的最多的一句话就是,把字符串当做字符数组来玩。其实在本质上,C语言就是把字符串作为字符数组来处理,当C语言编译器遇到长度为N的字符串时,它会为字符串字面量分配长度为N+1的内存空间。之所以为N+1,是...
阅读全文
摘要:1. 指针和数组 这个在最初学习C语言时就学过了,在此只是简单提下。看一段代码: 很简单的一段代码,就是通过指针来访问数组元素,在此只提一点,就是&a[SIZE],虽然a[SIZE]不存在,数组的最后一个元素时a[SIZE-1],但是C编译器不会对下标进行越界检查,也就是说a[SIZE]一样可以访问,所以我们可以用这样的方式来终止for循环。另外,面对指针访问数组还是下标访问数组,都是...
阅读全文
摘要:1. 指针的来源 在当代,大多数的现代计算机都会把内存分割成字节,每个字节都有着其唯一的地址。可执行程序由代码和数据两部分构成,而程序中的每个变量都占有着一个或多个字节,也就是说,每个变量都有着自己的地址。而这个就是指针的来源。 其实每个地址就是一个数,但是我们却不能用数来表示地址,存储地址,我们需要用指针变量。例如int *p = i,我们就可以说p是指针变量,存储着变量i的地址。 那么我...
阅读全文
摘要:1. 数组作为函数参数 函数是我们学习程序设计语言最基本的东西了,我在此不再赘述。只讨论一种特殊情况,就是数组作为函数的参数传递。 我们都知道,其实在传递数组的时候,实际上是传递了数组首元素的指针。明确了这一点之后,我们就可以思考下面的问题。 既然他只是传递了数组首元素的指针,那么他必然无法知道整个数组的大小,因此,我们如果希望在函数中用到数组的长度,必须要进行显式传递。 那么既然,函数无...
阅读全文
摘要:1. 数组大小 我相信,在C#/Java中,更多的人愿意用List<T>来取代数组,一方面是List提供了较多的方法,另一方面也无需我们去指定数组的大小。 那么在C语言中,我们既然需要必须指定数组的大小,而一般来讲,很多数组大小事我们无法确定并且经常会发生变化的,那么我们最好的方式就是用宏定义来限定数组的大小。 如果包含多个数组的话,用宏就很难记忆,那么我们就可以利用sizeof...
阅读全文