<?xml version="1.0" encoding="utf-8"?><rss version="2.0">
<channel>
<title><![CDATA[编程之路]]></title>
<link>http://blog.pfan.cn/colormoon</link>
<description>编程爱好者博客</description>
<language>zh-cn</language>
			<item>
		<title><![CDATA[main（）与main（int&nbsp;argc,char&nbsp;*argv[]）的区别]]></title>
		<link>http://blog.pfan.cn/colormoon/22364.html</link>
		<description><![CDATA[有些exe可以带参数运行，比如 ping localhost -t 这里localhost，-t就是参数， main(int argc, char *argv[])就是为了让程序里面能使用参数，argc是argument count的缩写，表示参数的个数，argv是argument value的缩写，表示参数的值， 需要注意的是，exe程序的完整文件名也算在参数里面，所以ping localhost -t的argc是3。 需要在程序里面使用这些参数的话，可以模仿下面的代码： int main(int argc, char *argv[]) { int i = 0; printf("argc: %d\n", argc); for(i = 0; i &lt; argc; i++) { printf("Arg %d : %s\n", i + 1, argv[i]); } return 0; }]]></description>
		<author><![CDATA[colormoon]]></author>
		<pubDate>2007-01-08 17:04:00</pubDate>
		</item>
				<item>
		<title><![CDATA[SQL基本语句]]></title>
		<link>http://blog.pfan.cn/colormoon/21522.html</link>
		<description><![CDATA[掌握SQL四条最基本的数据操作语句：Insert，Select，Update和Delete。　　 练掌握SQL是数据库用户的宝贵财富。在本文中，我们将引导你掌握四条最基本的数据操作语句—SQL的核心功能—来依次介绍比较操作符、选择断言以及三值逻辑。当你完成这些学习后，显然你已经开始算是精通SQL了。　　在我们开始之前，先使用CREATE TABLE语句来创建一个表（如图1所示）。DDL语句对数据库对象如表、列和视进行定义。它们并不对表中的行进行处理，这是因为DDL语句并不处理数据库中实际的数据。这些工作由另一类SQL语句—数据操作语言（DML）语句进行处理。　　SQL中有四种基本的DML操作：INSERT，SELECT，UPDATE和DELETE。由于这是大多数SQL用户经常用到的，我们有必要在此对它们进行一一说明。在图1中我们给出了一个名为EMPLOYEES的表。其中的每一行对应一个特定的雇员记录。请熟悉这张表，我们在后面的例子中将要用到它。　　INSERT语句　　用户可以用INSERT语句将一行记录插入到指定的一个表中。例如，要将雇员John Smith的记录插入到本例的表中，可以使用如下语句：　　INSERT INTO EMPLOYEES VALUES　　 ('Smith','John','1980-06-10',　　 'Los Angles',16,45000);　　通过这样的INSERT语句，系统将试着将这些值填入到相应的列中。这些列按照我们创建表时定义的顺序排列。在本例中，第一个值“Smith”将填到第一个列LAST_NAME中；第二个值“John”将填到第二列FIRST_NAME中……以此类推。　　我们说过系统会“试着”将值填入，除了执行规则之外它还要进行类型检查。如果类型不符（如将一个字符串填入到类型为数字的列中），系统将拒绝这一次操作并返回一个错误信息。　　如果SQL拒绝了你所填入的一列值，语句中其他各列的值也不会填入。这是因为SQL提供对事务的支持。一次事务将数据库从一种一致性转移到另一种一致性。如果事务的某一部分失败，则整个事务都会失败，系统将会被恢复（或称之为回退）到此事务之前的状态。　　 回到原来的INSERT的例子，请注意所有的整形十进制数都不需要用单引号引起来，而字符串和日期类型的值都要用单引号来区别。为了增加可读性而在数字间插入逗号将]]></description>
		<author><![CDATA[colormoon]]></author>
		<pubDate>2006-12-12 21:59:00</pubDate>
		</item>
				<item>
		<title><![CDATA[SQL的基本操作（表的相关操作）]]></title>
		<link>http://blog.pfan.cn/colormoon/21521.html</link>
		<description><![CDATA[SQL的基本操作（3.表的相关操作） 1.创建表(1)用Create Table 命令创建表语法：Create Table tabl_name({}column_name As computed_column_expression}}[,...n])[On {fiegroup | Default}][Textimage_On {fiegroup | Default}]例子：打开cust数据库，创建一个表，该表包含了学生的有关信息，即有学号、姓名、性别、出生日期、籍贯、联系电话、住址和备注信息。Use custCreate Table students(number int not null,name varchar(10) not null,sex char(2) null,birthday datetime null,hometown varchar(30) null,telphone_no varchar(12) null,address varchar(30) null,others varchar(50) null)在这个表中number表示学生代号，数据类型为int，不允许为空；name表示学生姓名，数据类型为varchar，长度为10，不允许为空；sex表示学生的性别，数据类型为char，长度为2，允许为空；birthday表示学生的出生日期，数据类型为datetime，允许为空；hometown表示学生的籍贯，数据类型为varchar，长度为30，允许为空；telephone_no表示学生的联系电脑，数据类型为varchar，长度为12，允许为空；address表示学生的住址，数据类型为varchar，长度为30，允许为空；others表示学生的备注信息，长度为50，允许为空。2.修改表的结构(1)使用T-SQL语句增加和删除一个新列语法：Alter Table table{ADO{[]|colun_name As computed_column_expression|[]}[,...n]|Drop{Column column}[,...n]}例子：打开cust数据库，修改其中的表students的结构，增加一个新字段，字段名为ying，数据类型是varchar，长度是10，没有默认值，充许为空。Use custAlter Table students]]></description>
		<author><![CDATA[colormoon]]></author>
		<pubDate>2006-12-12 21:58:00</pubDate>
		</item>
				<item>
		<title><![CDATA[SQL的基本操作]]></title>
		<link>http://blog.pfan.cn/colormoon/21520.html</link>
		<description><![CDATA[&nbsp;
&nbsp;





目录：1.数据类型
2.数据库的相关操作3.表的相关操作
=======================================　1.数据类型
　　数据类弄是数据的一种属性，表示数据所表示信息的类型。任何一种计算机语言都定义了自己的数据类型。当然，不同的程序语言都具有不同的特点，所定义的数据类型的各类和名称都或多或少有些不同。SQL Server 提供了 25 种数据类型:
　　·Binary [(n)]
　　·Varbinary [(n)]
　　·Char [(n)]
　　·Varchar[(n)]
　　·Nchar[(n)]
　　·Nvarchar[(n)]
　　·Datetime
　　·Smalldatetime
　　·Decimal[(p[，s])]
　　·Numeric[(p[，s])]
　　·Float[(n)]
　　·Real
　　·Int
　　·Smallint
　　·Tinyint
　　·Money
　　·Smallmoney
　　·Bit
　　·Cursor
　　·Sysname
　　·Timestamp
　　·Uniqueidentifier
　　·Text
　　·Image
　　·Ntext
　　(1)二进制数据类型
　　二进制数据包括 Binary、Varbinary 和 Image.
　　Binary 数据类型既可以是固定长度的(Binary)，也可以是变长度的。
　　Binary[(n)] 是 n 位固定的二进制数据。其中，n 的取值范围是从 1 到 8000。其存储窨的大小是 n + 4 个字节。
　　Varbinary[(n)] 是 n 位变长度的二进制数据。其中，n 的取值范围是从 1 到 8000。其存储窨的大小是 n + 4个字节，不是 n 个字节。
　　在 Image 数据类型中存储的数据是以位字符串存储的，不是由 SQL Server 解释的，必须由应用程序来解释。例如，应用程序可以使用 BMP、TIEF、GIF 和 JPEG 格式把数据存储在 Image 数据类型中。
　　(2)字符数据类型
　　字符数据的类型包括 Char，Varchar 和 Text。
　　字符数据是由任何字母、符号和]]></description>
		<author><![CDATA[colormoon]]></author>
		<pubDate>2006-12-12 21:53:00</pubDate>
		</item>
				<item>
		<title><![CDATA[四色定理源程序]]></title>
		<link>http://blog.pfan.cn/colormoon/21302.html</link>
		<description><![CDATA[#include&lt;stdio.h&gt; #define N 10 void output(int color[])/*输出一种着色方案*/ { int i ; for ( i = 0 ; i &lt; N ; i++ ) printf( "%4d" , color[i] ) ; printf( "\n" ) ; } int back( int *ip ,int color[] ) /*回溯*/ { int c = 4 ; while ( c == 4 ) { if ( *ip &lt;= 0 ) return 0 ; --(*ip) ; c = color[*ip]; color[*ip] = -1 ; } return c ; } /*检查区域i,对c种颜色的可用性*/ int colorok( int i , int c , int adj[][N] , int color[ ] ) { int j ; for ( j = 0 ; j &lt; i ; j++ ) if (adj[i][j] != 0 &amp;&amp; color[j] == c) return 0 ; return 1 ; } /*为区域i选一种可着的颜色*/ int select( int i ,int c ,int adj[][N] , int color[ ] ) { int k ; for ( k = c ; k &lt;= 4 ; k++ ) if ( colorok(i,k,adj,color) ) return k ; return 0 ; } int coloring( int adj[][N] ) /*寻找各种着色方案*/ { int color[N] , i , c , cnt ; for ( i = 0 ; i &lt; N ; i++ ) color[i] = -1 ; i = c = 0 ; cnt = 0 ; while ( 1 ) { if ( ( c =select (i,c+1,adj,color) ) == 0 ){ c = back( &amp;i , color) ; if ( c == 0) return cnt ; } else { color[i]=c; i++ ; if ( i == N ) { output(color) ; ++c]]></description>
		<author><![CDATA[colormoon]]></author>
		<pubDate>2006-12-05 21:30:00</pubDate>
		</item>
				<item>
		<title><![CDATA[逗号表达式]]></title>
		<link>http://blog.pfan.cn/colormoon/21229.html</link>
		<description><![CDATA[逗号表达式的形式如下：　　表达式1，表达式2，表达式3，...... ，表达式n
逗号表达式的要领：(1) 逗号表达式的运算过程为：从左往右逐个计算表达式。(2) 逗号表达式作为一个整体，它的值为最后一个表达式（也即表达式n）的值。(3) 逗号运算符的优先级别在所有运算符中最低。
例题1:若已定义x和y为double类型，则表达式：x=1,y=x+3/2的值是　　　A) 1 　B) 2　C) 2.0　D) 2.5
　　分析：该表达式是一个逗号表达式，所以先运算x=1，结果变量x中的值为1.0，然后运算y=x+3/2，其结果是变量y中的值为2.0(这个运算过程可参阅本专题的“整数除法的注意事项”)，注意此时表达式y=x+3/2的值即等于变量y的值为2.0。最后，整个逗号表达式的值应该等于最后一个表达式的值2.0，所以，正确答案是C)。　　注：该题曾在1998年4月和2000年9月的二级C考试中两次出现过。
例题2：若t为double类型，表达式t=1,t+5,t++的值是　　　A) 1　B) 6.0　C) 2.0　D) 1.0
　　分析：该题的表达式也是一逗号表达式，运算过程同例题1。需要注意的是，其中的第二个表达式(t+5)对整个表达式的运算结果不产生任何影响，因为它没有改变变量x的值(x的值仍为1.0)，最后一个表达式(t++)的值为变量x进行自增运算前的值1.0，所以整个表达式的值也为1.0。　　注：这是1998年4月二级C考试中的一道选择题。
例题3：有如下函数调用语句　func(rec1,rec2+rec3,(rec4,rec5));　该函数调用语句中，含有的实参个数是　　A）3 　B)4　C)5　D)有语法错误
　　分析：C语言规定，函数调用时实参与实参之间是用逗号隔开的，所以，本题的函数调用语句中包含3个实参，其中第一个实参是rec1,第二个实参是rec2+rec3,第三个实参是(rec4,rec5)，这里的第三个实参就是一个逗号表达式，根据逗号表达式的运算规则，第三个实参的值应该等于rec5的值。　　注：这是2000年9月二级C考试中的一道选择题。
例题4：有如下函数调用语句　fun(a+b,(x,y),fun(n+k,d,(a,b)));　在此函数调用语句中实参的个数是　　A）3 　B)4　C)5　D)6
正确答案应该是A)。注：这]]></description>
		<author><![CDATA[colormoon]]></author>
		<pubDate>2006-12-03 21:37:00</pubDate>
		</item>
				<item>
		<title><![CDATA[笔试题目汇总]]></title>
		<link>http://blog.pfan.cn/colormoon/20574.html</link>
		<description><![CDATA[第一篇 笔试题目 Intel今年笔试题 ●第一道是一个编译器优化的题目。条件大致说在ZF为0或者不为0的情况下，分别有两条移位指令可以移进去。然后出了两个小题，要你优化。 ●第二道是N个人围成一圈报数，报到某一个数的就出局，问你最后剩下来的那个人的号码。编程题。 ●第三道大致如下： 以下两个程序哪个的performance高，并解释为什么。 a） extern int foo(void); int main() { int i; for(i=0;i&lt;10000;i++) foo(); return i; } b) extern int foo(void); int i; int main() { for(i=0;i&lt;10000;i++) foo(); return i; } &nbsp;&nbsp; ●智力题 将如下图形（边长相等，即突出的都是正方形）割成几块，再拼成一个正方形，要求最少最少。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;－－－ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| &nbsp;&nbsp;&nbsp;| &nbsp;－－－ &nbsp;&nbsp;&nbsp;&nbsp;－－－ &nbsp;| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| &nbsp;－－－ &nbsp;&nbsp;&nbsp;&nbsp;－－－ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| &nbsp;&nbsp;&nbsp;| －－－ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ● ee试卷考的是电磁场波导,拉式变化,电容器等内容 ●下面的程序是否正确，如正确，给出结果，否则，说明理由。 #include &lt;stdio.h&gt; struct A{ int i; char j; char * ptr; long Array[100]; char b[2]; char * c; }; #define PRINT_ME &nbsp;(char *)&amp]]></description>
		<author><![CDATA[colormoon]]></author>
		<pubDate>2006-11-21 22:29:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C++常见面试题]]></title>
		<link>http://blog.pfan.cn/colormoon/20573.html</link>
		<description><![CDATA[SIZEOF&nbsp;CONST&nbsp;预处理题目:1. sizeof相关系列问题
a. 对于 struct s{char a;int b};&nbsp; sizeof(s) = 8; 因为当结构体内元素长度都小于处理器位数（32位＝4字节）的时候，便以结构体中最长的数据元素为对齐条件,a 按 1 字节对齐，b 按 4 字节对齐，所以s默认对其参数为8
&nbsp;&nbsp;struct A{short a1;short a2;short a3};sizeof(A)=6; 原因同上，结构体按最长元素short(2字节对齐)。b.&nbsp;对于 int a[200]; sizeof(a) = 200* sizeof(int) = 800; 对整个数组大小评测
&nbsp;&nbsp; int* a = new int[200]; sizeof(a) = 4; 对指针大小进行评测
&nbsp;&nbsp;&nbsp;char str[]="012345"; sizeof(str) = 7; str 是一个字符数组，数组最初大小未定，由具体值"012345"来决定，6*sizeof(char) = 6，还有隐含的"\0"，所以一共7位。
&nbsp;&nbsp;&nbsp;char str[]="s\n";sizeof(str) = 3; 回车"\n" 是一个字符，可以查看ASCII表。还有\r、\t等等字符c. 这种使用位域的也有，其中元素最大为1字节大小=8 bits，元素按照1字节进行对齐， sizeof(b) = 1 +&nbsp; 1(4 bits+2bits &lt; 8 bits) + 1(3bits) = 3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; struct&nbsp; b&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char a:8;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char b:4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char c:2;&nbsp;&nbsp;&nbsp;&nbs]]></description>
		<author><![CDATA[colormoon]]></author>
		<pubDate>2006-11-21 22:27:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C++中虚析构函数的作用&nbsp;]]></title>
		<link>http://blog.pfan.cn/colormoon/20189.html</link>
		<description><![CDATA[我们知道，用C++开发的时候，用来做基类的类的析构函数一般都是虚函数。可是，为什么要这样做呢？下面用一个小例子来说明：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有下面的两个类：

class&nbsp;ClxBase{public:&nbsp;&nbsp;&nbsp;&nbsp;ClxBase()&nbsp;{};&nbsp;&nbsp;&nbsp;&nbsp;virtual&nbsp;~ClxBase()&nbsp;{};&nbsp;&nbsp;&nbsp;&nbsp;virtual&nbsp;void&nbsp;DoSomething()&nbsp;{&nbsp;cout&nbsp;&lt;&lt;&nbsp;"Do&nbsp;something&nbsp;in&nbsp;class&nbsp;ClxBase!"&nbsp;&lt;&lt;&nbsp;endl;&nbsp;};};class&nbsp;ClxDerived&nbsp;:&nbsp;public&nbsp;ClxBase{public:&nbsp;&nbsp;&nbsp;&nbsp;ClxDerived()&nbsp;{};&nbsp;&nbsp;&nbsp;&nbsp;~ClxDerived()&nbsp;{&nbsp;cout&nbsp;&lt;&lt;&nbsp;"Output&nbsp;from&nbsp;the&nbsp;destructor&nbsp;of&nbsp;class&nbsp;ClxDerived!"&nbsp;&lt;&lt;&nbsp;endl;&nbsp;};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;DoSomething()&nbsp;{&nbsp;cout&nbsp;&lt;&lt;&nbsp;"Do&nbsp;something&nbsp;in&nbsp;class&nbsp;ClxDerived!"&nbsp;&lt;&lt;&nbsp;endl;&nbsp;};};
&nbsp;&nbsp;&nbsp; 代码

ClxBase&nbsp;*pTest&nbsp;=&nbsp;new&nbsp;ClxDerived;pTest-&gt;DoSomething();del]]></description>
		<author><![CDATA[colormoon]]></author>
		<pubDate>2006-11-11 10:30:00</pubDate>
		</item>
				<item>
		<title><![CDATA[关于位结构体和union的一些介绍]]></title>
		<link>http://blog.pfan.cn/colormoon/20169.html</link>
		<description><![CDATA[在写通讯协议的时候用到有关位结构体和union的相关内容，整理一部分东西：
首先摘一段《C语言编程宝典》上关于位结构体的说明：
/*************以下文字摘自《C语言编程宝典》********************/
位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构 比按位运算符更加方便。 &nbsp;&nbsp;&nbsp; 位结构定义的一般形式为: &nbsp;&nbsp;&nbsp;&nbsp; struct位结构名{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据类型 变量名: 整型常数; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据类型 变量名: 整型常数; &nbsp;&nbsp;&nbsp;&nbsp; } 位结构变量; &nbsp;&nbsp;&nbsp; 其中: 数据类型必须是int(unsigned或signed)。 整型常数必须是非负的整 数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。 &nbsp;&nbsp;&nbsp; 变量名是选择项, 可以不命名, 这样规定是为了排列需要。 &nbsp;&nbsp;&nbsp; 例如: 下面定义了一个位结构。 &nbsp;&nbsp;&nbsp;&nbsp; struct{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned incon: 8;&nbsp; /*incon占用低字节的0~7共8位*/ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned txcolor: 4;/*txcolor占用高字节的0~3位共4位*/ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned bgcolor: 3;/*bgcolor占用高字节的4~6位共3位*/ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned blink: 1;&n]]></description>
		<author><![CDATA[colormoon]]></author>
		<pubDate>2006-11-10 17:22:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C/C++&nbsp;试题剖析(5)]]></title>
		<link>http://blog.pfan.cn/colormoon/20154.html</link>
		<description><![CDATA[试题5：编写一个函数，作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2，移位后应该是“hiabcdefgh” 　　函数头是这样的：//pStr是指向以'\0'结尾的字符串的指针//steps是要求移动的nvoid LoopMove ( char * pStr, int steps ){　//请填充...}　　解答：　　正确解答1：void LoopMove ( char *pStr, int steps ){　int n = strlen( pStr ) - steps;　char tmp[MAX_LEN]; 　strcpy ( tmp, pStr + n ); 　strcpy ( tmp + steps, pStr); 　*( tmp + strlen ( pStr ) ) = '\0';　strcpy( pStr, tmp );}　　正确解答2：void LoopMove ( char *pStr, int steps ){　int n = strlen( pStr ) - steps;　char tmp[MAX_LEN]; 　memcpy( tmp, pStr + n, steps ); 　memcpy(pStr + steps, pStr, n ); 　memcpy(pStr, tmp, steps ); }　　剖析：　　这个试题主要考查面试者对标准库函数的熟练程度，在需要的时候引用库函数可以很大程度上简化程序编写的工作量。　　最频繁被使用的库函数包括：　　（1） strcpy　　（2） memcpy　　（3） memset　　试题6：已知WAV文件格式如下表，打开一个WAV文件，以适当的数据结构组织WAV文件头并解析WAV格式的各项信息。　　WAVE文件格式说明表




&nbsp;
偏移地址
字节数
数据类型
内 容

文件头 
&nbsp;
00H
4 
Char
"RIFF"标志

04H
4
int32
文件长度

08H
4
Char
"WAVE"标志

0CH
4
Char
"fmt"标志

10H
4
&nbsp;
过渡字节（不定）

14H
2
int16
格式类别

16H
2
int16
通道数

1]]></description>
		<author><![CDATA[colormoon]]></author>
		<pubDate>2006-11-09 22:58:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C/C++&nbsp;试题剖析(4)]]></title>
		<link>http://blog.pfan.cn/colormoon/20153.html</link>
		<description><![CDATA[试题1：分别给出BOOL，int，float，指针变量 与“零值”比较的 if 语句（假设变量名为var）　　解答：　　　BOOL型变量：if(!var)　　　int型变量： if(var==0)　　　float型变量：　　　const float EPSINON = 0.00001;　　　if ((x &gt;= - EPSINON) &amp;&amp; (x &lt;= EPSINON)　　　指针变量：　　if(var==NULL)　　剖析：　　考查对0值判断的“内功”，BOOL型变量的0判断完全可以写成if(var==0)，而int型变量也可以写成if(!var)，指针变量的判断也可以写成if(!var)，上述写法虽然程序都能正确运行，但是未能清晰地表达程序的意思。 　一般的，如果想让if判断一个变量的“真”、“假”，应直接使用if(var)、if(!var)，表明其为“逻辑”判断；如果用if判断一个数值型变量(short、int、long等)，应该用if(var==0)，表明是与0进行“数值”上的比较；而判断指针则适宜用if(var==NULL)，这是一种很好的编程习惯。　　浮点型变量并不精确，所以不可将float变量用“==”或“！=”与数字比较，应该设法转化成“&gt;=”或“&lt;=”形式。如果写成if (x == 0.0)，则判为错，得0分。　　试题2：以下为Windows NT下的32位C++程序，请计算sizeof的值void Func ( char str[100] ){　sizeof( str ) = ?}void *p = malloc( 100 );sizeof ( p ) = ?　　解答：sizeof( str ) = 4sizeof ( p ) = 4　　剖析：　　Func ( char str[100] )函数中数组名作为函数形参时，在函数体内，数组名失去了本身的内涵，仅仅只是一个指针；在失去其内涵的同时，它还失去了其常量特性，可以作自增、自减等操作，可以被修改。　　数组名的本质如下：　　（1）数组名指代一种数据结构，这种数据结构就是数组；　　例如：char str[10];cout ＜＜ sizeof(str) ＜＜ endl;　　输出结果为10，str指代数据结构char[10]。　　（2）数组名可以转换为指向其指代实体的指]]></description>
		<author><![CDATA[colormoon]]></author>
		<pubDate>2006-11-09 22:48:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C/C++&nbsp;试题剖析(3)]]></title>
		<link>http://blog.pfan.cn/colormoon/20152.html</link>
		<description><![CDATA[试题4：void GetMemory( char *p ){　p = (char *) malloc( 100 );}void Test( void ) {　char *str = NULL;　GetMemory( str ); 　strcpy( str, "hello world" );　printf( str );}　　试题5：char *GetMemory( void ){ 　char p[] = "hello world"; 　return p; }void Test( void ){ 　char *str = NULL; 　str = GetMemory(); 　printf( str ); }　　试题6：void GetMemory( char **p, int num ){　*p = (char *) malloc( num );}void Test( void ){　char *str = NULL;　GetMemory( &amp;str, 100 );　strcpy( str, "hello" ); 　printf( str ); }　　试题7：void Test( void ){　char *str = (char *) malloc( 100 );　strcpy( str, "hello" );　free( str ); 　... //省略的其它语句}　　解答：　　试题4传入中GetMemory( char *p )函数的形参为字符串指针，在函数内部修改形参并不能真正的改变传入形参的值，执行完char *str = NULL;GetMemory( str ); 　　后的str仍然为NULL；　　试题5中char p[] = "hello world"; return p; 　　的p[]数组为函数内的局部自动变量，在函数返回后，内存已经被释放。这是许多程序员常犯的错误，其根源在于不理解变量的生存期。　　试题6的GetMemory避免了试题4的问题，传入GetMemory的参数为字符串指针的指针，但是在GetMemory中执行申请内存及赋值语句*p = (char *) malloc( num );　　后未判断内存是否申请成功，应加上：if ( *p == NULL ){　...//进行申请内存失败处理}　　试题7存在与试题6同样的问题，在执行c]]></description>
		<author><![CDATA[colormoon]]></author>
		<pubDate>2006-11-09 22:46:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C/C++&nbsp;试题剖析（2）]]></title>
		<link>http://blog.pfan.cn/colormoon/20151.html</link>
		<description><![CDATA[试题3：void test3(char* str1){　char string[10];　if( strlen( str1 ) &lt;= 10 )　{　　strcpy( string, str1 );　}}
if(strlen(str1) &lt;= 10)应改为if(strlen(str1) &lt; 10)，因为strlen的结果未统计’\0’所占用的1个字节。
考查对基本功的掌握：　　(1)字符串以’\0’结尾；　　(2)对数组越界把握的敏感度；　　(3)库函数strcpy的工作方式，如果编写一个标准strcpy函数的总分值为10，下面给出几个不同得分的答案：　　2分void strcpy( char *strDest, char *strSrc ){　 while( (*strDest++ = * strSrc++) != ‘\0’ );}　　4分void strcpy( char *strDest, const char *strSrc ) //将源字符串加const，表明其为输入参数，加2分{　 while( (*strDest++ = * strSrc++) != ‘\0’ );}　　7分void strcpy(char *strDest, const char *strSrc) {　//对源地址和目的地址加非0断言，加3分　assert( (strDest != NULL) &amp;&amp; (strSrc != NULL) );　while( (*strDest++ = * strSrc++) != ‘\0’ );}　　10分//为了实现链式操作，将目的地址返回，加3分！char * strcpy( char *strDest, const char *strSrc ) {　assert( (strDest != NULL) &amp;&amp; (strSrc != NULL) );　char *address = strDest; 　while( (*strDest++ = * strSrc++) != ‘\0’ ); 　　return address;}　　　(4)对strlen的掌握，它没有包括字符串末尾的'\0'。　　一个10分的strlen函数了，完美的版本为： 
int strlen( const char *str )]]></description>
		<author><![CDATA[colormoon]]></author>
		<pubDate>2006-11-09 22:44:00</pubDate>
		</item>
				<item>
		<title><![CDATA[strcpy()与strlen()、sizeof()的区别]]></title>
		<link>http://blog.pfan.cn/colormoon/20149.html</link>
		<description><![CDATA[char&nbsp;s1[6]="china"&nbsp;,s2[3]="ch";strcpy(s1,s2);请问内存中ina部分的数据是否被覆盖？？S1的内容是ch，还是china？？S1的长度是6？？ 
&nbsp;
strcpy(s1,s2);　　strcpy函数的意思是：把字符串s2中的内容copy到s1中，连字符串结束标志也一起copy.这样s1在内存中的存放为：ch\0如果说s1的长度是6，那是错误的.你没有弄清strlen与sizeof的意思。strlen函数的意思是测试字符串的字符长度，不含字符串结束标志的。sizeof是个运算符，它的结果是字符串在内存中的所占字节大小，它要把\0算进去的。]]></description>
		<author><![CDATA[colormoon]]></author>
		<pubDate>2006-11-09 22:28:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C/C++&nbsp;试题剖析（1）]]></title>
		<link>http://blog.pfan.cn/colormoon/20148.html</link>
		<description><![CDATA[试题1：void test1(){　char string[10];　char* str1 = "0123456789";　strcpy( string, str1 );}
试题1字符串str1需要11个字节才能存放下（包括末尾的’\0’），而string只有10个字节的空间，strcpy会导致数组越界；
试题2：void test2(){　char string[10], str1[10];　int i;　for(i=0; i&lt;10; i++)　{　　str1[i] = 'a';　}　strcpy( string, str1 );}
指出字符数组str1不能在数组内结束可以给3分； 
指出strcpy(string, str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分
在此基础上指出库函数strcpy工作方式的给10分；]]></description>
		<author><![CDATA[colormoon]]></author>
		<pubDate>2006-11-09 22:17:00</pubDate>
		</item>
				<item>
		<title><![CDATA[《高级继承》学习笔记]]></title>
		<link>http://blog.pfan.cn/colormoon/19628.html</link>
		<description><![CDATA[1.一个类的成员数据有可能包含另一个类的对象。C++程序员称其为外层类包容内层类。
2.私有继承不涉及继承接口，只涉及继承实现。
3.当派生类是一种基类时必须使用公有继承。
当你想把某些功能授权给另一个类而不必访问其保护型成员时一定要使用包容。
当你需要根据一个类而实现另一个类时，并且需要访问基类的保存型成员时使用私有继承。
当需要使用多个基类时，不能使用私有继承，必须使用包容。
当基类的成员不能用于派生类时，不能使用公有继承。
4.如果要把一个类的私有成员数据暴露给另一个类，那么就应把这个类声明为一个友元。
友元关系是不可以传递的，也不可以继承，友元关系也不是互通的。
友元类的声明：
friend class newclass;
友元声明可以放在类声明的任何地方。声明之后，本类的任何成员数据就完全暴露给另一个类。
也可以把另一个类的成员函数声明为该类的友元函数。]]></description>
		<author><![CDATA[colormoon]]></author>
		<pubDate>2006-10-22 20:52:00</pubDate>
		</item>
				<item>
		<title><![CDATA[《静态成员变量及函数》学习笔记]]></title>
		<link>http://blog.pfan.cn/colormoon/19588.html</link>
		<description><![CDATA[1.类的静态成员变量在所有类的实例中是共享的。它是全局数据与成员数据的折中。可以把静态成员变量看成是属于类而不是属于对象的。因此，对类的实例对象中并不会为静态成员变量留出存储空间。
一个常见的错误是忘记定义类的静态成员变量。若HowmanyCats是类Cat的静态成员变量，则其定义句为：
int Cat：：HowmanyCats=0;
此外，若该静态成员变量是私有的，那么类必须为该静态成员变量提供一个公有的访问函数。对于没有对象的静态成员，则可以定义一个不属于类的全局函数来访问该成员变量。因此可以在没有对象的情况下访问类的静态成员变量。
2.静态成员函数没有this指针，因此它们不能声明为const，且静态成员函数不能访问任何非静态成员变量。
3.如同数组名，函数名是指向函数的常指针。函数指针的声明如下所示：
long (*FunPtr) (int);
第一对括号必须有，否则就不是函数指针的定义，而是一个返回指针的函数。使用函数指针就如同使用函数名一样。
FunPtr(x);
和
(*FunPtr)(x);
一样，前一种只是后一种的简化形式。
也可以把函数指针作为函数变量来传递。例如：
void Func (void ( * ) (int &amp;, int &amp;) , int &amp;, int &amp;);
可以用typedef来定义结构 void ( * ) (int &amp;,int &amp;)
typedef&nbsp; (*VPF) (int &amp;,int &amp;)
则 VPF可以用来代替以上结构体。
4.为创建成员函数指针，可以使用与函数指针创建相同的语法，但要包含类名和作用域运算符（：：）。如：
void (Shape：：*pFunc)(int ,int);
使用方法一样，只是需要一个类的对象。]]></description>
		<author><![CDATA[colormoon]]></author>
		<pubDate>2006-10-21 20:38:00</pubDate>
		</item>
				<item>
		<title><![CDATA[《多态性》学习笔记]]></title>
		<link>http://blog.pfan.cn/colormoon/19489.html</link>
		<description><![CDATA[1.可以从多个基类中派生出一个新类。这就叫做多重继承。如：
class newClass：public class1，public class2
{};
2.在内存中创建newClass的对象时，两个基类形成newClass对象的组成部分。
3.多重继承对象中的构造函数。若每个基类都有带参数的构造函数，那么newClass将依次初始化这些构造函数。
4.虚继承。如：
class newClass：virtual public baseClass
通常一个类的构造函数只初始化自己的成员变量和基类。而虚继承的基类则是一个例外，它由派生性最强的类初始化。
为了确保派生类只有一个公共基类的一个实例，把中间类声明为从基类的虚基类。因此虚继承适用于新类的多个基类的基类是同一个类的情况。
5.当一个新类需要从多个基类中继承函数和特征时必须用多重继承。
当派生性最强的类必须只有共享基类的一个实例时必须用虚继承。
6.一个抽象数据类型是一个概念，而不是一个对象。在C++中一个ADT总是其他类的基类，生成ADT的实例是非法的。
C++支持用纯虚函数来创建抽象数据类型。一个虚函数通过初始化为0就变成了纯虚函数。如：
virtual void Draw()=0;
任何带有一个或多个纯虚函数的类就叫做ADT。对于带有纯虚函数的类，其派生类必须覆盖纯虚函数。否则，它的派生类也是ADT，也不能实例化。
然而也可以给纯虚函数提供实现代码，然后这个函数可以被由ADT派生的对象所调用，这样做可能是为了给所覆盖的函数提供公共功能。]]></description>
		<author><![CDATA[colormoon]]></author>
		<pubDate>2006-10-19 20:56:00</pubDate>
		</item>
				<item>
		<title><![CDATA[《数组》学习笔记]]></title>
		<link>http://blog.pfan.cn/colormoon/19460.html</link>
		<description><![CDATA[1.数组自0开始，而不是1，这点初学者容易混淆。对于越过数组尾进行写操作的错误，称作“篱笆标志错误”。
数组声明大小必须为常量，不可以是变量。
2.初始化数组。在等号之后的大括号之内用一组用逗号隔开的数来初始化数组。如：
int IntergerArray[3]={10,20,30};
数组大小可以忽略。如：
int IntergerArray[ ] ={10,20,30};
不可以初始化比声明的数组大小更多的数组元素。
对声明 int Array[5]={10，20}；这里只初始化了前两个元素。
3.对多维数组进行初始化。如：
int Array[2][3]={1,2,3,4,5,6};
其中前三个数进入Array[0]，后三个数进入Array[1]。以上还可以写作
int Array[2][3]={{1,2,3},{4,5,6}};
4.在自由存储区里声明数组。如：
int *ptr=new int [arrayNum];
这里arrayNum可以是常值，也可以是变量。
删除自由存储区中的数组用
delete [] ptr;
如果不加方括号，那么删掉的只是数组的第一个元素。
5.一个数组名是指向数组第一个元素的常量指针。
6.字符数组。初始化可以用一个一个字符来进行，也可以用如下方法：
char array[ ]="Hello World!";
应该注意两点：
1）应该用带有双引号的字符串，没有逗号和大括号。
2）不用添加空字符，因为编译器会自动添加。
7.函数strcpy()、strncpy()是将一个字符串拷贝到另一个字符串中。其中strcpy()是把字符串的全部内容复制到一个指定的缓冲区中。要使用这些函数，必须包括头文件（string.h）。
strcpy(string2,string1);
将字符串1复制到2中，注意缓冲区2的大小到足够。]]></description>
		<author><![CDATA[colormoon]]></author>
		<pubDate>2006-10-18 21:02:00</pubDate>
		</item>
		</channel>
</rss>