﻿<?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++博客-简简单单  记下-文章分类-平常学习</title><link>http://www.cppblog.com/keroro/category/18797.html</link><description>慢点走，多喝水。</description><language>zh-cn</language><lastBuildDate>Fri, 27 Jul 2012 04:58:34 GMT</lastBuildDate><pubDate>Fri, 27 Jul 2012 04:58:34 GMT</pubDate><ttl>60</ttl><item><title>《Unix/LINUX编程实践》学习记录</title><link>http://www.cppblog.com/keroro/articles/185235.html</link><dc:creator>笨蛋侦探</dc:creator><author>笨蛋侦探</author><pubDate>Thu, 26 Jul 2012 12:59:00 GMT</pubDate><guid>http://www.cppblog.com/keroro/articles/185235.html</guid><wfw:comment>http://www.cppblog.com/keroro/comments/185235.html</wfw:comment><comments>http://www.cppblog.com/keroro/articles/185235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/keroro/comments/commentRss/185235.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/keroro/services/trackbacks/185235.html</trackback:ping><description><![CDATA[1.习题2.6：一个文件可以多次被打开，并且相互不互相影响，即fir = open("file",xxmode), sec = open("file",xxmode) 这两个fileID的操作是不互相影响的。但当mode是可写的的时候，文件是即写即改变的。例如在对一个文件写操作的前后分别读这个文件的相同位置（即被写的那个位置），显示的数据是不一样的，后者显示的是写操作后的数据。说明对一个文件的操作都是对一个缓冲区操作的。我想就算是多个进程对同一个文件进行操作的时候也是对于同一片内存区操作的。。<img src ="http://www.cppblog.com/keroro/aggbug/185235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/keroro/" target="_blank">笨蛋侦探</a> 2012-07-26 20:59 <a href="http://www.cppblog.com/keroro/articles/185235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>词法分析器</title><link>http://www.cppblog.com/keroro/articles/169545.html</link><dc:creator>笨蛋侦探</dc:creator><author>笨蛋侦探</author><pubDate>Fri, 30 Mar 2012 10:19:00 GMT</pubDate><guid>http://www.cppblog.com/keroro/articles/169545.html</guid><wfw:comment>http://www.cppblog.com/keroro/comments/169545.html</wfw:comment><comments>http://www.cppblog.com/keroro/articles/169545.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/keroro/comments/commentRss/169545.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/keroro/services/trackbacks/169545.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 写了个简单的词法分析器，作用是输入一段代码，输出分离后的代码。如 for(i=1;i&lt;n;i++)j++;分离后变成for(i=1;i&lt;n;i++)j++;Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->//小小的lex()&nbsp;~~...&nbsp;&nbsp;<a href='http://www.cppblog.com/keroro/articles/169545.html'>阅读全文</a><img src ="http://www.cppblog.com/keroro/aggbug/169545.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/keroro/" target="_blank">笨蛋侦探</a> 2012-03-30 18:19 <a href="http://www.cppblog.com/keroro/articles/169545.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】用引用返回值</title><link>http://www.cppblog.com/keroro/articles/167735.html</link><dc:creator>笨蛋侦探</dc:creator><author>笨蛋侦探</author><pubDate>Mon, 12 Mar 2012 12:55:00 GMT</pubDate><guid>http://www.cppblog.com/keroro/articles/167735.html</guid><wfw:comment>http://www.cppblog.com/keroro/comments/167735.html</wfw:comment><comments>http://www.cppblog.com/keroro/articles/167735.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/keroro/comments/commentRss/167735.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/keroro/services/trackbacks/167735.html</trackback:ping><description><![CDATA[【转】转自CSDN。<br />说得很全面！觉得好，从CSDN拿过来的。我看的链接： <a href="http://blog.csdn.net/tcdddd/article/details/5519332">http://blog.csdn.net/tcdddd/article/details/5519332</a><br /><br />函数返回值时，要生成一个值的副本。而用引用返回值时，不生成值的副本。<br />　　例如，下面的程序是有关引用返回的4种形式：<br />　　　　<span class="ff0000">//*********************<br />　　　　//** 　　ch9_6.cpp 　**<br />　　　　//********************* </span>
<p class="ff0000">　　　　#include &lt;iostream.h&gt;</p>
<p class="ff0000">　　　　float temp;</p>
<p class="ff0000">　　　　float fn1(float r)<br />　　　　{<br />　　　　　temp = r*r*3.14;<br />　　　　　return temp;<br />　　　　}</p>
<p class="ff0000">　　　　float&amp; fn2(float r)<br />　　　　{<br />　　　　　temp = r*r*3.14;<br />　　　　　return temp;<br />　　　　}</p>
<p class="ff0000">　　　　void main()<br />　　　　{<br />　　　　　float a=fn1(5.0); //1<br />　　　　　float&amp; b=fn1(5.0); //2:warning<br />　　　　　float c=fn2(5.0); //3<br />　　　　　float&amp; d=fn2(5.0); //4<br />　　　　　cout&lt;&lt;a&lt;&lt;endl;<br />　　　　　cout&lt;&lt;b&lt;&lt;endl;<br />　　　　　cout&lt;&lt;c&lt;&lt;endl;<br />　　　　　cout&lt;&lt;d&lt;&lt;endl;<br />　　　　}</p>
<p class="p14">　　运行结果为：<br /><span class="ff0000">　　　　78．5<br />　　　　78．5<br />　　　　78．5<br />　　　　78．5</span></p>
<p class="p14">　　对主函数的4种引用返回的形式， 程序的运行结果是一样的。但是它们在内存中的活动情况是各不相同的。其中变量temp是全局数据，驻留在全局数据区data。函数main()、函数fnl()或函数fn2()驻留在栈区stack。<br />　　第一种情况：见图9-5。</p>
<p class="p14" align="center"><img alt="" src="http://hi.csdn.net/attachment/201004/23/0_1271996479iV8m.gif" /><br /><span class="p135">图9-5 返回值方式的内存布局</span></p>
<p class="p14">　　这种情况是一般的函数返回值方式。 返回全局变量temp值时，C++创建临时变量并将temp的值78.5复制给该临时变量。返回到主函数后，赋值语句a=fnl(5.0)把临时变量的值78.5复制给a。<br />第二种情况：见图9-6。</p>
<p class="p14" align="center"><img alt="" src="http://hi.csdn.net/attachment/201004/23/0_1271996487ZJd2.gif" /><br /><span class="p135">图9-6 返回值初始引用的情形</span></p>
<p class="p14">　　这种情况下，函数fnl()是以值方式返回的，返回时， 复制temp的值给临时变量。返回到主函数后，引用b以该临时变量来初始化，使得b成为该临时变量的别名。由于临时变量的作用域短暂，所以b面临无效的危险。 根据C++标准，临时变量或对象的生命期在一个 完整的语句表达式结束后便宣告结束，也即在&#8220;float&amp; b=fnl(5.0)；&#8221;之后，临时变量不再存在。 所以引用b以后的值是个无法确定的值。BC对C++标准进行了扩展，规定如果临时变量或对象作为引用的初始化时，则其生命期与该引用一致。14.7节将进一步介绍这一内容。 这样的程序， 依赖于编译器的具体实现，所以移植性是差的。<br />　　若要以返回值初始化一个引用，应该先创建一个变量，将函数返回值赋给这个变量，然 后再以该变量来初始化引用，就像下面这样：<br />　<span class="ff0000">　　　int x=fnl(5.0)；<br />　　　　int&amp; b=x；</span><br />　　第三种情况：见图9-7。</p>
<p class="p14" align="center"><img alt="" src="http://hi.csdn.net/attachment/201004/23/0_1271996492737O.gif" /><br /><span class="p135">图9&#8212;7 返回引用方式</span></p>
<p class="p14">　　这种情况，函数fn2()的返回值不产生副本，所以， 直接将变量temp返回给主函数。主函数的赋值语句中的左值，直接从变量temp中得到复制，这样避免了临时变量的产生。当变量temp是一个用户自定义的类型时，这种方式直接带来了程序执行效率和空间利用的利益。<br />第四种情况：见图9-8。</p>
<p align="center"><span class="p14"><img alt="" src="http://hi.csdn.net/attachment/201004/23/0_1271996497e3ek.gif" /><br /></span><span class="p135">图9&#8212;8 返回引用方式的值作为引用的初始化</span></p>
<p class="p14">　　这种情况， 函数fn2()返回一个引用，因此不产生任何返回值的副本。在主函数中，一个引用声明d用该返回值来初始化，使得d成为temp的别名。由于temp是全局变量， 所以在d的有效期内temp始终保持有效。这样做法是安全的。<br />　　但是， 如果返回不在作用域范围内的变量或对象的引用， 那就有问题了。这与返回一个局部作用域指针的性质一样严重。BC作为编译错误，VC作为警告，来提请编程者注意。例如，下面的代码返回一个引用，来给主函数的引用声明初始化：<br /><span class="ff0000">　　　　float&amp; fn2(float r)<br />　　　　{<br />　　　　　float temp；<br />　　　　　temp=r*r*3.14；<br />　　　　　return temp；<br />　　　　}<br />　　　　void main()<br />　　　　{<br />　　　　　float &amp;d=fn2(5.0)； //error返回的引用是个局部变量<br />　　　　}</span></p>
<p class="p14">　　见图9-9说明。</p>
<p align="center"><span class="p14"><img alt="" src="http://hi.csdn.net/attachment/201004/23/0_1271996502rT7h.gif" /><br /></span><span class="p135">图9-9 返回的引用是局部变量</span></p>
<p class="p14">　　如果返回的引用是作为一个左值进行运算，也是程序员最犯忌的。所以，如果程序中有下面的代码，则一定要剔除：<br /><span class="ff0000">　　　　float&amp; fn2(float r)<br />　　　　{<br />　　　　　float temp；<br />　　　　　temp=r*r*3.14；<br />　　　　　return temp；<br />　　　　}<br />　　　　void main()<br />　　　　{<br />　　　　　fn2(5.0)=12.4； //error返回的是局部作用域内的变量<br />　　　　}</span></p><img src ="http://www.cppblog.com/keroro/aggbug/167735.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/keroro/" target="_blank">笨蛋侦探</a> 2012-03-12 20:55 <a href="http://www.cppblog.com/keroro/articles/167735.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>printf 与 cout</title><link>http://www.cppblog.com/keroro/articles/167723.html</link><dc:creator>笨蛋侦探</dc:creator><author>笨蛋侦探</author><pubDate>Mon, 12 Mar 2012 09:12:00 GMT</pubDate><guid>http://www.cppblog.com/keroro/articles/167723.html</guid><wfw:comment>http://www.cppblog.com/keroro/comments/167723.html</wfw:comment><comments>http://www.cppblog.com/keroro/articles/167723.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/keroro/comments/commentRss/167723.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/keroro/services/trackbacks/167723.html</trackback:ping><description><![CDATA[今天开始搞搞C++。<br />今天看了一下VC里的汇编代码，才有一点点搞懂了printf 和 cout 的工作方式（我用的是VC++6.0）。刚学汇编，有什么不对的地方请更正啊。<br />(1)printf&nbsp; 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">5</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d,%d,%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,i,i</span><span style="color: #000000">++</span><span style="color: #000000">,i);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,i);</span></div><br />结果是5,5,5<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6<br />VC是先把要输出的3个变量push进栈里面，然后再做i++ 这一操作的，再调用printf函数。所以我们看到第一个printf输出的是3个未改变的i，到了第二个printf 时i 的值是9，所以push进栈的i=9，输出的是9。<br /><br />(2)cout<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">5</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">i</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">i</span><span style="color: #000000">++&lt;&lt;</span><span style="color: #000000">i;</span></div>结果是655<br />不太懂流，不过根据汇编代码来看，cout是从后往前操作的，push i&lt;-- i++ &lt;--push i &lt;-- push i;<br />所以最后一个i=5,第二个i=5,i++后第一个i=6.&nbsp;&nbsp;&nbsp;&nbsp; 如果后面有&lt;&lt;endl;的话就是先做endl操作。<br /><br />那cout&lt;&lt;i&lt;&lt;++i&lt;&lt;i&nbsp; 的结果呢？不难知道是 665.<br /><br /><br /><br />可以看到，printf 和 cout 的操作顺序不同。<img src ="http://www.cppblog.com/keroro/aggbug/167723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/keroro/" target="_blank">笨蛋侦探</a> 2012-03-12 17:12 <a href="http://www.cppblog.com/keroro/articles/167723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>