﻿<?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++博客-小乌龟-随笔分类-C&amp;C++</title><link>http://www.cppblog.com/xiaowugui/category/4110.html</link><description>在梦想的道路上还能走多远</description><language>zh-cn</language><lastBuildDate>Tue, 24 Apr 2012 22:47:36 GMT</lastBuildDate><pubDate>Tue, 24 Apr 2012 22:47:36 GMT</pubDate><ttl>60</ttl><item><title>为什么复制构造函数的参数必须为引用</title><link>http://www.cppblog.com/xiaowugui/archive/2012/04/23/172397.html</link><dc:creator>小乌龟</dc:creator><author>小乌龟</author><pubDate>Sun, 22 Apr 2012 16:21:00 GMT</pubDate><guid>http://www.cppblog.com/xiaowugui/archive/2012/04/23/172397.html</guid><wfw:comment>http://www.cppblog.com/xiaowugui/comments/172397.html</wfw:comment><comments>http://www.cppblog.com/xiaowugui/archive/2012/04/23/172397.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xiaowugui/comments/commentRss/172397.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xiaowugui/services/trackbacks/172397.html</trackback:ping><description><![CDATA[为什么复制构造函数的参数必须为引用呢，原因如下：<br /><div><div><p>&nbsp;&nbsp; Because if it's not by reference, it's by  value. To do that you make a copy, and to do that you call the copy  constructor. But to do that, we need to need to make a new value, so we  call the copy constructor, and so on...</p>  <p>(You would have infinite recursion because "to make a copy, you need to make a copy".)</p> </div></div>来源：<br /><div>http://stackoverflow.com/questions/2685854/why-should-the-copy-constructor-accept-its-parameter-by-reference-in-c</div><br />老忘记，举个例子也许更好理解：<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">创建Type类型的对象a</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">Type&nbsp;a;<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">对a的对象内部数据成员赋值</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><img src="http://www.cppblog.com/Images/dot.gif" alt="" /><br /><br /></span><span style="color: #008000; ">// 调用复制构造函数创建对象b<br /></span><span style="color: #000000; ">Type&nbsp;b(&nbsp;a&nbsp;)<br /></span></div><br />由于b的复制构造函数的参数被定义为值传递，那么首先会创建一个Type的临时变量，假设为temp1，然后再传递给b的复制构造函数<br /><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">Type&nbsp;temp1(&nbsp;a&nbsp;)<br /></span></div><br />由于temp1的复制构造函数的参数被定义为值传递，那么首先会创建一个Type的临时变量，假设为temp2，然后再传递给b的复制构造函数<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">Type&nbsp;temp2(&nbsp;a&nbsp;)</span></div><br />类推,会出现temp3,temp4,...直至无穷多！<br /><br />所以复制构造函数的参数必须为引用<img src ="http://www.cppblog.com/xiaowugui/aggbug/172397.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xiaowugui/" target="_blank">小乌龟</a> 2012-04-23 00:21 <a href="http://www.cppblog.com/xiaowugui/archive/2012/04/23/172397.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言获取文件大小</title><link>http://www.cppblog.com/xiaowugui/archive/2010/10/22/130863.html</link><dc:creator>小乌龟</dc:creator><author>小乌龟</author><pubDate>Fri, 22 Oct 2010 03:22:00 GMT</pubDate><guid>http://www.cppblog.com/xiaowugui/archive/2010/10/22/130863.html</guid><wfw:comment>http://www.cppblog.com/xiaowugui/comments/130863.html</wfw:comment><comments>http://www.cppblog.com/xiaowugui/archive/2010/10/22/130863.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/xiaowugui/comments/commentRss/130863.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xiaowugui/services/trackbacks/130863.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;今天去面试，面试官问了个C中如何获取文件大小，想啊想，没有这个函数啊。那应该是用fseek将文件指针移动到文件末尾，然后通过文件指针获取吧？但是什么函数呢，没印象，汗......<br>&nbsp;&nbsp;&nbsp;回来查了下，原来是ftell，悲剧啊，以前没用过！MSDN上ftell的功能如下：Gets the current position of a file pointer。写了段代码测试了下，代码如下：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_31_305_Open_Image onclick="this.style.display='none'; Codehighlighter1_31_305_Open_Text.style.display='none'; Codehighlighter1_31_305_Closed_Image.style.display='inline'; Codehighlighter1_31_305_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_31_305_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_31_305_Closed_Text.style.display='none'; Codehighlighter1_31_305_Open_Image.style.display='inline'; Codehighlighter1_31_305_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_31_305_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_31_305_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;fileSize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;FILE</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pFile&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;fopen(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">mm.data</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">r</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;pFile&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;NULL&nbsp;)<br><img id=Codehighlighter1_118_155_Open_Image onclick="this.style.display='none'; Codehighlighter1_118_155_Open_Text.style.display='none'; Codehighlighter1_118_155_Closed_Image.style.display='inline'; Codehighlighter1_118_155_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_118_155_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_118_155_Closed_Text.style.display='none'; Codehighlighter1_118_155_Open_Image.style.display='inline'; Codehighlighter1_118_155_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_118_155_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_118_155_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Open&nbsp;File&nbsp;Error\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_164_292_Open_Image onclick="this.style.display='none'; Codehighlighter1_164_292_Open_Text.style.display='none'; Codehighlighter1_164_292_Closed_Image.style.display='inline'; Codehighlighter1_164_292_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_164_292_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_164_292_Closed_Text.style.display='none'; Codehighlighter1_164_292_Open_Image.style.display='inline'; Codehighlighter1_164_292_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_164_292_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_164_292_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;将指针定位到文件末尾</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fseek(&nbsp;pFile,&nbsp;</span><span style="COLOR: #000000">0L</span><span style="COLOR: #000000">,&nbsp;SEEK_END&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileSize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ftell(&nbsp;pFile&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">file&nbsp;size:&nbsp;%ld\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;fileSize&nbsp;);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<img src ="http://www.cppblog.com/xiaowugui/aggbug/130863.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xiaowugui/" target="_blank">小乌龟</a> 2010-10-22 11:22 <a href="http://www.cppblog.com/xiaowugui/archive/2010/10/22/130863.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>string中的+, =, +=</title><link>http://www.cppblog.com/xiaowugui/archive/2008/11/23/67668.html</link><dc:creator>小乌龟</dc:creator><author>小乌龟</author><pubDate>Sun, 23 Nov 2008 08:14:00 GMT</pubDate><guid>http://www.cppblog.com/xiaowugui/archive/2008/11/23/67668.html</guid><wfw:comment>http://www.cppblog.com/xiaowugui/comments/67668.html</wfw:comment><comments>http://www.cppblog.com/xiaowugui/archive/2008/11/23/67668.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xiaowugui/comments/commentRss/67668.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xiaowugui/services/trackbacks/67668.html</trackback:ping><description><![CDATA[<p><br>看一段简单的代码：<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;s;<br>&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">bc</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">s:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;s&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;system(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Pause</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div>
<br>对不？当然对的！参看basic_string.h中的源码：<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;basic_string</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;basic_string</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;__str)&nbsp;{&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">append(__str);&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@brief&nbsp;&nbsp;Append&nbsp;a&nbsp;C&nbsp;string.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@param&nbsp;s&nbsp;&nbsp;The&nbsp;C&nbsp;string&nbsp;to&nbsp;append.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@return&nbsp;&nbsp;Reference&nbsp;to&nbsp;this&nbsp;string.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;basic_string</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;_CharT</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;__s)&nbsp;{&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">append(__s);&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@brief&nbsp;&nbsp;Append&nbsp;a&nbsp;character.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@param&nbsp;s&nbsp;&nbsp;The&nbsp;character&nbsp;to&nbsp;append.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@return&nbsp;&nbsp;Reference&nbsp;to&nbsp;this&nbsp;string.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;basic_string</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">(_CharT&nbsp;__c)&nbsp;{&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">append(size_type(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">),&nbsp;__c);&nbsp;}</span></div>
<br>下面的代码对不？<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;s1;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;s1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;=&nbsp;也定义了右边的值为字符的情况&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">s1:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;s1&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;s1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">bc</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">s1:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;s1&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;</span></div>
<br>看源码！<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;basic_string</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;basic_string</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;__str)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">assign(__str);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@brief&nbsp;&nbsp;Copy&nbsp;contents&nbsp;of&nbsp;@a&nbsp;s&nbsp;into&nbsp;this&nbsp;string.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@param&nbsp;&nbsp;s&nbsp;&nbsp;Source&nbsp;null-terminated&nbsp;string.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;basic_string</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;_CharT</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;__s)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">assign(__s);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@brief&nbsp;&nbsp;Set&nbsp;value&nbsp;to&nbsp;string&nbsp;of&nbsp;length&nbsp;1.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@param&nbsp;&nbsp;c&nbsp;&nbsp;Source&nbsp;character.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;Assigning&nbsp;to&nbsp;a&nbsp;character&nbsp;makes&nbsp;this&nbsp;string&nbsp;length&nbsp;1&nbsp;and<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;(*this)[0]&nbsp;==&nbsp;@a&nbsp;c.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;basic_string</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(_CharT&nbsp;__c)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">assign(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;__c);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br>下面的呢<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;s2(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">u</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;s2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">j</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;s2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">s2:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;s2&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;s2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;s2&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">n</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">s2:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;s2&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;s2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">jin&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;s2;<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">s2:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;s2&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;s2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;s2&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;xia</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">s2:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;s2&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;</span></div>
<br>还是源码！<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;operator+</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*<br>&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@brief&nbsp;&nbsp;Concatenate&nbsp;two&nbsp;strings.<br>&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@param&nbsp;lhs&nbsp;&nbsp;First&nbsp;string.<br>&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@param&nbsp;rhs&nbsp;&nbsp;Last&nbsp;string.<br>&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@return&nbsp;&nbsp;New&nbsp;string&nbsp;with&nbsp;value&nbsp;of&nbsp;@a&nbsp;lhs&nbsp;followed&nbsp;by&nbsp;@a&nbsp;rhs.<br>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">typename&nbsp;_CharT,&nbsp;typename&nbsp;_Traits,&nbsp;typename&nbsp;_Alloc</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;basic_string</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">_CharT,&nbsp;_Traits,&nbsp;_Alloc</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;basic_string</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">_CharT,&nbsp;_Traits,&nbsp;_Alloc</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #000000">&nbsp;__lhs,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;basic_string</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">_CharT,&nbsp;_Traits,&nbsp;_Alloc</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #000000">&nbsp;__rhs)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;basic_string</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">_CharT,&nbsp;_Traits,&nbsp;_Alloc</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;__str(__lhs);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__str.append(__rhs);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;__str;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*<br>&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@brief&nbsp;&nbsp;Concatenate&nbsp;C&nbsp;string&nbsp;and&nbsp;string.<br>&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@param&nbsp;lhs&nbsp;&nbsp;First&nbsp;string.<br>&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@param&nbsp;rhs&nbsp;&nbsp;Last&nbsp;string.<br>&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@return&nbsp;&nbsp;New&nbsp;string&nbsp;with&nbsp;value&nbsp;of&nbsp;@a&nbsp;lhs&nbsp;followed&nbsp;by&nbsp;@a&nbsp;rhs.<br>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">typename&nbsp;_CharT,&nbsp;typename&nbsp;_Traits,&nbsp;typename&nbsp;_Alloc</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;basic_string</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">_CharT,_Traits,_Alloc</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;_CharT</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;__lhs,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;basic_string</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">_CharT,_Traits,_Alloc</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #000000">&nbsp;__rhs);<br><br>&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*<br>&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@brief&nbsp;&nbsp;Concatenate&nbsp;character&nbsp;and&nbsp;string.<br>&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@param&nbsp;lhs&nbsp;&nbsp;First&nbsp;string.<br>&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@param&nbsp;rhs&nbsp;&nbsp;Last&nbsp;string.<br>&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@return&nbsp;&nbsp;New&nbsp;string&nbsp;with&nbsp;@a&nbsp;lhs&nbsp;followed&nbsp;by&nbsp;@a&nbsp;rhs.<br>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">typename&nbsp;_CharT,&nbsp;typename&nbsp;_Traits,&nbsp;typename&nbsp;_Alloc</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;basic_string</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">_CharT,_Traits,_Alloc</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">(_CharT&nbsp;__lhs,&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;basic_string</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">_CharT,_Traits,_Alloc</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #000000">&nbsp;__rhs);<br><br>&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*<br>&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@brief&nbsp;&nbsp;Concatenate&nbsp;string&nbsp;and&nbsp;C&nbsp;string.<br>&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@param&nbsp;lhs&nbsp;&nbsp;First&nbsp;string.<br>&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@param&nbsp;rhs&nbsp;&nbsp;Last&nbsp;string.<br>&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@return&nbsp;&nbsp;New&nbsp;string&nbsp;with&nbsp;@a&nbsp;lhs&nbsp;followed&nbsp;by&nbsp;@a&nbsp;rhs.<br>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">typename&nbsp;_CharT,&nbsp;typename&nbsp;_Traits,&nbsp;typename&nbsp;_Alloc</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;inline&nbsp;basic_string</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">_CharT,&nbsp;_Traits,&nbsp;_Alloc</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;basic_string</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">_CharT,&nbsp;_Traits,&nbsp;_Alloc</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #000000">&nbsp;__lhs,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;_CharT</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;__rhs)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;basic_string</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">_CharT,&nbsp;_Traits,&nbsp;_Alloc</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;__str(__lhs);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__str.append(__rhs);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;__str;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*<br>&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@brief&nbsp;&nbsp;Concatenate&nbsp;string&nbsp;and&nbsp;character.<br>&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@param&nbsp;lhs&nbsp;&nbsp;First&nbsp;string.<br>&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@param&nbsp;rhs&nbsp;&nbsp;Last&nbsp;string.<br>&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@return&nbsp;&nbsp;New&nbsp;string&nbsp;with&nbsp;@a&nbsp;lhs&nbsp;followed&nbsp;by&nbsp;@a&nbsp;rhs.<br>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">typename&nbsp;_CharT,&nbsp;typename&nbsp;_Traits,&nbsp;typename&nbsp;_Alloc</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;inline&nbsp;basic_string</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">_CharT,&nbsp;_Traits,&nbsp;_Alloc</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;basic_string</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">_CharT,&nbsp;_Traits,&nbsp;_Alloc</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #000000">&nbsp;__lhs,&nbsp;_CharT&nbsp;__rhs)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;basic_string</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">_CharT,&nbsp;_Traits,&nbsp;_Alloc</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;__string_type;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;typename&nbsp;__string_type::size_type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__size_type;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__string_type&nbsp;__str(__lhs);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__str.append(__size_type(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">),&nbsp;__rhs);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;__str;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br></span></div>
<br>也许，最好的资料就是看看头文件或者源码！<br><br><br>
<img src ="http://www.cppblog.com/xiaowugui/aggbug/67668.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xiaowugui/" target="_blank">小乌龟</a> 2008-11-23 16:14 <a href="http://www.cppblog.com/xiaowugui/archive/2008/11/23/67668.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>两次CTRL+Z才能中止程序</title><link>http://www.cppblog.com/xiaowugui/archive/2008/10/26/65100.html</link><dc:creator>小乌龟</dc:creator><author>小乌龟</author><pubDate>Sun, 26 Oct 2008 08:34:00 GMT</pubDate><guid>http://www.cppblog.com/xiaowugui/archive/2008/10/26/65100.html</guid><wfw:comment>http://www.cppblog.com/xiaowugui/comments/65100.html</wfw:comment><comments>http://www.cppblog.com/xiaowugui/archive/2008/10/26/65100.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xiaowugui/comments/commentRss/65100.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xiaowugui/services/trackbacks/65100.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><br>main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;c;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%c</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">c)&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;EOF)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%c</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;c);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div>
<p><span id=topicSubject csdnid="topicSubject"></span>&nbsp;</p>
一段很让人不爽的代码，为什么要输入两次Ctrl+Z呢。只能说是VC6.0和C-Free的bug, 谁知道了告诉我一声。其他人的讨论：<br>&nbsp;&nbsp;&nbsp; <a href="http://topic.csdn.net/u/20080429/22/dcd3aba2-0cad-4c56-aeb2-2be7d3b07d44.html">http://topic.csdn.net/u/20080429/22/dcd3aba2-0cad-4c56-aeb2-2be7d3b07d44.html</a><br>&nbsp;&nbsp;&nbsp; <br>
<img src ="http://www.cppblog.com/xiaowugui/aggbug/65100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xiaowugui/" target="_blank">小乌龟</a> 2008-10-26 16:34 <a href="http://www.cppblog.com/xiaowugui/archive/2008/10/26/65100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cout &lt;&lt; &amp;("abc") &lt;&lt; endl解析</title><link>http://www.cppblog.com/xiaowugui/archive/2008/09/09/61349.html</link><dc:creator>小乌龟</dc:creator><author>小乌龟</author><pubDate>Mon, 08 Sep 2008 17:27:00 GMT</pubDate><guid>http://www.cppblog.com/xiaowugui/archive/2008/09/09/61349.html</guid><wfw:comment>http://www.cppblog.com/xiaowugui/comments/61349.html</wfw:comment><comments>http://www.cppblog.com/xiaowugui/archive/2008/09/09/61349.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xiaowugui/comments/commentRss/61349.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xiaowugui/services/trackbacks/61349.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;<span style="FONT-SIZE: 10pt">&nbsp;ChinaUnix上看到有人问了一个问题,程序代码如下:</span><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">abc</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;输出abc</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">abc</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">))&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;输出abc</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">abc</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)))&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;输出abc，好像无论在"abc"前加几个&amp;，输出都为abc<br></span></div>
&nbsp;&nbsp;&nbsp;<span style="FONT-SIZE: 10pt">一个人的评价:<br>&nbsp;&nbsp;&nbsp;数组char str[]在内存中存储方式:str和&amp;str是同一个值,也就是说str本身在内存中没有占用空间,str、&amp;str和&amp;str[0]的值是一样的，只是直接给str[]的数组元素分配了空间。指针char *str在内存中的存储方式：首先会给str变量本身分配空间，也就是说str和&amp;str的值肯定是不一样的，&amp;str就是str的地址，在指针初始化后才给指针char *str所指向的字符串明确的分配空间，当然这个空间的首地址就是str的值。所以数组和指针还是有区别的，只是编译器对指针的处理是按照处理数组的方式来处理的。<br>&nbsp;&nbsp;这个评价真的是那么正确吗?<br>&nbsp;&nbsp;&nbsp;先分析代码:三个输出一样,是因为:取地址运算符只能用于内存中的对象,即变量和数组元素.它不能作用于表达式,常量或register类型的变量(The C Programming Language P93).<br>&nbsp;&nbsp;&nbsp;那么字符串常量的返回值是什么呢?是指针变量吗?不像!有人说:怎么不像了,当你把一个字符串常量作为一个参数传递给函数,其行为就像指针啊.那就想想数组,将数组名传递给函数,它的行为也像指针啊.可数组名终究不是指针,只不过作为函数参数时,其退化为了指针.是不是像数组,的确有那种味道.不信就看看下面的测试代码:<br></span>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><br>main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">xiexiu</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;s[]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">xiexiu</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%u\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">xiexiu</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%u\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">&nbsp;p);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%u\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">&nbsp;s);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div>
<span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;<span style="FONT-SIZE: 10pt">输出结果时:<br>&nbsp;&nbsp;&nbsp;7<br>&nbsp;&nbsp;&nbsp;4<br>&nbsp;&nbsp;&nbsp;7<br>&nbsp;&nbsp;&nbsp;既然这样的话,那么数组名是变量还是常量呢?数组名实质上是这个数组的首地址，一旦系统开辟了这块内存，那么这个内存的首地址就不能改变，所以，对数组名的赋值肯定是不允许的。数组名等同于常量，但是还有没有数组名就是常量的说法。这就说明了数组名绝不是变量,当然也不是数组元素了.因此对数组名取地址,要么是未定义,要么是非法的.对字符串常量取地址,很多编译器都可以通过,只是警告一番.因此对于数组str[],str和&amp;str是同一个值的说法是不对,因为&amp;str这个本身不合法或未定义的.<br>&nbsp;&nbsp;&nbsp;还有他说:所以数组和指针还是有区别的，只是编译器对指针的处理是按照处理数组的方式来处理的。数组当然和指针有区别了.数组名不是变量,而指针是.编译器对指针的处理是按照处理数组的方式来处理的吗?那么为什么用指针编写的程序比数组的快?<br>&nbsp;&nbsp;&nbsp;The C&nbsp;Programming Language P98:在计算数组元素a[i]的值时,C语言实际上先将其转换为*(a+i)的形式,然后再进行求值,这就说明了编译器对数组的处理是按照指针的方式来处理的.同时也说明了为什么用指针编写的程序比用数组编写的快.<br><br></span></span><br>
<img src ="http://www.cppblog.com/xiaowugui/aggbug/61349.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xiaowugui/" target="_blank">小乌龟</a> 2008-09-09 01:27 <a href="http://www.cppblog.com/xiaowugui/archive/2008/09/09/61349.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C-Free对程序命令行参数*的处理</title><link>http://www.cppblog.com/xiaowugui/archive/2008/09/06/61104.html</link><dc:creator>小乌龟</dc:creator><author>小乌龟</author><pubDate>Sat, 06 Sep 2008 03:42:00 GMT</pubDate><guid>http://www.cppblog.com/xiaowugui/archive/2008/09/06/61104.html</guid><wfw:comment>http://www.cppblog.com/xiaowugui/comments/61104.html</wfw:comment><comments>http://www.cppblog.com/xiaowugui/archive/2008/09/06/61104.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xiaowugui/comments/commentRss/61104.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xiaowugui/services/trackbacks/61104.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;用C-Free(使用默认的mingw编译器)编译一个程序的时候,出现了一个古怪的现象.MS如果一个程序有命令行参数且命令行参数中含有*,则编译器就会将*替换为本目录下的所有文件名,而用VC++6.0则不会出现以上的情况.</p>
&nbsp;&nbsp;&nbsp;测试了一番,的确如此.程序代码如下:<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;包含头文件&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000">&nbsp;<br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><br>main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(argc</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">argv</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div>
&nbsp;&nbsp;&nbsp;用C-Free4.0(使用默认的mingw编译器)编译成expr.exe.然后将其放置于一个文件夹下,此时文件夹里含有两个文件:expr.exe和expr.txt.从命令行执行: expr.exe *,结果显示:<br>&nbsp;&nbsp;&nbsp;expr.exe<br>&nbsp;&nbsp;&nbsp;expr.exe<br>&nbsp;&nbsp;&nbsp;expr.txt<br><br>&nbsp;&nbsp;&nbsp;用VC++6.0编译成expr2.exe,然后将它移到此文件夹下,执行同样的命令: expr.exe *,结果如下:<br>&nbsp;&nbsp;&nbsp;expr2.exe<br>&nbsp;&nbsp;&nbsp;*&nbsp;<br><br>&nbsp;&nbsp;&nbsp;如果*不是作为一个单独的参数,而是作为一个参数的一部分,情况会怎样,执行命令:expr.exe 1*2,结果如下:<br>&nbsp;&nbsp;&nbsp;expr.exe<br>&nbsp;&nbsp;&nbsp;1*2<br>&nbsp;&nbsp;&nbsp;因此,在使用C-Free(默认编译器mingw)编译含有*命令行参数的程序,务必小心. 
<img src ="http://www.cppblog.com/xiaowugui/aggbug/61104.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xiaowugui/" target="_blank">小乌龟</a> 2008-09-06 11:42 <a href="http://www.cppblog.com/xiaowugui/archive/2008/09/06/61104.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>给int赋最小值问题</title><link>http://www.cppblog.com/xiaowugui/archive/2008/08/01/57775.html</link><dc:creator>小乌龟</dc:creator><author>小乌龟</author><pubDate>Fri, 01 Aug 2008 08:40:00 GMT</pubDate><guid>http://www.cppblog.com/xiaowugui/archive/2008/08/01/57775.html</guid><wfw:comment>http://www.cppblog.com/xiaowugui/comments/57775.html</wfw:comment><comments>http://www.cppblog.com/xiaowugui/archive/2008/08/01/57775.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xiaowugui/comments/commentRss/57775.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xiaowugui/services/trackbacks/57775.html</trackback:ping><description><![CDATA[<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">2147483648</span><span style="COLOR: #000000">;</span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如此简单的一句代码，居然出现了警告？-2147483648是32位int类型可以存储的最小整型值，为什么会出项警告呢。在VC++6.0控制台程序下出现如下警告：warning C4146: unary minus operator applied to unsigned type, result still unsigned。在C-Free中出现：c:55: warning: decimal constant is so large that it is unsigned。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上网查了下，发现了原因：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一元负运算符应用于无符号类型，结果仍为无符号类型。无符号类型只能保存非负值，所以一元负（非）应用于无符号类型时通常无意义。操作数和结果都是非负的。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实际上，当程序员试图表达最小整数值-2147483648 时，发生此问题。该值不能写为-2147483648，因为表达式处理分两个步骤：&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 计算数字2147483648。因为2147483648 大于最大整数值2147483647，所以其类型不是int，而是unsigned int。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将一元负应用于该值，得到无符号结果，该结果碰巧是 2147483648。无符号类型的结果可能导致意外行为。如果在比较中使用该结果，则可使用无符号比较，而不能出现另一个操作数是 int 时。这解释了下面的示例程序只输出一行的原因。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 预期的第二行为：1 is greater than the most negative int，但未输出，因为((unsigned int)1) &gt; 2147483648为假。&nbsp;<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">#include &lt;stdio.h&gt;<br></span><span style="COLOR: #000000"><br>main()<br>{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;check(</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;check(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;check(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i)&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(i&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">2147483648</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d&nbsp;is&nbsp;greater&nbsp;than&nbsp;the&nbsp;most&nbsp;negative&nbsp;int\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;i);&nbsp;<br>}</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出结果：<br><img src="http://www.cppblog.com/images/cppblog_com/xiaowugui/QQ.jpeg" border=0><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上面的解释省略了一些细节，我来补充下。在if&nbsp; (i &gt; -2147483648)中，由于i为int类型，而-2147483648为unsigned int类型，所有i就会被提升为unsigned int类型，这就是C语言的整型提升。-10提升为unsigned int类型后，其值肯定会大于2147483648，因此第一条语句会打印出来。当把正整数（比如本实验中的1）提升为unsigned int类型时，其值是不变的，因此肯定比2147483648要小，所有第二条语句不会打印。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;那如何来解决这个可恶的警告呢。网上说：可以通过从 Limits.h 使用INT_MIN(一个宏定义) 来避免C4146 警告。INI_MIN宏有如何的魔力，竟然能够消除这个警告呢。打开源文件一看，原来是这样：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;INT_MAX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2147483647</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;INT_MIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(-INT_MAX-1)</span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 哦，原来这样。因此，我们又可以这样赋值最小负整数：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">2147483647</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;</span></div>
<img src ="http://www.cppblog.com/xiaowugui/aggbug/57775.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xiaowugui/" target="_blank">小乌龟</a> 2008-08-01 16:40 <a href="http://www.cppblog.com/xiaowugui/archive/2008/08/01/57775.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++中的枚举</title><link>http://www.cppblog.com/xiaowugui/archive/2008/07/29/57423.html</link><dc:creator>小乌龟</dc:creator><author>小乌龟</author><pubDate>Tue, 29 Jul 2008 07:35:00 GMT</pubDate><guid>http://www.cppblog.com/xiaowugui/archive/2008/07/29/57423.html</guid><wfw:comment>http://www.cppblog.com/xiaowugui/comments/57423.html</wfw:comment><comments>http://www.cppblog.com/xiaowugui/archive/2008/07/29/57423.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/xiaowugui/comments/commentRss/57423.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xiaowugui/services/trackbacks/57423.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;读K&amp;R的The &nbsp; C &nbsp; Programmingh &nbsp; Language &nbsp; 2nd，遇到一疑问，书中说：&#8220;尽管可以声明enum类型的变量，但编译器不检查这种类型的变量中存储的值是否为该枚举的有效值。不过，枚举变量提供这种检查，因此枚举比#define更具优势。&#8221;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 枚举变量提供这种检查，什么意思？枚举变量会自己检？当然不是，作者也许想说程序员自己可以写个程序检查付给枚举变量的值是否为该枚举的有效值。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;包含头文件&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000">&nbsp;<br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;枚举类型&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">enum</span><span style="COLOR: #000000">&nbsp;months{JAN&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;FEB};<br><br></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;函数原型&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;enumeration(</span><span style="COLOR: #0000ff">enum</span><span style="COLOR: #000000">&nbsp;months&nbsp;m);<br><br>main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">enum</span><span style="COLOR: #000000">&nbsp;months&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;2;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">enum</span><span style="COLOR: #000000">&nbsp;months&nbsp;b&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">50</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;C中不需要强制转换为enum&nbsp;months类型&nbsp;</span><span style="COLOR: #008000">*/<br><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; <span style="COLOR: #0000ff">enum</span><span style="COLOR: #000000">&nbsp;months c&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">JAN</span><span style="COLOR: #000000">;</span><br><br>&nbsp;&nbsp;&nbsp;&nbsp;enumeration(a);<br>&nbsp;&nbsp;&nbsp;&nbsp;enumeration(b);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;enumeration函数：检测枚举变量存储的值是否为该枚举的有效值&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;enumeration(</span><span style="COLOR: #0000ff">enum</span><span style="COLOR: #000000">&nbsp;months&nbsp;m)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000">&nbsp;(m)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;JAN:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">JAN:&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;JAN);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;FEB:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">FEB:&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;FEB);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d不是该枚举的有效值！\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;m);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</span></div>
<br><br>而这段代码如果改为C++源文件编译，却不能通过。原因如下：<br><br>根据C标准的规定，枚举常量的类型为int，枚举变量的类型应该与char、有符号或无符号整型兼容。因此，枚举变量可以接受 char、有符号或无符号整型数，而不限于仅从此枚举类型所定义的枚举常量中取值。由于上述原因，在C語言中无法从語法上保证枚举变量只能在定义的枚举成员中取值，只能由程序员自身保证不使用除枚举成员之外的值。<br><br>关于這一点，很多介绍C语言的书上或者资料上的描述是不正确的，应该加以注意。<br><br>但是，如果给枚举变量赋枚举成员之外的值，有的编译器可能会对此产生警告，有的则不會。因为这种行为不违反C标准的规定，编译器对此如何反应都是有道理的。<br><br>然而对于C++来说，编译器会禁止给枚举变量赋予枚举成员之外的值。这是因为C++是一种强类型语言，枚举类型不等同于 int 等其它类型。虽然枚举类型可以隐式转化为 int 等类型，但是 int 等类型却不能自动转化为枚举类型，除非使用强制类型转化。因此，如果不使用强制类型转化的话，给枚举变量赋值则只能从枚举成员中选择。对于枚举类型要避免使用强制类型转换。原因如下：<br>&nbsp;<br>The &nbsp; C++ &nbsp; Programming &nbsp; Language上说:&nbsp;&nbsp;&nbsp;<br>如果某个枚举中所有枚举值非负,枚举的表示范围为[0 :&nbsp;2^k-1];其中2^K是使所有枚举成员位于此范围内的最小的2的幂;如果是负的,就是[-2^k&nbsp;: 2^k-1]。 因此对一个给定的整数值，如果使用强制类型转换，而其值又不在枚举的表示范围以内，其行为是未定义的。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000"><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;包含头文件&nbsp;&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">enum</span><span style="COLOR: #000000">&nbsp;months{JAN&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;FEB,&nbsp;MAR};<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">enum&nbsp;months&nbsp;a&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">cannot&nbsp;convert&nbsp;from&nbsp;'const&nbsp;int'&nbsp;to&nbsp;'enum&nbsp;main::months'</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">enum</span><span style="COLOR: #000000">&nbsp;months&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">enum</span><span style="COLOR: #000000">&nbsp;months)</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">a:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;a&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">输出:&nbsp;a:&nbsp;1</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">enum</span><span style="COLOR: #000000">&nbsp;months&nbsp;b&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">enum</span><span style="COLOR: #000000">&nbsp;months)</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">b:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;b&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">输出:&nbsp;b:&nbsp;10&nbsp;虽然输出10，但结果是未定义的，因为此枚举的表示范围为：0～3</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div>
<img src ="http://www.cppblog.com/xiaowugui/aggbug/57423.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xiaowugui/" target="_blank">小乌龟</a> 2008-07-29 15:35 <a href="http://www.cppblog.com/xiaowugui/archive/2008/07/29/57423.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C中运算符结合性</title><link>http://www.cppblog.com/xiaowugui/archive/2008/07/28/57373.html</link><dc:creator>小乌龟</dc:creator><author>小乌龟</author><pubDate>Mon, 28 Jul 2008 11:44:00 GMT</pubDate><guid>http://www.cppblog.com/xiaowugui/archive/2008/07/28/57373.html</guid><wfw:comment>http://www.cppblog.com/xiaowugui/comments/57373.html</wfw:comment><comments>http://www.cppblog.com/xiaowugui/archive/2008/07/28/57373.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/xiaowugui/comments/commentRss/57373.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xiaowugui/services/trackbacks/57373.html</trackback:ping><description><![CDATA[什么是运算符的结合性？<br><br>当两个运算符的优先级一样的时候，先算哪一个的问题，这就是结合性。<br><br>首先要明白的是：结合性对于两个或两个以上的优先级一样的运算符才有意义。<br>比如：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">m&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;x&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;y&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;z;</span></div>
<br>由于算术运算符的结合性是从左至右，因此上式等价于：<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">m&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(x&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;y)&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;z;</span></div>
<br>再比如：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><br>main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;s[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;{</span><span style="COLOR: #000000">11</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">52</span><span style="COLOR: #000000">};<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">ptr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;s;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">*++</span><span style="COLOR: #000000">ptr);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div>
答案是：52<br>由于*和++的结合性从右至左，因此*++ptr等价于*(++ptr)<br><br>在网上查询资料的时候发现：很多人问条件运算符的结合性的问题。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;k&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><br>k&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(i</span><span style="COLOR: #000000">++&lt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">&nbsp;:&nbsp;((i</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">&nbsp;:&nbsp;</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">);<br><br>cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">k;<br></span></div>
<br>k&nbsp;=&nbsp;(3&lt;0)?9:((i==3)?10:8);<br>之后i变成4<br>----〉<br>3&lt;0是假，所以k不为9，继续计算下一步。<br>k&nbsp;=&nbsp;((i==3)?10:8);<br>----〉<br>我们知道这时候i等于4，所以，((i==3)为假。<br>所以k不等于10，而是等于8嘛<br>k&nbsp;=&nbsp;((i==3)?10:8);<br>----〉<br>k&nbsp;=&nbsp;8<br><br>有人问，那条件运算符的结合性且不是从左至右了，这与书上写的从右至左不符？<br>其实上面根本牵涉不到什么结合性的问题，只有一个运算符会牵涉到结合性吗。而条件运算符是C中规定计算顺序的四个运算符之一，因此上面的计算顺序是完全正确的。<br><br>
<img src ="http://www.cppblog.com/xiaowugui/aggbug/57373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xiaowugui/" target="_blank">小乌龟</a> 2008-07-28 19:44 <a href="http://www.cppblog.com/xiaowugui/archive/2008/07/28/57373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>