﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-pengkuny-随笔分类-C/C++语法</title><link>http://www.cppblog.com/pengkuny/category/2922.html</link><description>&lt;P&gt;&lt;FONT style="FONT-SIZE: 10pt; FILTER: glow(color=black); WIDTH: 100%; COLOR: #e4dc9b; LINE-HEIGHT: 150%; FONT-FAMILY: 楷体_GB2312"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;我爱常安!我喜欢梦之旅. 常安,拥有傲人的嗓音,声线成熟动人,她的声音高入云端而又翩跹再三,可以穿透您的心灵而回味无穷,让您的耳畔回旋着那种高亢空灵的感觉,她的音质干静、技巧纯熟,擅长诠释抒情歌曲,亦能将怀旧民歌表现的淋漓尽致.&lt;/FONT&gt;&lt;/P&gt;
</description><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 15:38:01 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 15:38:01 GMT</pubDate><ttl>60</ttl><item><title>位运算符的一些简单应用</title><link>http://www.cppblog.com/pengkuny/archive/2007/04/21/22551.html</link><dc:creator>pengkuny</dc:creator><author>pengkuny</author><pubDate>Sat, 21 Apr 2007 15:42:00 GMT</pubDate><guid>http://www.cppblog.com/pengkuny/archive/2007/04/21/22551.html</guid><wfw:comment>http://www.cppblog.com/pengkuny/comments/22551.html</wfw:comment><comments>http://www.cppblog.com/pengkuny/archive/2007/04/21/22551.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/pengkuny/comments/commentRss/22551.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/pengkuny/services/trackbacks/22551.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 移位运算与位运算结合能实现许多与位串运算有关的复杂计算。&nbsp;&nbsp;<a href='http://www.cppblog.com/pengkuny/archive/2007/04/21/22551.html'>阅读全文</a><img src ="http://www.cppblog.com/pengkuny/aggbug/22551.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/pengkuny/" target="_blank">pengkuny</a> 2007-04-21 23:42 <a href="http://www.cppblog.com/pengkuny/archive/2007/04/21/22551.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>新手完全释疑malloc/free VS new/delete </title><link>http://www.cppblog.com/pengkuny/archive/2006/11/03/14613.html</link><dc:creator>pengkuny</dc:creator><author>pengkuny</author><pubDate>Fri, 03 Nov 2006 04:56:00 GMT</pubDate><guid>http://www.cppblog.com/pengkuny/archive/2006/11/03/14613.html</guid><wfw:comment>http://www.cppblog.com/pengkuny/comments/14613.html</wfw:comment><comments>http://www.cppblog.com/pengkuny/archive/2006/11/03/14613.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/pengkuny/comments/commentRss/14613.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/pengkuny/services/trackbacks/14613.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:  free和delete以后要把指针置为NULL！别看free和delete的名字恶狠狠的（尤其是delete），它们只是把指针所指的内存给释放掉，但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾，此时if语句起不到防错作用，因为即便p不是NULL指针，它也不指向合法的内存块。&nbsp;&nbsp;<a href='http://www.cppblog.com/pengkuny/archive/2006/11/03/14613.html'>阅读全文</a><img src ="http://www.cppblog.com/pengkuny/aggbug/14613.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/pengkuny/" target="_blank">pengkuny</a> 2006-11-03 12:56 <a href="http://www.cppblog.com/pengkuny/archive/2006/11/03/14613.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>内存耗尽怎么办？</title><link>http://www.cppblog.com/pengkuny/archive/2006/11/03/14606.html</link><dc:creator>pengkuny</dc:creator><author>pengkuny</author><pubDate>Fri, 03 Nov 2006 04:44:00 GMT</pubDate><guid>http://www.cppblog.com/pengkuny/archive/2006/11/03/14606.html</guid><wfw:comment>http://www.cppblog.com/pengkuny/comments/14606.html</wfw:comment><comments>http://www.cppblog.com/pengkuny/archive/2006/11/03/14606.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/pengkuny/comments/commentRss/14606.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/pengkuny/services/trackbacks/14606.html</trackback:ping><description><![CDATA[
		<div twffan="done">
				<div style="TEXT-INDENT: 21pt" twffan="done">
						<div twffan="done">
								<span style="FONT-SIZE: 14pt" twffan="done">
										<font size="3">
												<font size="5">
														<strong>伟大的Bill Gates 曾经失言：<br /></strong>
												</font>
												<br />
												<font face="Georgia" size="4">　　</font>
												<strong>
														<font color="#000080">
																<font face="Georgia" size="4">640K ought to be enough for everybody — Bill Gates 1981</font>
																<br />
														</font>
												</strong>
										</font>
										<br />
										<strong>内存耗尽怎么办？</strong>
								</span>
								<strong>
								</strong>
						</div>
						<div style="TEXT-INDENT: 21pt" twffan="done">如果在申请动态内存时找不到足够大的内存块，malloc和new将返回NULL指针，宣告内存申请失败。通常有三种方式处理“内存耗尽”问题。      （1）判断指针是否为NULL，如果是则马上用return语句终止本函数。例如：</div>
				</div>
				<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1">
						<tbody>
								<tr>
										<td valign="top" width="568">
												<div twffan="done">void Func(void)<br />{<br />　A *a = new A;<br />　if(a == NULL)<br />　{<br />　　return;<br />　}<br />　…<br />}<br /><br /></div>
										</td>
								</tr>
						</tbody>
				</table>
				<div style="TEXT-INDENT: 21pt" twffan="done">（2）判断指针是否为NULL，如果是则马上用exit(1)终止整个程序的运行。例如：</div>
				<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1">
						<tbody>
								<tr>
										<td valign="top" width="568">
												<div twffan="done">void Func(void)<br />{<br />　A *a = new A;<br />　if(a == NULL)<br />　{<br />　　cout &lt;&lt; “Memory Exhausted” &lt;&lt; endl;<br />　　exit(1);<br />　}<br />　…<br />}</div>
										</td>
								</tr>
						</tbody>
				</table>
				<div style="TEXT-INDENT: 21pt" twffan="done"> </div>
				<div style="TEXT-INDENT: 21pt" twffan="done"> </div>
				<div style="TEXT-INDENT: 21pt" twffan="done">（3）为new和malloc设置异常处理函数。例如Visual C++可以用_set_new_hander函数为new设置用户自己定义的异常处理函数，也可以让malloc享用与new相同的异常处理函数。详细内容请参考C++使用手册。<br /><br />　　上述（1）（2）方式使用最普遍。如果一个函数内有多处需要申请动态内存，那么方式（1）就显得力不从心（释放内存很麻烦），应该用方式（2）来处理。<br /><br />　　很多人不忍心用exit(1)，问：“不编写出错处理程序，让操作系统自己解决行不行？”<br /><br />　　不行。如果发生“内存耗尽”这样的事情，一般说来应用程序已经无药可救。如果不用exit(1) 把坏程序杀死，它可能会害死操作系统。道理如同：如果不把歹徒击毙，歹徒在老死之前会犯下更多的罪。<br /><br />　　有一个很重要的现象要告诉大家。对于32位以上的应用程序而言，无论怎样使用malloc与new，几乎不可能导致“内存耗尽”。我在Windows 98下用Visual C++编写了测试程序，见示例7。这个程序会无休止地运行下去，根本不会终止。因为32位操作系统支持“虚存”，内存用完了，自动用硬盘空间顶替。我只听到硬盘嘎吱嘎吱地响，Window 98已经累得对键盘、鼠标毫无反应。<br /><br />　　我可以得出这么一个结论：对于32位以上的应用程序，“内存耗尽”错误处理程序毫无用处。这下可把Unix和Windows程序员们乐坏了：反正错误处理程序不起作用，我就不写了，省了很多麻烦。<br /><br />　　我不想误导读者，必须强调：不加错误处理将导致程序的质量很差，千万不可因小失大。</div>
				<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1">
						<tbody>
								<tr>
										<td valign="top" width="568">
												<div twffan="done">void main(void)<br />{<br />　float *p = NULL;<br />　while(TRUE)<br />　{<br />　　p = new float[1000000];<br />　　cout &lt;&lt; “eat memory” &lt;&lt; endl;<br />　　if(p==NULL)<br />　　　exit(1);<br />　}<br />}<br /><br />　　示例7试图耗尽操作系统的内存</div>
										</td>
								</tr>
						</tbody>
				</table>
				<div twffan="done"> </div>
				<div twffan="done">8、malloc/free 的使用要点<br /><br />　　函数malloc的原型如下：<br /><br /><br /></div>
				<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1">
						<tbody>
								<tr>
										<td valign="top" width="568">
												<div twffan="done">void * malloc(size_t size);</div>
										</td>
								</tr>
						</tbody>
				</table>
				<div twffan="done">
						<br />
						<br />　　用malloc申请一块长度为length的整数类型的内存，程序如下：<br /><br /><br /></div>
				<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1">
						<tbody>
								<tr>
										<td valign="top" width="568">
												<div twffan="done">int *p = (int *) malloc(sizeof(int) * length);</div>
										</td>
								</tr>
						</tbody>
				</table>
				<div twffan="done">
						<br />
						<br />　　我们应当把注意力集中在两个要素上：“类型转换”和“sizeof”。<br /><br />　　* malloc返回值的类型是void *，所以在调用malloc时要显式地进行类型转换，将void * 转换成所需要的指针类型。<br /><br />　　* malloc函数本身并不识别要申请的内存是什么类型，它只关心内存的总字节数。我们通常记不住int, float等数据类型的变量的确切字节数。例如int变量在16位系统下是2个字节，在32位下是4个字节；而float变量在16位系统下是4个字节，在32位下也是4个字节。最好用以下程序作一次测试：<br /><br /><br /></div>
				<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1">
						<tbody>
								<tr>
										<td valign="top" width="568">
												<div twffan="done">cout &lt;&lt; sizeof(char) &lt;&lt; endl;<br />cout &lt;&lt; sizeof(int) &lt;&lt; endl;<br />cout &lt;&lt; sizeof(unsigned int) &lt;&lt; endl;<br />cout &lt;&lt; sizeof(long) &lt;&lt; endl;<br />cout &lt;&lt; sizeof(unsigned long) &lt;&lt; endl;<br />cout &lt;&lt; sizeof(float) &lt;&lt; endl;<br />cout &lt;&lt; sizeof(double) &lt;&lt; endl;<br />cout &lt;&lt; sizeof(void *) &lt;&lt; endl;</div>
										</td>
								</tr>
						</tbody>
				</table>
				<div twffan="done">
						<br />
						<br />　　在malloc的“()”中使用sizeof运算符是良好的风格，但要当心有时我们会昏了头，写出 p = malloc(sizeof(p))这样的程序来。<br /><br />　　* 函数free的原型如下：<br /><br /><br /></div>
				<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1">
						<tbody>
								<tr>
										<td valign="top" width="568">
												<div twffan="done">void free( void * memblock );</div>
										</td>
								</tr>
						</tbody>
				</table>
				<div twffan="done">
						<br />
						<br />　　为什么free 函数不象malloc函数那样复杂呢？这是因为指针p的类型以及它所指的内存的容量事先都是知道的，语句free(p)能正确地释放内存。如果p是 NULL指针，那么free对p无论操作多少次都不会出问题。如果p不是NULL指针，那么free对p连续操作两次就会导致程序运行错误。<br /><br /><strong><span style="FONT-SIZE: 14pt" twffan="done">new/delete </span></strong><strong><span style="FONT-SIZE: 14pt" twffan="done">的使用要点</span></strong></div>
				<div twffan="done">　　运算符new使用起来要比函数malloc简单得多，例如：<br /><br /><br /></div>
				<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1">
						<tbody>
								<tr>
										<td valign="top" width="568">
												<div twffan="done">int *p1 = (int *)malloc(sizeof(int) * length);<br />int *p2 = new int[length];</div>
										</td>
								</tr>
						</tbody>
				</table>
				<div twffan="done">
						<br />
						<br />　　这是因为new内置了sizeof、类型转换和类型安全检查功能。对于非内部数据类型的对象而言，new在创建动态对象的同时完成了初始化工作。如果对象有多个构造函数，那么new的语句也可以有多种形式。例如<br /><br /><br /></div>
				<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1">
						<tbody>
								<tr>
										<td valign="top" width="568">
												<div twffan="done">class Obj<br />{<br />　public :<br />　　Obj(void); // 无参数的构造函数<br />　　Obj(int x); // 带一个参数的构造函数<br />　　…<br />}<br />void Test(void)<br />{<br />　Obj *a = new Obj;<br />　Obj *b = new Obj(1); // 初值为1<br />　…<br />　delete a;<br />　delete b;<br />}<br /><br /></div>
										</td>
								</tr>
						</tbody>
				</table>
				<div twffan="done">
						<br />　　如果用new创建对象数组，那么只能使用对象的无参数构造函数。例如<br /><br /><br /></div>
				<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1">
						<tbody>
								<tr>
										<td valign="top" width="568">
												<div twffan="done">Obj *objects = new Obj[100]; // 创建100个动态对象</div>
												<div twffan="done">　　不能写成<br />Obj *objects = new Obj[100](1);// 创建100个动态对象的同时赋初值1</div>
										</td>
								</tr>
						</tbody>
				</table>
				<div twffan="done">
						<br />　　在用delete释放对象数组时，留意不要丢了符号‘[]’。例如<br /><br /><br /></div>
				<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1">
						<tbody>
								<tr>
										<td valign="top" width="568">
												<div twffan="done">delete []objects; // 正确的用法<br />delete objects; // 错误的用法</div>
										</td>
								</tr>
						</tbody>
				</table>
				<div twffan="done">
						<br />
						<br />　　后者相当于delete objects[0]，漏掉了另外99个对象。<br /><br /><strong><span style="FONT-SIZE: 14pt" twffan="done">一些心得体会</span></strong></div>
				<div style="TEXT-INDENT: 21pt" twffan="done">我认识不少技术不错的C++/C程序员，很少有人能拍拍胸脯说通晓指针与内存管理（包括我自己）。我最初学习C语言时特别怕指针，导致我开发第一个应用软件（约1万行C代码）时没有使用一个指针，全用数组来顶替指针，实在蠢笨得过分。躲避指针不是办法，后来我改写了这个软件，代码量缩小到原先的一半。<br />　　我的经验教训是：</div>
				<div style="TEXT-INDENT: 21pt" twffan="done">（1）越是怕指针，就越要使用指针。不会正确使用指针，肯定算不上是合格的程序员。</div>
				<div style="TEXT-INDENT: 21pt" twffan="done">（2）必须养成“使用调试器逐步跟踪程序”的习惯，只有这样才能发现问题的本质。</div>
		</div>
<img src ="http://www.cppblog.com/pengkuny/aggbug/14606.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/pengkuny/" target="_blank">pengkuny</a> 2006-11-03 12:44 <a href="http://www.cppblog.com/pengkuny/archive/2006/11/03/14606.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>exit(0)和exit(1)的区别</title><link>http://www.cppblog.com/pengkuny/archive/2006/11/01/14522.html</link><dc:creator>pengkuny</dc:creator><author>pengkuny</author><pubDate>Wed, 01 Nov 2006 09:24:00 GMT</pubDate><guid>http://www.cppblog.com/pengkuny/archive/2006/11/01/14522.html</guid><wfw:comment>http://www.cppblog.com/pengkuny/comments/14522.html</wfw:comment><comments>http://www.cppblog.com/pengkuny/archive/2006/11/01/14522.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/pengkuny/comments/commentRss/14522.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/pengkuny/services/trackbacks/14522.html</trackback:ping><description><![CDATA[
		<div>
				<p>    exit(0) 正常中止程序<br />    exit(非0） 非正常中止程序<br />    习惯上要非正常中止程序用  exit(0)  </p>
				<p>
						<br /> </p>
		</div>
<img src ="http://www.cppblog.com/pengkuny/aggbug/14522.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/pengkuny/" target="_blank">pengkuny</a> 2006-11-01 17:24 <a href="http://www.cppblog.com/pengkuny/archive/2006/11/01/14522.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>指向函数的指针数组到底该怎么用</title><link>http://www.cppblog.com/pengkuny/archive/2006/11/01/14521.html</link><dc:creator>pengkuny</dc:creator><author>pengkuny</author><pubDate>Wed, 01 Nov 2006 09:22:00 GMT</pubDate><guid>http://www.cppblog.com/pengkuny/archive/2006/11/01/14521.html</guid><wfw:comment>http://www.cppblog.com/pengkuny/comments/14521.html</wfw:comment><comments>http://www.cppblog.com/pengkuny/archive/2006/11/01/14521.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/pengkuny/comments/commentRss/14521.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/pengkuny/services/trackbacks/14521.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:  int (*a[])() = {&f1, &f2, &f3, &f4};//指向函数的指针数组<br><br>   for (int i = 0; i < 4; ++i)<br>   {<br>    a[i]();//调用f1 f2 f3 f4函数<br>   }<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/pengkuny/archive/2006/11/01/14521.html'>阅读全文</a><img src ="http://www.cppblog.com/pengkuny/aggbug/14521.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/pengkuny/" target="_blank">pengkuny</a> 2006-11-01 17:22 <a href="http://www.cppblog.com/pengkuny/archive/2006/11/01/14521.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>getchar(),gets()和getch()的区别</title><link>http://www.cppblog.com/pengkuny/archive/2006/11/01/14519.html</link><dc:creator>pengkuny</dc:creator><author>pengkuny</author><pubDate>Wed, 01 Nov 2006 09:21:00 GMT</pubDate><guid>http://www.cppblog.com/pengkuny/archive/2006/11/01/14519.html</guid><wfw:comment>http://www.cppblog.com/pengkuny/comments/14519.html</wfw:comment><comments>http://www.cppblog.com/pengkuny/archive/2006/11/01/14519.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/pengkuny/comments/commentRss/14519.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/pengkuny/services/trackbacks/14519.html</trackback:ping><description><![CDATA[  <strong><font color="#ff0066"> 网文ZT　:　</font></strong><br />    跟老婆讲了几次关于getch()的用法，老婆就是不长记性，在这里我总结一下，也算是为了老婆。<br />　　首先不要忘了，要用getch()必须引入头文件conio.h，以前学C语言的时候，我们总喜欢用在程序的末尾加上它，利用它来实现程序运行完了暂停不退出的效果。如果不加这句话，在TC2.0的环境中我们用Ctrl+F9编译并运行后，程序一运行完了就退回到TC环境中，我们根本来不及看到结果，这时要看结果，我们就要按Alt+F5回到DOS环境中去看结果，这很麻烦。而如果在程序的结尾加上一行getch();语句，我们就可以省掉会DOS看结果这个步骤，因为程序运行完了并不退出，而是在程序最后把屏幕停住了，按任意键才退回到TC环境中去。那我们来看看getch()到底起的什么作用，getch()实际是一个输入命令，就像我们用cin&gt;&gt;的时候程序会停下来等你输入，和cin不同的是，getch()的作用是从键盘接收一个字符，而且并不把这个字符显示出来，就是说，你按了一个键后它并不在屏幕上显示你按的什么，而继续运行后面的代码，所以我们在C++中可以用它来实现“按任意键继续”的效果，即程序中遇到getch();这行语句，它就会把程序暂停下来，等你按任意键，它接收了这个字符键后再继续执行后面的代码。<br />　　你也许会问，为什么我们在C++中就没有在程序的末尾加上getch()，解释是，软件总是不断更新的，不好的地方当然要进行改正，getch()加在程序末尾，它又不赋值给任何变量，所以它在这个地方完全是垃圾代码，与程序无关。C++中考虑到这一点，于是在每次程序运行完了并不退出，而是自动把屏幕停下来，并显示“press any key...”叫你按任意键退出，这就好比C++在它的环境中运行程序，在程序的末尾自动加上了一行getch();语句，并且在这行语句前还添加了一行输出语句cout&lt;&lt;"press any key...";来提示你程序结束了，按任意键继续。实际上我们编译好的程序在程序结束了本身是不会停下来的，我们可以在编译产生的Debug目录中找到这个编译好的应用程序（扩展名exe），在文件夹中双击运行它，你会发现屏幕闪了一下MS-DOS窗口就关闭了，因为程序运行完就自动退出了，回到了windows环境，当然，如果我们在DOS环境中运行这个程序，我们就可以直接在看到DOS屏幕上看到程序运行结果，因为程序运行完后并不清屏。<br />　　还有一个语句，和getch()很相似，getche()，它也需要引入头文件conio.h，那它们之间的区别又在哪里呢？不同之处就在于getch()无返回显示，getche()有返回显示。怎么说呢？我举个例子你就明白了。<br />--------------------------------------<br />#include&lt;stdio.h&gt;<br />#include&lt;conio.h&gt;<br />void main()<br />{<br />    char ch;<br />    for(int i=0;i&lt;5;i++)<br />    {<br />        ch=getch();<br />        printf("%c",ch);<br />    }<br />}<br />--------------------------------------<br />　　这里输入输出我用的是C的函数库，没有用C++的iostream.h，这个我等会再说。首先这是个连续5次的循环来实现5次停顿，等待我们输入，我们编译并运行这个程序，假设我们分别输入abcde，屏幕上显示的结果是abcde，这个abcde并不是在ch=getch();中输出的，我们把printf("%c",ch);这行语句去掉，就会发现我们按5次任意键程序就结束了，但屏幕上什么都没有显示。<br />　　然后我们在把代码中的getch()换成getche()看看有什么不同，我们还是分别输入abcde，这时屏幕上显示的结果是aabbccddee，我们把printf("%c",ch);这行语句再去掉看看，显示的结果就是abcde了，说明程序在执行ch=getche();这条语句的时候就把我们输入的键返回显示在屏幕上，有无回显就是它们的唯一区别。<br />　　好了，我们再来说说为什么不用C++函数库的原因。你可以试试把这个程序改成C++的形式：<br />--------------------------------------<br />#include&lt;iostream.h&gt;<br />#include&lt;conio.h&gt;<br />void main()<br />{<br />    char ch;<br />    for(int i=0;i&lt;5;i++)<br />    {<br />        ch=getch();<br />        cout&lt;&lt;ch;<br />    }<br />}<br />--------------------------------------<br />　　你会发现运行结果是完全不同的，说实话我也搞不清它是怎么编译运行的，以前我在C++中用它来实现任意键继续的功能就发现了这个问题。如果在getch();后面有个cout&lt;&lt;"……";语句的话他会先执行下面的cout&lt;&lt;"……";然后再执行getch();实现停顿，有时再两个语句中间加上一个cout&lt;&lt;endl;可以解决这个问题，但如果用C中的printf()就从没有出现过这种问题。至于到底是为什么，我也不知道，只能猜想，可能是因为getch()是C的函数库中的函数，在C++中不怎么好用，就是说是编译系统本身的问题，与我们写的程序没有关系。不知道我分析是不是正确的，还希望高手能予以指点，谢谢！<br />　　有人会说，既然是C的函数库中的，那么就应该淘汰了，我们还研究它，还用它干嘛？但是我发现还是有用着它的地方，否则我也不会在这里说这么多来耽误大家的时间。我就举个例子吧，程序如下：<br />--------------------------------------<br />#include&lt;stdio.h&gt;<br />#include&lt;conio.h&gt; 
<p>void main()<br />{<br />    char ch='*';<br />    while(ch=='*')<br />    {<br />        printf("\n按 * 继续循环，按其他键退出！");<br />        ch=getch();<br />    }<br />    printf("\n退出程序！");<br />}<br />--------------------------------------<br />　　我们可以在这个循环体中添加我们想要的功能，程序中按*继续循环，其他任意键退出，而且利用getch()无回显的特性，我们不管按什么，都不会在屏幕上留下痕迹，使我们的界面达到美观效果，如果还有更好的办法实现这个功能，我可能就不会在这里提这么多了。如果你真的有更好的办法，请一定告诉我，谢谢！<br />　　下面我把别人网页上的几个例子转载如下：<br />--------------------------------------<br />//例一：这个例子是为了说明getch()和getche()的区别<br />#include&lt;stdio.h&gt;<br />#include&lt;conio.h&gt;</p><p>//这里讲个小故事：因为这个代码是在别人网页上的，别人用的C环境，可能是不需要conio.h头文件<br />//就可以用getch();（我就不清楚了），也可能是忘了写，网页上的源代码没有#include&lt;conio.h&gt;这一行，<br />//我让老婆去看这个网页，老婆把网页上的代码复制到C++环境中，不能编译就跟我哭，<br />//呵呵，我可爱的傻老婆！</p><p>void main()<br />{ <br />    char c, ch;<br />    c=getch();     /*从键盘上读入一个字符不回显送给字符变量c*/<br />    putchar(c);    /*输出该字符*/<br />    ch=getche();   /*从键盘上带回显的读入一个字符送给字符变量ch*/<br />    putchar(ch);<br />    printf("\n\n");<br />}<br />--------------------------------------<br />//例二：这个例子是演示交互输入的过程中完成暂停功能<br />#include&lt;stdio.h&gt;<br />#include&lt;conio.h&gt;<br />void main()<br />{<br />    char c, s[20];<br />    printf("Name:");<br />    gets(s);<br />    printf("Press any key to continue...\n\n");<br />    getch();  /*等待输入任一键*/<br />    printf("\n\n");<br />}<br />--------------------------------------<br />//例三：getchar()函数也是从键盘上读入一个字符，并带回显。它与前面两个函数的区别在于：<br />//　　　getchar()函数等待输入直到按回车才结束，回车前的所有输入字符都会逐个显示在屏幕上。<br />//　　　但只有第一个字符作为函数的返回值。<br />#include&lt;stdio.h&gt;<br />#include&lt;conio.h&gt;<br />void main()<br />{<br />    char c;<br />    c=getchar();   /*从键盘读入字符直到回车结束*/<br />           //getchar()在这里它只返回你输入字符串的第一个字符，并把返回值赋值给c<br />    putchar(c);    /*显示输入的第一个字符*/<br />    printf("\n\n");<br />}<br />--------------------------------------<br />//例四：呵呵，这个程序你运行一下，相信你又会有疑问了<br />#include&lt;stdio.h&gt;<br />#include&lt;conio.h&gt;<br />void main()<br />{<br />    char c;<br />    while ((c=getchar())!='\n')    /*每个getchar()依次读入一个字符*/<br />        printf("%c",c);        /*按照原样输出*/<br />    printf("\n\n");<br />}<br />--------------------------------------<br />　　例四的程序运行时，首先停下来，等你输入一串字符串，输入完毕后，它把你输入的整个字符串都输出来了，咦，你不是说getchar()只返回第一个字符么，这里怎么？<br />　　不要急，我慢慢跟你解释，忍耐一下，马上就讲完了。因为我们输入的字符串并不是取了第一个字符就把剩下的字符串丢掉了，它还在我们的内存中，就好比，开闸放水，我们把水放到闸里去以后，开一次闸就放掉一点，开一次就放掉一点，直到放光了为止，我们输入的字符串也是这么一回事，首先我们输入的字符串是放在内存的缓冲区中的，我们调用一次getchar()就把缓冲区中里出口最近的一个字符输出，也就是最前面的一个字符输出，输出后，就把它释放掉了，但后面还有字符串，所以我们就用循环把最前面的一个字符一个个的在内存中释放掉，直到不满足循环条件退出为止。例子中循环条件里的'\n'实际上就是你输入字符串后的回车符，所以意思就是说，直到遇到回车符才结束循环，而getchar()函数就是等待输入直到按回车才结束，所以实现了整个字符串的输出。当然，我们也可以把循环条件改一下，比如while ((c=getchar())!='a')，什么意思呢，意思就是遇到字符'a'就停止循环。</p><p>　　明白了吗？^_^  好了，休息会去吧，别老在电脑面前盯着<br /></p><img src ="http://www.cppblog.com/pengkuny/aggbug/14519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/pengkuny/" target="_blank">pengkuny</a> 2006-11-01 17:21 <a href="http://www.cppblog.com/pengkuny/archive/2006/11/01/14519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC中的随机函数</title><link>http://www.cppblog.com/pengkuny/archive/2006/11/01/14517.html</link><dc:creator>pengkuny</dc:creator><author>pengkuny</author><pubDate>Wed, 01 Nov 2006 09:18:00 GMT</pubDate><guid>http://www.cppblog.com/pengkuny/archive/2006/11/01/14517.html</guid><wfw:comment>http://www.cppblog.com/pengkuny/comments/14517.html</wfw:comment><comments>http://www.cppblog.com/pengkuny/archive/2006/11/01/14517.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/pengkuny/comments/commentRss/14517.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/pengkuny/services/trackbacks/14517.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 要想产生不同的随机数，在使用rand之前需要先调用srand&nbsp;&nbsp;<a href='http://www.cppblog.com/pengkuny/archive/2006/11/01/14517.html'>阅读全文</a><img src ="http://www.cppblog.com/pengkuny/aggbug/14517.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/pengkuny/" target="_blank">pengkuny</a> 2006-11-01 17:18 <a href="http://www.cppblog.com/pengkuny/archive/2006/11/01/14517.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++时间控制函数</title><link>http://www.cppblog.com/pengkuny/archive/2006/11/01/14515.html</link><dc:creator>pengkuny</dc:creator><author>pengkuny</author><pubDate>Wed, 01 Nov 2006 09:16:00 GMT</pubDate><guid>http://www.cppblog.com/pengkuny/archive/2006/11/01/14515.html</guid><wfw:comment>http://www.cppblog.com/pengkuny/comments/14515.html</wfw:comment><comments>http://www.cppblog.com/pengkuny/archive/2006/11/01/14515.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/pengkuny/comments/commentRss/14515.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/pengkuny/services/trackbacks/14515.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 随着软硬件的飞速发展，计算机技术已经广泛地应用到自动化控制领域，为了实现实时控制，控制程序必须能够精确地完成定时和计时功能。VC提供了很多关于时间操作的函数，下面根据它们精度的不同，分别进行说明。&nbsp;&nbsp;<a href='http://www.cppblog.com/pengkuny/archive/2006/11/01/14515.html'>阅读全文</a><img src ="http://www.cppblog.com/pengkuny/aggbug/14515.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/pengkuny/" target="_blank">pengkuny</a> 2006-11-01 17:16 <a href="http://www.cppblog.com/pengkuny/archive/2006/11/01/14515.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sprintf,你了解多少</title><link>http://www.cppblog.com/pengkuny/archive/2006/11/01/14512.html</link><dc:creator>pengkuny</dc:creator><author>pengkuny</author><pubDate>Wed, 01 Nov 2006 09:13:00 GMT</pubDate><guid>http://www.cppblog.com/pengkuny/archive/2006/11/01/14512.html</guid><wfw:comment>http://www.cppblog.com/pengkuny/comments/14512.html</wfw:comment><comments>http://www.cppblog.com/pengkuny/archive/2006/11/01/14512.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/pengkuny/comments/commentRss/14512.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/pengkuny/services/trackbacks/14512.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: printf 可能是许多程序员在开始学习C 语言时接触到的第二个函数（我猜第一个是main），说<br>起来，自然是老朋友了，可是，你对这个老朋友了解多吗？你对它的那个孪生兄弟sprintf 了解多<br>吗？在将各种类型的数据构造成字符串时，sprintf 的强大功能很少会让你失望。&nbsp;&nbsp;<a href='http://www.cppblog.com/pengkuny/archive/2006/11/01/14512.html'>阅读全文</a><img src ="http://www.cppblog.com/pengkuny/aggbug/14512.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/pengkuny/" target="_blank">pengkuny</a> 2006-11-01 17:13 <a href="http://www.cppblog.com/pengkuny/archive/2006/11/01/14512.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>stdafx.h的用法</title><link>http://www.cppblog.com/pengkuny/archive/2006/11/01/14510.html</link><dc:creator>pengkuny</dc:creator><author>pengkuny</author><pubDate>Wed, 01 Nov 2006 09:08:00 GMT</pubDate><guid>http://www.cppblog.com/pengkuny/archive/2006/11/01/14510.html</guid><wfw:comment>http://www.cppblog.com/pengkuny/comments/14510.html</wfw:comment><comments>http://www.cppblog.com/pengkuny/archive/2006/11/01/14510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/pengkuny/comments/commentRss/14510.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/pengkuny/services/trackbacks/14510.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 预编译头文件：STDAFX.CPP，STDAFX.H&nbsp;&nbsp;<a href='http://www.cppblog.com/pengkuny/archive/2006/11/01/14510.html'>阅读全文</a><img src ="http://www.cppblog.com/pengkuny/aggbug/14510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/pengkuny/" target="_blank">pengkuny</a> 2006-11-01 17:08 <a href="http://www.cppblog.com/pengkuny/archive/2006/11/01/14510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>