﻿<?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++</title><link>http://www.cppblog.com/Cunch/category/15970.html</link><description>不惜奋斗</description><language>zh-cn</language><lastBuildDate>Sat, 13 Jul 2013 15:53:19 GMT</lastBuildDate><pubDate>Sat, 13 Jul 2013 15:53:19 GMT</pubDate><ttl>60</ttl><item><title>Qt反射</title><link>http://www.cppblog.com/Cunch/archive/2013/07/13/201779.html</link><dc:creator>Cunch</dc:creator><author>Cunch</author><pubDate>Sat, 13 Jul 2013 14:19:00 GMT</pubDate><guid>http://www.cppblog.com/Cunch/archive/2013/07/13/201779.html</guid><wfw:comment>http://www.cppblog.com/Cunch/comments/201779.html</wfw:comment><comments>http://www.cppblog.com/Cunch/archive/2013/07/13/201779.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Cunch/comments/commentRss/201779.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cunch/services/trackbacks/201779.html</trackback:ping><description><![CDATA[<h2><strong>简介</strong></h2>
<blockquote>
<p>本文主要讲解Qt是如何实现反射，以及一点点反射使用的小心得。</p>
</blockquote>
<h2><strong>文章概览</strong></h2>
<blockquote>
<p> </p>
<h3></h3>
<h5></h5>
<h4></h4>
<h5></h5>
<p>Qt反射内幕小窥</p>
<p>详细内容</p>
<p>反射前期准备</p>
<p>得到注册的类成员变量</p>
<p>得到注册的类成员函数</p>
<p>访问类成员属性（get,set）</p>
<p>调用注册的函数</p>
<p>反射应用</p>
<p>总结</p>
</blockquote>
<h2><strong>Qt反射内幕小窥</strong></h2>
<blockquote>
<p>Qt反射机制是基于moc(meta object compiler)实现的,在这里多插一句（可以说Qt所有C++没有的特性，几乎都和这个有关系）。但是需要注意的是Qt提供的反射式基本的反射，不支持类的反射，这个与Java，C#还是有差别的。</p>
</blockquote>
<h2>moc讲解</h2>
<p> </p>
<p>通常C++的编译过程为</p>
<p>预处理-&gt;编译-&gt;链接-&gt;运行</p>
<p>Qt编译的过程中，有一个moc的过程,在Qt工程构建过程中的qmake其实就是干这个事的。moc-&gt;预处理-&gt;编译-&gt;链接-&gt;运行。</p>
<p>在moc过程中，需要处理的事情如下：</p>
<p>1、 识别一些特殊的宏Q_OBJECT、Q_PROPERTY、Q_INVOKABLE。。。; 如果碰到这些关键字，Qt自然就会去生成对应的moc文件。</p>
<p>2、 slot，signal自然也是如此。</p>
<p>3、 uidesigner，同样也是在这个阶段处理的;</p>
<p> </p>
<h2><strong>详细内容</strong></h2>
<blockquote>
<p>&nbsp;</p>
<h3><strong>反射前期准备</strong></h3>
<p>1、 首先得继承于Q_Object,同时需要在class中加入Q_OBJECT，但是Q_Object的构造函数默认是私有的不让继承。 </p>
<p>在类中直接使用Q_GADGET也可以实现反射，。。。据说只能实现部分功能，目前我只实现到能遍历成员属性，函数，但是不能访问其中的值。 </p>
<p>这个过程其实就是定义QMetaObject的过程，具体见Qt源码 </p>
<p>2、 注册类成员变量需要使用Q_PROPERTY </p>
<p>Q_PROPERTY( type member READ get WRITE set) 其中READ,WRITE是关键字 </p>
<p>Type表示成员的类型（不支持自定义类型，对Qt很多基本类型都支持）; </p>
<p>Member代表你给该成员另外起的名字，可以和变量名不同；get，set就是自己在C++函数里面定义的基本的访问函数名，不需要写参数。直接上代码： </p>
<p>3、 注册类成员函数 </p>
<p>如果你希望这个函数能够被反射，那么很简单，只需要在类的函数声明前加入Q_INVOKABLE关键字。 </p>
<p>例如Q_INVOKABLE int func( QString flag ); </p>
<p> </p>
<div id="codeSnippetWrapper">
<div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　　<span style="color: #cc6633">#include</span> &lt;QObject&gt;</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　　<span style="color: #0000ff">class</span> MyClass : <span style="color: #0000ff">public</span> QObject</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　　{</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　　 Q_OBJECT</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　　 Q_PROPERTY(<span style="color: #0000ff">int</span> Member1 READ Member1 WRITE setMember1 )</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　　 Q_PROPERTY(<span style="color: #0000ff">int</span> Member2 READ Member2 WRITE setMember2 )</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　　 Q_PROPERTY(QString MEMBER3 READ Member3 WRITE setMember3 )</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　　<span style="color: #0000ff">public</span>:</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　　 <span style="color: #0000ff">explicit</span> MyClass(QObject *parent = 0);</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　　signals:</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　　<span style="color: #0000ff">public</span> slots:</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　　<span style="color: #0000ff">public</span>:</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　　 Q_INVOKABLE <span style="color: #0000ff">int</span> Member1();</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　　 Q_INVOKABLE <span style="color: #0000ff">int</span> Member2();</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　　 Q_INVOKABLE QString Member3();</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　　 Q_INVOKABLE <span style="color: #0000ff">void</span> setMember1( <span style="color: #0000ff">int</span> mem1 );</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　　 Q_INVOKABLE <span style="color: #0000ff">void</span> setMember2( <span style="color: #0000ff">int</span> mem2 );</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　　 Q_INVOKABLE <span style="color: #0000ff">void</span> setMember3( <span style="color: #0000ff">const</span> QString&amp; mem3 );</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　　 Q_INVOKABLE <span style="color: #0000ff">int</span> func( QString flag );</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　　<span style="color: #0000ff">private</span>:</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　　 <span style="color: #0000ff">int</span> m_member1;</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　　 <span style="color: #0000ff">int</span> m_member2;</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　　 QString m_member3;</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　　};</pre>
<!--CRLF--></div>
</div>
</blockquote>
<blockquote>
<h3><strong>得到注册的类成员变量</strong></h3>
<div id="codeSnippetWrapper">
<div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　MyClass theObj;</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #0000ff">const</span> QMetaObject* metaObj = theObj.metaObject();</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #008000">//1.遍历类的属性</span></pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #0000ff">int</span> propertyCnt = metaObj-&gt;propertyCount();</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #0000ff">for</span> ( <span style="color: #0000ff">int</span> i = 0; i &lt; propertyCnt; ++ i )</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> {</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> QMetaProperty oneProperty = metaObj-&gt;property( i );</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> cout &lt;&lt; <span style="color: #006080">" name: "</span> &lt;&lt; oneProperty.name();</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> cout &lt;&lt; <span style="color: #006080">" type: "</span> &lt;&lt; QVariant::typeToName( oneProperty.type()) &lt;&lt; <span style="color: #006080">"\n"</span>;</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　}</pre>
<!--CRLF--></div>
</div>
</blockquote>
<p>主要思路就是得到其元对象，得到其元属性，然后就能得到你需要的信息，具体的访问函数有name,type,需要注意的是得到的type是枚举值，还在Qt提供了typeToName的函数，你可以得到想要的（例如不是空洞的2，而是&#8221;int&#8221;）。</p>
<h3>得到注册的类成员函数</h3>
<div id="codeSnippetWrapper">
<div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #008000">//2.遍历类的函数成员</span></pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #0000ff">int</span> methodCnt = metaObj-&gt;methodCount();</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> <span style="color: #0000ff">for</span> ( <span style="color: #0000ff">int</span> idx = 0; idx &lt; methodCnt; ++ idx )</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> {</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> QMetaMethod oneMethod = metaObj-&gt;method( idx );</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> cout &lt;&lt; <span style="color: #006080">"--------begin-------"</span> &lt;&lt; <span style="color: #006080">"\n"</span>;</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> cout &lt;&lt; <span style="color: #006080">" typeName: "</span> &lt;&lt; oneMethod.typeName() &lt;&lt; <span style="color: #006080">"\n"</span>;</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> cout &lt;&lt; <span style="color: #006080">" signature: "</span> &lt;&lt; oneMethod.signature() &lt;&lt; <span style="color: #006080">"\n"</span>;</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> cout &lt;&lt; <span style="color: #006080">" methodType: "</span> &lt;&lt; oneMethod.methodType() &lt;&lt; <span style="color: #006080">"\n"</span>;</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> cout &lt;&lt; <span style="color: #006080">"--------end---------"</span> &lt;&lt; <span style="color: #006080">"\n"</span>;</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　}</pre>
<!--CRLF--></div>
</div>
<p>
</p>
<p>和遍历类属性一致，其实就是根据元对象，得到元函数; </p>
<p>其中typeName代表返回类型，signature只的是函数的原貌，methodType代表函数的类型，在Qt中分为三类（槽，信号，普通函数）。</p>
<h3><strong>访问类成员属性（get,set）</strong></h3>
<div id="codeSnippetWrapper">
<div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #008000">//3.使用反射</span></pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> cout &lt;&lt; <span style="color: #006080">"-------test property-----------"</span> &lt;&lt; <span style="color: #006080">"\n"</span>;</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> MyClass newObj;</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> newObj.setProperty(<span style="color: #006080">"Member1"</span>, 66);</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> cout &lt;&lt; newObj.property( <span style="color: #006080">"Member1"</span> ).toString().toStdString() &lt;&lt; <span style="color: #006080">"\n"</span>;</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> cout &lt;&lt; newObj.Member1() &lt;&lt; <span style="color: #006080">"\n"</span>;</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　cout &lt;&lt; <span style="color: #006080">"--------end----------"</span> &lt;&lt; <span style="color: #006080">"\n"</span>;</pre>
<!--CRLF--></div>
</div>
<p>在这里使用的是QObject的property() 和setProperty方法，来访问成员信息。但是对于使用Q_GADGET宏的类，是不能使用这个方法的，还在寻找解决方法，基本思路当然是重写。</p>
<p><strong>调用注册的函数</strong></p>
<div id="codeSnippetWrapper">
<div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　<span style="color: #0000ff">int</span> ret;</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">　　MyClass newObj;</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> newObj.setMember1( 20 );</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> newObj.setMember2( 50 );</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> QMetaObject::invokeMethod( &amp;newObj, <span style="color: #006080">"func"</span>, Qt::DirectConnection,</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> Q_RETURN_ARG(<span style="color: #0000ff">int</span>, ret ),</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"> Q_ARG(QString, <span style="color: #006080">"+"</span>));</pre>
<!--CRLF--></div>
</div>
<p>
</p>
<p>//普通函数的调用</p>
<p>在MyClass中，我们定义了int func( QString flag );这个函数，利用反射的调用方式如上，主要是理解invokeMethod的用法，其中Qt::DirectConnection是函数的执行方式，分为（异步和同步），Q_RETURN_ARG是返回参数，Q_ARG是传入参数，需要按函数声明中参数的顺序依次传入，Qt最多支持9个参数，对于一般的应用没有问题。还有疑问，请移步具见Qt强大的帮助文档。</p>
<h3><strong>反射的应用</strong></h3>
<p>
</p>
<p>反射反射，就我目前的认知水平来看，通过使用字符串，来实现函数的通用化调用，例如你可以利用反射把很多函数放置到数组中，实现一次遍历，全部调用。</p>
<p>目前我见到的大多是利用反射来操作数据库，例如hibernate，其实可以利用Qt的反射，快速实现所谓的hibernate,(最近自己独立实现了一套，很方便)。</p>
<h2><strong>总结</strong></h2>
<p>这篇文章主要讲了如何使用Qt来实现反射，在实用角度上来讲，我们不需要了解Qt是怎么实现反射的，对于怎么用上面说的很清楚了。大家有什么的新的想法，希望能提出来，来电请咨询<br />
&lt;levard@gmail.com&gt;</p><img src ="http://www.cppblog.com/Cunch/aggbug/201779.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cunch/" target="_blank">Cunch</a> 2013-07-13 22:19 <a href="http://www.cppblog.com/Cunch/archive/2013/07/13/201779.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[面试题1]如何实现不能被继承的C++的类，且能正常使用</title><link>http://www.cppblog.com/Cunch/archive/2013/06/15/201015.html</link><dc:creator>Cunch</dc:creator><author>Cunch</author><pubDate>Fri, 14 Jun 2013 16:18:00 GMT</pubDate><guid>http://www.cppblog.com/Cunch/archive/2013/06/15/201015.html</guid><wfw:comment>http://www.cppblog.com/Cunch/comments/201015.html</wfw:comment><comments>http://www.cppblog.com/Cunch/archive/2013/06/15/201015.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/Cunch/comments/commentRss/201015.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cunch/services/trackbacks/201015.html</trackback:ping><description><![CDATA[<p>&nbsp;</p> <p>貌似好久没有自己写过blog了，对于自己这样一个健忘的人，文采又这么差的人来说，正好借这个机会锻炼一下自己的文字能力，同时记录下学过的东西。</p> <p>貌似用过C++也好久了，碰到这个问题，开始确实感觉到无力，最后还是搜索了下别人是怎么做的。据说是Adobe 07年的面试题。</p> <p>&nbsp;</p> <p>1、第一想法大家都是，既然不能被继承，也就是一旦继承这个类之后，类就不能被初始化。</p> <p>2、可能把类的构造函数私有化，和单例有点像，但是这样类就不能正常使用了。</p> <p>3、实在无力，查了下，他们是通过使用虚继承解决这个问题的。</p> <p>对于虚继承，具体资料见：<a href="http://blog.163.com/xiangzaihui@126/blog/static/166955749201182294317243/">http://blog.163.com/xiangzaihui@126/blog/static/166955749201182294317243/</a></p> <p>里面有一句话很重要：<font color="#ff0000">C++规定:把真正创建对象时所指定的类称为是最派生类,虚基类子对象是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的;</font></p> <p><font color="#ff0000"></font>&nbsp;</p> <p>具体实现代码如下：</p> <div id="codeSnippetWrapper"> <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum1">   1:</span> <span style="color: #cc6633">#include</span> &lt;cstdio&gt;</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum2">   2:</span> <span style="color: #cc6633">#include</span> &lt;iostream&gt;</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum3">   3:</span>&nbsp; </pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum4">   4:</span> <span style="color: #0000ff">template</span>&lt;<span style="color: #0000ff">class</span> T&gt; <span style="color: #0000ff">class</span> CFinal{</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum5">   5:</span>     <span style="color: #0000ff">friend</span> T;</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum6">   6:</span>     <span style="color: #0000ff">private</span>:</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum7">   7:</span>         CFinal(){ std::cout &lt;&lt; <span style="color: #006080">"CFinal()"</span> &lt;&lt; std::endl; }</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum8">   8:</span>         ~CFinal(){}         </pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum9">   9:</span> };</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum10">  10:</span>&nbsp; </pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum11">  11:</span> <span style="color: #0000ff">class</span> CFoo : <span style="color: #0000ff">virtual</span> <span style="color: #0000ff">public</span> CFinal&lt;CFoo&gt;{</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum12">  12:</span>     <span style="color: #0000ff">public</span>:</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum13">  13:</span>         CFoo(){ std::cout &lt;&lt; <span style="color: #006080">"CFoo()"</span> &lt;&lt; std::endl; }</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum14">  14:</span>         ~CFoo(){}</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum15">  15:</span> };</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum16">  16:</span>&nbsp; </pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum17">  17:</span> <span style="color: #0000ff">class</span> CBar : <span style="color: #0000ff">public</span> CFoo{</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum18">  18:</span>     <span style="color: #0000ff">public</span>:</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum19">  19:</span>        CBar() { std::cout &lt;&lt; <span style="color: #006080">"CBar"</span> &lt;&lt; std::endl; }</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum20">  20:</span> };</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum21">  21:</span>&nbsp; </pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum22">  22:</span> <span style="color: #0000ff">int</span> main()</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum23">  23:</span> {</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum24">  24:</span>     <span style="color: #008000">//CBar bar;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum25">  25:</span>     CFoo foo;</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum26">  26:</span>     <span style="color: #0000ff">while</span>(1){}</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum27">  27:</span>     <span style="color: #0000ff">return</span> 0;</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum28">  28:</span> }</pre><!--CRLF--></div></div>
<p>当你创建CBar时，需要初始化CFinal，但是你不是他的friend，不能初始化（上面标红）</p>
<p>如果你会问不要virtual行不行？<br />&nbsp;&nbsp;&nbsp; 不行，由于不要virtual，你可以经过CFoo的friend访问到CFinal，但是有virtual就不同了，你必须直接初始化CFinal（这是C++的规定，避免多次初始化）</p>
<p>&nbsp;</p>
<p>但是有个问题，gcc不能编译通过，在friend T出错，vs2010没有问题，希望知道的能给点帮助。</p>
<p>&nbsp;</p>
<p>参考文献：</p>
<p><a href="http://blog.163.com/xiangzaihui@126/blog/static/166955749201182295845689/">http://blog.163.com/xiangzaihui@126/blog/static/166955749201182295845689/</a>（C++实现不能被继承的类）</p><img src ="http://www.cppblog.com/Cunch/aggbug/201015.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cunch/" target="_blank">Cunch</a> 2013-06-15 00:18 <a href="http://www.cppblog.com/Cunch/archive/2013/06/15/201015.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>曾经的3D资料的网址</title><link>http://www.cppblog.com/Cunch/archive/2013/01/09/197147.html</link><dc:creator>Cunch</dc:creator><author>Cunch</author><pubDate>Wed, 09 Jan 2013 04:25:00 GMT</pubDate><guid>http://www.cppblog.com/Cunch/archive/2013/01/09/197147.html</guid><wfw:comment>http://www.cppblog.com/Cunch/comments/197147.html</wfw:comment><comments>http://www.cppblog.com/Cunch/archive/2013/01/09/197147.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Cunch/comments/commentRss/197147.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cunch/services/trackbacks/197147.html</trackback:ping><description><![CDATA[<p><a href="http://blog.csdn.net/trcj1/article/details/6163753">http://blog.csdn.net/trcj1/article/details/6163753</a></p> <p><a href="http://blog.sina.com.cn/s/blog_5e6fd4290100nhxa.html">http://blog.sina.com.cn/s/blog_5e6fd4290100nhxa.html</a>&nbsp;</p> <p><a href="http://www.cppblog.com/richardhe/archive/2008/03.html">http://www.cppblog.com/richardhe/archive/2008/03.html</a></p> <p><a href="http://www.cnitblog.com/linghuye/archive/2007/06/24/29007.html">http://www.cnitblog.com/linghuye/archive/2007/06/24/29007.html</a></p> <p>3D游戏资料&nbsp; <a href="http://www.cppblog.com/flyindark/archive/2011/05/01/145475.aspx">http://www.cppblog.com/flyindark/archive/2011/05/01/145475.aspx</a>&nbsp; </p> <p> OGRE <a href="http://blog.sina.com.cn/s/articlelist_1159765812_1_1.html">http://blog.sina.com.cn/s/articlelist_1159765812_1_1.html</a></p> <p><a href="http://www.cppblog.com/lovedday/">http://www.cppblog.com/lovedday/</a>&nbsp; 3D知识</p> <p><a href="http://www.cppblog.com/lai3d/">http://www.cppblog.com/lai3d/</a>&nbsp; </p> <p><a href="http://multi-crash.com/">http://multi-crash.com/</a></p> <p><a href="http://www.cppblog.com/billhsu/">http://www.cppblog.com/billhsu/</a></p> <p>&nbsp;</p> <p>网络编程</p> <p><a href="http://www.cppblog.com/Solstice/archive/2011/04/17/144378.html">http://www.cppblog.com/Solstice/archive/2011/04/17/144378.html</a></p> <img src ="http://www.cppblog.com/Cunch/aggbug/197147.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cunch/" target="_blank">Cunch</a> 2013-01-09 12:25 <a href="http://www.cppblog.com/Cunch/archive/2013/01/09/197147.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一道简单的面食题来自CSDN</title><link>http://www.cppblog.com/Cunch/archive/2011/08/20/153983.html</link><dc:creator>Cunch</dc:creator><author>Cunch</author><pubDate>Sat, 20 Aug 2011 13:49:00 GMT</pubDate><guid>http://www.cppblog.com/Cunch/archive/2011/08/20/153983.html</guid><wfw:comment>http://www.cppblog.com/Cunch/comments/153983.html</wfw:comment><comments>http://www.cppblog.com/Cunch/archive/2011/08/20/153983.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/Cunch/comments/commentRss/153983.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cunch/services/trackbacks/153983.html</trackback:ping><description><![CDATA[<p>求较小的值，不能用 比较运算符 if-else ?: while for 内嵌汇编 递归 第三方函数<br />int Min(int a, int b)<br />{<br />&nbsp; //write code here<br />} </p><p>原网址：<a title="http://topic.csdn.net/u/20110816/19/3194c61c-fc4d-41ad-8357-9110d8cdc6b0.html" href="http://topic.csdn.net/u/20110816/19/3194c61c-fc4d-41ad-8357-9110d8cdc6b0.html">http://topic.csdn.net/u/20110816/19/3194c61c-fc4d-41ad-8357-9110d8cdc6b0.html</a> </p><p>&nbsp; </p><p>&nbsp; </p><p>&nbsp; </p><p>下面是我的解答，以及我搜集的解答，以及我的解答 </p><p>需要声明的是没有考虑溢出的情况，对于a-b溢出的问题，建议都转成64位的， </p><p>&nbsp; </p><p>#include &lt;cstdio&gt;<br />#include &lt;assert.h&gt;</p> <p>int Min(int x, int y)<br />{<br />&nbsp;&nbsp;&nbsp; int tmp = (x - y) * (((x - y) &gt;&gt; (sizeof(int) * 8 - 1)) | 1);<br />&nbsp;&nbsp;&nbsp; return ((x + y) - tmp) / 2;<br />}</p> <p>int Min2(int x, int y)<br />{<br />&nbsp;&nbsp;&nbsp; int min[2] = {y, x};<br />&nbsp;&nbsp;&nbsp; int sign = ((x - y) &gt;&gt; (sizeof(int) * 8 - 1)) &amp; 1;<br />&nbsp;&nbsp;&nbsp; return min[sign];<br />}</p> <p>int Min3(int a, int b)<br />{<br />&nbsp;&nbsp;&nbsp; int sum = a + b;<br />&nbsp;&nbsp;&nbsp; b = a - b;<br />&nbsp;&nbsp;&nbsp; a += b * (b &gt;&gt; (sizeof(int) * 8 - 1));<br />&nbsp;&nbsp;&nbsp; return sum - a;<br />}</p> <p>int Min4(int a, int b)<br />{<br />&nbsp;&nbsp;&nbsp; int sign = ((unsigned int)(a - b)) &gt;&gt;31;<br />&nbsp;&nbsp;&nbsp; return a * sign + b * (1 - sign);<br />}</p> <p>int Min5(int a, int b)<br />{<br />&nbsp;&nbsp;&nbsp; return (&amp;b)[(a-b)&gt;&gt;31];<br />}</p>  <p>int main()<br />{<br />&nbsp;&nbsp;&nbsp; int x, y;</p> <p> //&nbsp;&nbsp; assert(Min3(0x80000000, 0x7fffffff) == 0x80000000);<br />&nbsp;&nbsp;&nbsp; while(scanf("%d%d", &amp;x, &amp;y) != EOF)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("the minimal is %d\n", Min5(x, y));<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return 0;<br />}<br />还有大家是怎么编排代码的啊，给我推荐个插件</p> <p>&nbsp;</p> <p>有必要对Min5 介绍下，来自CSND</p> <p>int min(int a, int b)<br />{<br />&nbsp; return (&amp;b)[a-b&gt;&gt;31];<br />}<br />在windows系统上完美<br />&amp;b获得b在堆栈上的指针，a-b&gt;&gt;31的结果只能是-1或者0<br />当a大于b时 (a-b&gt;&gt;31) = 0, 此时函数返回(&amp;b)[0] = b,<br />当a小于b时 (a-b&gt;&gt;31) = -1, 此时函数返回(&amp;b)[-1]=a，<br />为什么(&amp;b)[-1]会是a？<br />函数在调用前会将参数压入堆栈，<br />int m = min(55,33);<br />00E6142E push 21h -&gt; b = 33<br />00E61430 push 37h -&gt; a = 55<br />00E61432 call min (0E610F5h)&nbsp;&nbsp; <br />在调用min函数的时候，参数按从右向左的顺序压入堆栈，&nbsp; <br />堆栈是段连续内存，在windows下堆栈地址是从高到低，<br />也就是先push进入的参数会占用高内存地址，<br />b先被push，所以b占用高内存地址，<br />a被后push,a占用紧连着b的低内存地址，<br />+ &amp;b 0x0030fd80 int *<br />+ &amp;a 0x0030fd7c int *<br />神奇的是，我们知道 (&amp;b)[0]返回的是b本身的值，<br />而(&amp;b)[-1]返回的却是a 的值，也就是说(&amp;b)[-1]返回了上四个字节的值，<br />(&amp;b)[-1] = *(&amp;b - 1) = a;（这里b是int型，所以-1相当于将地址向后偏移4个字节）</p><img src ="http://www.cppblog.com/Cunch/aggbug/153983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cunch/" target="_blank">Cunch</a> 2011-08-20 21:49 <a href="http://www.cppblog.com/Cunch/archive/2011/08/20/153983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个清华老师的一番话，感觉写得很好</title><link>http://www.cppblog.com/Cunch/archive/2011/08/07/152735.html</link><dc:creator>Cunch</dc:creator><author>Cunch</author><pubDate>Sun, 07 Aug 2011 14:09:00 GMT</pubDate><guid>http://www.cppblog.com/Cunch/archive/2011/08/07/152735.html</guid><wfw:comment>http://www.cppblog.com/Cunch/comments/152735.html</wfw:comment><comments>http://www.cppblog.com/Cunch/archive/2011/08/07/152735.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Cunch/comments/commentRss/152735.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cunch/services/trackbacks/152735.html</trackback:ping><description><![CDATA[<div><p>    <span style="font-size: 14.0pt;">一双鞋，耐克的6百多；李宁的4百多；特步的3百多；361的2百多；所以，你毕业于一个什么样的大学很重要。</span>     <br />    <span style="font-size: 14.0pt;">　　一双鞋，在地摊不过几十元，到了商场、专卖店，会涨到一百甚至几百。所以，你呆在什么地方很重要。</span>     <br />    <span style="font-size: 14.0pt;">　　一双鞋，只有合脚并且合意了才能卖出去。所以，沟通了解很重要。</span>     <br />    <span style="font-size: 14.0pt;">　　一双鞋，少了一只，是不值钱的。所以，另一半很重要。</span>     <br />    <span style="font-size: 14.0pt;">　　一双鞋，样式老的，大多很便宜。所以，更新自己的知识很重要。</span>     <br />    <span style="font-size: 14.0pt;">　　一双鞋，积压多年，只能打折处理。所以，碰到合适的就结婚吧。</span>     <br />    <span style="font-size: 14.0pt;">　　一双鞋， 有人3、5年如新的，有人不到一年穿烂的。所以，有个好上司很重要</span>     <br />    <span style="font-size: 14.0pt;">　　这是个现实的社会，感情不能当饭吃，贫穷夫妻百事哀。不要相信电影里的故事情节，那只是个供许多陌生人喧嚣情感的场所。只有不理智和不现实的人才相信</span>     <br />    <span style="font-size: 14.0pt;">　　给自己定目标，一年，两年，五年，也许你出生不如别人好，通过努力，往往可以改变70%的命运。破罐子破摔只能和懦弱做朋友。</span>     <br />    <span style="font-size: 14.0pt;">&nbsp;&nbsp;&nbsp;&nbsp; 1, 一个人，如果你不逼自己一把，你根本不知道自己有多优秀。&nbsp;&nbsp;</span>     <br />    <span style="font-size: 14.0pt;">&nbsp;&nbsp;&nbsp;&nbsp; 2、 赚钱是一种能力，花钱是一种水平，能力可以练，水平是轻易练不出来的。</span>     <br />    <span style="font-size: 14.0pt;">&nbsp;&nbsp;&nbsp;&nbsp; 3、年轻人不可以太狂。</span>     <br />    <span style="font-size: 14.0pt;">&nbsp;&nbsp;&nbsp;&nbsp; 4、一个人的知识，通过学习可以得到；一个人的成长，必须通过磨练。</span>     <br />    <span style="font-size: 14.0pt;">&nbsp;&nbsp;&nbsp;&nbsp; 5、这个世界上好书很多，可以改变命运的书很少。</span>     <br />    <span style="font-size: 14.0pt;">&nbsp;&nbsp;&nbsp;&nbsp; 6、这个世界上朋友很多，可以用一生托付的朋友很少。</span>     <br />    <span style="font-size: 14.0pt;">&nbsp;&nbsp;&nbsp;&nbsp; 7、如果发现一个人，一个地方，一件事，一本书，可以改变你的命运。一定要想办法跟他发生关系，否则，他就跟你没关系。</span>     <br />    <span style="font-size: 14.0pt;">&nbsp;&nbsp;&nbsp;&nbsp; 8、当一个人没有成功的时候，装也装出成功的样子。（因为装的时候，他已经成为你性格的一部分）</span>     <br />    <span style="font-size: 14.0pt;">&nbsp;&nbsp;&nbsp;&nbsp; 9、我们学习的目的，是为了使用，不是知识没有用，而是你没有使用，说明你没有用。</span>     <br />    <span style="font-size: 14.0pt;">&nbsp;&nbsp;&nbsp;&nbsp;10、别人对你的态度，决定了你的命运。 </span>    <br />    <span style="font-size: 14.0pt;">&nbsp;&nbsp;&nbsp;&nbsp;11、笑由心生。</span>     <br />    <span style="font-size: 14.0pt;">&nbsp;&nbsp;&nbsp;&nbsp;12、一个人出门的时候，口袋里都装的钱，装钱的目的，就是为了花出去，那里舒服就往那里花。一个人让别人舒服，他就是一个经营者；别人让你舒服，他就是一个消费者。</span>     <br />    <span style="font-size: 14.0pt;">&nbsp;&nbsp;&nbsp;&nbsp;13、一个人，敢听真话，需要勇气；一个人敢说真话，需要魄力。 </span>    <br />    <span style="font-size: 14.0pt;">&nbsp;&nbsp;&nbsp;&nbsp;14、因为你的存在，让别人快乐起来，你叫朋友；因为你的存在，让别人卓越起来，你是教练；因为你的存在，让别人强大起来，你是领导。</span>     <br />    <span style="font-size: 14.0pt;">&nbsp;&nbsp;&nbsp;&nbsp;15、一件事情，对你伤害的程度与事情本生没有任何关系，取决于你对这件事的态度。</span>     <br />    <span style="font-size: 14.0pt;">&nbsp;&nbsp;&nbsp;&nbsp;16 、你，简单了，你的世界就简单了；你，简单了，事情就简单了。 </span>    <br />    <span style="font-size: 14.0pt;">&nbsp;&nbsp;&nbsp;&nbsp;17、一件事，会干了，好好干；不会干了，乱干。干的次数多了，自然会干，但是，首先，你要干。</span>     <br />    <span style="font-size: 14.0pt;">&nbsp;&nbsp;&nbsp;&nbsp;18、一个人，想要优秀，你必须要接受挑战；一个人，你想要尽快优秀，就要去寻找挑战。</span>     <br />    <span style="font-size: 14.0pt;">&nbsp;&nbsp;&nbsp;&nbsp;19、一个人想要创业，先要学会打工。</span>     <br />    <span style="font-size: 14.0pt;">&nbsp;&nbsp;&nbsp;&nbsp;20、世界上，成功的有两种人，一种人是傻子，一种人是疯子。傻子是会吃亏的人，疯子是会行动的人。</span></p><p>    <br />    <span style="font-size: 14.0pt;">1、 &#8220;太漂亮的女人最后总是孤单一人，因为她不肯向爱情妥协；太帅气的男人最后总是落在不太漂亮的女人手上，因為他向生活妥协。因此太漂亮的女人和太帅气的男 人总是无法长久一起的，因为他们都习惯被围绕被取悦。太漂亮的女人，是堪折的花，越早遇到越好；太帅气的男人，是待熟的果，最好不要太早遇上。&#8221;</span>     <br />    <br />    <span style="font-size: 14.0pt;">2、&#8220;小时候，希望自己快点长大，长大了，却发现遗失了童年；单身时，羡慕恋人的甜蜜，恋爱时，怀念单身的自由。很多事物，没有得到时总觉得美好，得到之后才开始明白：&#8220;我们在得到的同时也在失去。&#8221;</span>     <br />    <br />    <span style="font-size: 14.0pt;color: #ff0000;">ps，有得有失，淡然面对 </span>    <br />    <br />    <span style="font-size: 14.0pt;">3、&#8220;在爱的世界里，没有谁对不起谁，只有谁不懂得珍惜谁。 能够说出的委屈便不算委屈，能够抢走的爱人便不算爱人。 不说出委屈就只能委屈自己，不放走不爱你的人就得不到爱你的人。&#8221;</span>     <br />    <br />    <span style="font-size: 14.0pt;color: #ff0000;">ps，在流泪的时候觉得委屈，其实心里已经慢慢学会坚强 </span>    <br />    <br />    <span style="font-size: 14.0pt;">4、 &#8220;人生的路上，我们都在奔跑，我们总在赶超一些人，也总在被一些人超越。人生的要义，一是欣赏沿途的风景，二是抵达遥远的终点；人生的秘诀，寻找一种最适 合自己的速度，莫因疾进而不堪重荷，莫因迟缓而空耗生命；人生的快乐，在于走自己的路，看自己的景，超越他人不得意，他人超越不失志。&#8221;</span>     <br />    <br />    <span style="font-size: 14.0pt;color: #ff0000;">ps，在绝望时，要抬头看看天，想想存在的意义 </span>    <br />    <br />    <span style="font-size: 14.0pt;">5、&#8220;有一天，友情和爱情碰见。爱情问友情：世上有我了，为什么还要有你的存在？友情笑着说：爱情会让人们流泪，而友情的存在就是帮人们擦干眼泪！&#8221;</span>     <br />    <br />    <span style="font-size: 14.0pt;color: #ff0000;">ps，打心眼里重视朋友，哪怕不联系，不多言，其实也会很依赖 </span>    <br />    <br />    <span style="font-size: 14.0pt;">6、&#8220;我很爱你，却不知道该如何靠近你，所以觉得离开也是可以的。并没有什么不同，结果反正都是这样，是好是坏都不重要，重要的是我曾经迷恋你，就像我迷恋一把晚清的雕花椅。&#8221;</span>     <br />    <br />    <span style="font-size: 14.0pt;color: #ff0000;">ps，安妮的话总是让人在感到温暖的同时有一丝心痛，爱是一门要耗费一生去学习、经营的学问 </span>    <br />    <br />    <span style="font-size: 14.0pt;">7、&#8220;我想给你幸福，却走不进你的世界。我想用我的全世界来换取一张通往你的世界的入场券，不过，那只不过是我的一厢情愿而已。我的世界，你不在乎；你的世界，我被驱逐。我真的喜欢你，闭上眼，以为我能忘记，但流下的泪，却没有骗到自己。&#8221;</span>     <br />    <br />    <span style="font-size: 14.0pt;color: #ff0000;">ps，答应自己，要独自承受这一切 </span>    <br />    <br />    <span style="font-size: 14.0pt;">8、 &#8220;不要让幸福擦肩而过：最懂你的人，总是会一直在身边守护你，不让你有一丝的委屈；真正爱你的人，也许不会说许多爱你的话，却会做许多爱你的事。如果发现 身边有这样的人，请你好好珍惜&#8230;&#8230;幸福不会时时等着你，爱你的人和你爱的人不是随时可以出现，好好把握，不要让自己和幸福擦肩而过&#8221;</span>     <br />    <br />    <span style="font-size: 14.0pt;color: #ff0000;">ps，期待懂我的人 </span>    <br />    <br />    <span style="font-size: 14.0pt;">9、&#8220;人生最美最不能逊色的风景应该是努力。努力是人生的一种精神状态，是对生命的一种赤子之情。努力是拥有之母，拥有是努力之子，一心努力可谓条条大路通罗马。所以，与其规定自己一定要成为一个什么样的人物，获得什么东西，不如磨练自己做一个努力的人。&#8221;</span>     <br />    <br />    <span style="font-size: 14.0pt;color: #ff0000;">ps，早就该明白，最美的不是成功的那一刻，而是事后回想奋斗过程中的艰辛 </span>    <br />    <br />    <span style="font-size: 14.0pt;">10、&#8220;人生，没有永远的伤痛，没有过不去的坎。还是让我们学学杨柳，看似柔弱却坚韧，狂风吹不断；太刚强的树干，却在风中折枝。学会放弃，学会承受，学会坚强，学会微笑，那是一种别样的美丽！适当的放弃，是人生优雅的转身。&#8221;</span>     <br />    <br />    <span style="font-size: 14.0pt;color: #ff0000;">ps，没有过不去的坎，让自己跨越的姿势美一点 </span>    <br />    <br />    <span style="font-size: 14.0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、靠山山会倒，靠人人会跑，只有自己最可靠。<br />　　<br />　　2、没有人陪你走一辈子，所以你要适应孤独，没有人会帮你一辈子，所以你要奋斗一生。<br />　　<br />　　3、与其用泪水悔恨今天，不如用汗水拼搏今天。<br />　　<br />　　4、当眼泪流尽的时候，留下的应该是坚强。<br />　　<br />　　5、人生就像一杯没有加糖的咖啡，喝起来是苦涩的，回味起来却有久久不会退去的余香。<br />　　<br />　　6、有一种缘，放手后成为风景，有一颗心，坚持中方现真诚。<br />　　<br />　　7、选择自己所爱的，爱自己所选择的。<br />　　<br />　　8、这一秒不放弃，下一秒就会有希望。<br />　　<br />　　9、曾经拥有的不要忘记，难以得到的更要珍惜，属于自己的不要放弃，不属于自己的不要强求，已经失去的留作回忆。<br />　　<br />　　10、喜欢就该珍惜，珍惜就别放弃。<br />　　<br />　　11、人生就是一场旅行，不在乎目的地，在乎的是沿途的风景以及看风景的心情。<br />　　<br />　　12、不求与人相比，但求超越自己，要哭就哭出激动的泪水，要笑就笑出成长的性格。<br />　　<br />　　13、为你的难过而快乐的是敌人，为你的快乐而快乐的是朋友，为你的难过而难过的才是你的知己。<br />　　<br />　　14、如果爱，请深爱；如不爱，请离开。<br />　　<br />　　15。只要心中有希望存在，就有幸福存在。<br />　　<br />　　第一句&#8220;人都是逼出来的&#8221;。每个人都是有潜能的，生于安乐，死于忧患，所以，当面对压力的时候，不要焦燥，也许这只是生活对你的一点小考验，相信自己，一切都能处理好，逼急了好汉可以上梁山，时世造英雄，穷则思变，人只有压力才会有动力。<br />　　<br />　　第二句：&#8220;如果你简单，这个世界就对你简单&#8221;。简单生活才能幸福生活，人要知足常乐，宽容大度，什么事情都不能想繁杂，心灵的负荷重了，就会怨天忧人。要定期的对记忆进行一次删除，把不愉快的人和事从记忆中摈弃。<br />　　<br />　　第三句：&#8220;人生没有彩排，每一天都是现场直播&#8221;。偶尔会想，如果人生真如一场电子游戏，玩坏了可以选择重来，生活会变成什么样子？正因为时光流逝一去不复返，每一天都不可追回，所以更要珍惜每一寸光阴，孝敬父母、疼爱孩子、体贴爱人、善待朋友。<br />　　<br />　　第四句：&#8220;怀才就象怀孕，时间久了才会让人看出来&#8221;。人，切莫自以为是，地球离开了谁都会转，古往今来，恃才放肆的人都没有好下场。所以，即便再能干，也一定要保持谦虚谨慎，做好自己的事情，是金子总会发光。<br />　　<br />　 　第五句：&#8220;过去酒逢知已千杯少，现在酒逢千杯知已少&#8221;。不甚酒力，体会不了酒的美味，但却能感受知已的妙处。没有朋友的人生是孤独的，不完整的，可是， 因为生活的忙碌，渐渐少了联络，友谊就变的淡了，所以，抽点时间，联络朋友一起聊聊天，让情谊在笑声中升腾，当朋友遇到了难题的时候，一定要记得挺身而 出，即便帮不了忙，安慰也是最大的支持。<br />　　<br />　　第六句：&#8220;人生如果错了方向，停止就是进步&#8221;。人，总是很难改正自己的缺点，人，也总是 很难发现自己的错误。有时，明知错了，却欲罢不能，一错再错，把握正确的方向，坚守自己的原则，世界上的诱惑很多，天上永远不会掉馅饼，不要因为贪图一时 的快乐而付出惨痛的代价，如果发现错了，一定要止步。<br />　　<br />　　第七句：&#8220;人生两大悲剧：一是万念俱灰，一是踌躇满志&#8221;。现代的人好象特别 脆弱，报纸上天天报道众多名人得抑郁症，这些人一定是从一个极端走向别一个极端。正因为踌躇满志，才坚信自已是完美的，是无所不能的，如果受到一点挫折， 就会变得极度自卑，甚至失去继续生活的勇气。为自己找一个准确的定位，享受生活乐趣吧。<br />　　<br />　　第八句：&#8220;人生和爱情一样，错过了爱情就错过了人生&#8221;。爱情是什么？让人无所适从，让人神魂颠倒，面对爱情的时候，勇敢一点，大胆说出自己的爱，有花堪摘直须摘，莫待无花空折枝。人，总会生老病死，怎么过都是一生，错过了爱情就错过了生命的精彩。<br />　　<br />　　第九句：&#8220;天下有钱人终成眷属&#8221;。现代社会的人变得越来越势利，爱情也越来越无足轻重，于是我不得不相信&#8220;天下有钱人终成眷属&#8221;是对现代爱情的最确切的描述。<br />　　<br />　　第十句：&#8220;要成功，需要朋友，要取得巨大的成功，需要敌人&#8221;。有竞争才有发展，因为有了敌人的存在，因为有了不服输的决心，才会努力地做好自己的事。所以，有时候，敌人比朋友的力量更大，天下没有永远的敌人，却有永远的朋友，有些时候，敌人也可以变成朋友。 </span>    <br />    <br />    <br />    <br />    <span style="font-size: 14.0pt;">1.也许愈是美丽就愈是脆弱，就像盛夏的泡沫。</span></p><p>    <br />    <span style="font-size: 14.0pt;">2.&nbsp;&nbsp;&#8220;如果爱你可以让你幸福，那么我就爱你；如果不爱你可以让你幸福，那么我就只是喜欢你。&#8221; </span>    <br />    <span style="font-size: 14.0pt;">　&#8220;那&#8212;&#8212;你的幸福呢？&#8221; </span>    <br />    <span style="font-size: 14.0pt;">　&#8220;我的幸福，就是看着你幸福。&#8221;</span>     <br />    <br />    <span style="font-size: 14.0pt;">3. 如果一开始，你就不要出现在我的面前，那么，我也许就不会知道幸福的滋味。你何其残忍，把所　有的爱满满地那么卒不及防地都给了我，告诉我，你永远喜欢我 爱我，永远不会离开我，让我错以　为，我可以幸福得象个被宠溺的孩子，让我错以为，只要抱住你，就可以拥有整个世界。</span>     <br />    <br />    <span style="font-size: 14.0pt;">4.&#8220;你会喜欢我多久？&#8221; </span>    <br />    <span style="font-size: 14.0pt;">　&#8220;永远。&#8221; </span>    <br />    <span style="font-size: 14.0pt;">　&#8220;即使你已经不爱我了，即使你已经忘记我了，即使你已经从这个世界消失。我依然会爱着你。&#8221; </span>    <br />    <span style="font-size: 14.0pt;">　&#8220;乱讲，都不在这个世界上了，还怎么爱我？&#8221; </span>    <br />    <span style="font-size: 14.0pt;">　&#8220;我会去找一个天使，让它替我来爱你。&#8221;</span>     <br />    <br />    <span style="font-size: 14.0pt;">5.如果失去了你的爱，我在这世界上，就象失去了灵魂的空壳，再也找不到家。</span>     <br />    <br />    <span style="font-size: 14.0pt;">6.当你在我身边快乐时，幸福在我身边，当我听到你笑声时，幸福已经在我身边。 </span>    <br />    <br />    <span style="font-size: 14.0pt;">7. 习惯了软弱，心也会逐渐软弱起来，习惯了依赖，会渐渐忘记如何依靠自己。一旦眼泪失去效力，　一旦陷入孤立无援的境地，如果变得软弱了，该怎样去保护身边的亲人和自己？ </span>    <br />    <br />    <span style="font-size: 14.0pt;">8.我很想你，却不想见你。 </span>    <br />    <br />    <span style="font-size: 14.0pt;">9.如果一开始你没有告诉我，你永远喜欢我，永远不会离开我，只要抱住你，就可以拥有整个世界。 </span>    <br />    <br />    <span style="font-size: 14.0pt;">10.那一年，是谁三天三夜不眠不休种下满塘荷花，是谁抱着14支粉红色的荷花说他喜欢我，是谁说会　永远保护我、让我开心。难道，你一开始就是在骗我？请你不要再来伤害我，我会难过，心像被撕　碎一样。如果你还喜欢我，请你珍惜我。如果你不喜欢我，我会离开你。</span>     <br />    <br />    <br />    <span style="font-size: 14.0pt;">12.不喜欢又能怎样？心里有数就可以了。不可能要求世上所有人都是你的朋友，都是关爱你的人。珍　惜对你好的人，其他的，就随她们去吧！ </span>    <br />    <br />    <span style="font-size: 14.0pt;">13.既然对世人宣布了我们的恋情，我们就是一对了，永不分手，不离不弃。 </span>    <br />    <br />    <span style="font-size: 14.0pt;">14.上天不会只永远眷顾一个人，给她多大的幸运，日后必会给她多大的磨难。她能做到的只是把握住　幸福的时机，凭借它努力地冲上最大可能的顶峰。所以，绝不可以错过任何机会。 </span>    <br />    <br />    <span style="font-size: 14.0pt;">15.如果你始终没办法爱上我，我会给你分手的权利。 </span>    <br />    <br />    <span style="font-size: 14.0pt;">16.世界上没有什么人是可以真正相信的，只有相信自己，因为只有自己不会背叛自己，欺骗自己，离开自己。 </span>    <br />    <br />    <span style="font-size: 14.0pt;">17.我想要靠自己的力量立足在这个世界，有足够的影响力，有足够的钱，可以守护我想守护的人，可　以在面对任何突如其来的灾难时，都不会被打倒。 </span>    <br />    <br />    <br />    <br />    <span style="font-size: 14.0pt;">1.那个在不经意中，也许就改变了我一生的男孩。我相信总有一天，我们会在世界的屋顶再次相遇。 </span>    <br />    <span style="font-size: 14.0pt;">　不要轻易用过去来衡量生活的幸与不幸，每个人的生命都是可以绽放美丽的，只要你珍惜。 </span>    <br />    <span style="font-size: 14.0pt;">　&#8212;&#8212;《木吉他的夏天》 </span>    <br />    <br />    <span style="font-size: 14.0pt;">2.没有人永远十七岁，但永远有人十七岁。 </span>    <br />    <span style="font-size: 14.0pt;">　因为依赖一份只有我记得的回忆，我已经长大。长到可以勇敢的面对人间所有的风风雨雨。 </span>    <br />    <span style="font-size: 14.0pt;">　&#8212;&#8212;《来不及学坏》 </span>    <br />    <br />    <span style="font-size: 14.0pt;">3.我一直喜欢下午的阳光。它让我相信这个世界任何事情都会有转机，相信命运的宽厚和美好。 </span>    <br />    <span style="font-size: 14.0pt;">　我们终归要长大，带着一种无怨的心情悄悄地长大。 </span>    <br />    <span style="font-size: 14.0pt;">　归根到底，成长是一种幸福。 </span>    <br />    <span style="font-size: 14.0pt;">　&#8212;&#8212;《按时长大》 </span>    <br />    <br />    <span style="font-size: 14.0pt;">4.喜欢的歌静静地听，喜欢的人远远地看。 </span>    <br />    <span style="font-size: 14.0pt;">　&#8212;&#8212;《我要我们在一起》</span>     <br />    <br />    <span style="font-size: 14.0pt;">5.其实，人字的结构就是相互的支撑，只要你愿意，谁都可以给谁幸福！ </span>    <br />    <span style="font-size: 14.0pt;">　&#8212;&#8212;《我要我们在一起》 </span>    <br />    <br />    <span style="font-size: 14.0pt;">6.我知道无论我走到哪里，你都会陪在我身边。陪我哭，陪我笑，陪我等待，陪我开花。 </span>    <br />    <span style="font-size: 14.0pt;">　&#8212;&#8212;《女生派》 </span>    <br />    <br />    <span style="font-size: 14.0pt;">7.爱情像糖衣,我囫囵吞下,享受瞬间的甜蜜 </span>    <br />    <span style="font-size: 14.0pt;">　－－《糖衣》 </span>    <br />    <br />    <span style="font-size: 14.0pt;">8.最痛的痛是原谅，最黑的黑是背叛 </span>    <br />    <span style="font-size: 14.0pt;">　－－《糖衣－临暗》 </span>    <br />    <br />    <span style="font-size: 14.0pt;">9.我们都是单翅膀的天使，只有拥抱着才能飞翔。 </span>    <br />    <span style="font-size: 14.0pt;">　&#8212;&#8212;《挥着翅膀的女孩》 </span>    <br />    <br />    <span style="font-size: 14.0pt;">10.我们生活在同一个温暖的水域，也许偶尔会被水草缠绕，但因为彼此温暖的呼吸，相信都不会是死　结。如果我说我爱你，我一直都爱你，不知道你会不会相信？</span>     <br />    <span style="font-size: 14.0pt;">　&#8212;&#8212;《双鱼记》 </span>    <br />    <br />    <span style="font-size: 14.0pt;">11.成长就是这样，痛并快乐着。你得接受这个世界带给你的所有伤害，然后无所谓惧的长大。 </span>    <br />    <span style="font-size: 14.0pt;">　&#8212;&#8212;《双鱼记》</span>     <br />    <br />    <span style="font-size: 14.0pt;">12.爱是一场战争,我不怕受伤只怕你不快乐. </span>    <br />    <span style="font-size: 14.0pt;">　&#8212;&#8212;《离爱一个ID的距离》 </span>    <br />    <br />    <span style="font-size: 14.0pt;">13.是别过头去,你就感觉不到我的深情? </span>    <br />    <span style="font-size: 14.0pt;">　&#8212;&#8212;《离爱一个ID的距离》 </span>    <br />    <br />    <span style="font-size: 14.0pt;">14.爱情是一场注定的潮水，而自己就是一叶随时等待靠岸的小舟。潮来潮去，随波逐流，载沉载浮，　在劫难逃。 </span>    <br />    <span style="font-size: 14.0pt;">　&#8212;&#8212;《离爱一个ID的距离》 </span>    <br />    <br />    <span style="font-size: 14.0pt;">15.在爱情这场戏里总是有一个主角和一个配角，累的永远是主角，伤的永远是配角。 </span>    <br />    <span style="font-size: 14.0pt;">　&#8212;&#8212;《爱在仙境的日子》 </span>    <br />    <br />    <span style="font-size: 14.0pt;">16.像流水一样。金钱，地位，美丽，还有爱情，最后都会像流水一样。 </span>    <br />    <span style="font-size: 14.0pt;">　&#8212;&#8212;《爱在仙境的日子》 </span>    <br />    <br />    <span style="font-size: 14.0pt;">17.我一路狂奔，渴望在拥挤匆忙的人群里找到一个和我相似的面孔，她和我有相似的命运。我可以在　她的身上看到自己命运的参照，何去何从，不再那么仓皇。 </span>    <br />    <span style="font-size: 14.0pt;">　&#8212;&#8212;《小妖的金色城堡》</span>     <br />    <br />    <span style="font-size: 14.0pt;">18.我没有月亮。 </span>    <br />    <span style="font-size: 14.0pt;">　这个月亮是很多人的，但不是我的。温暖遥不可及。 </span>    <br />    <span style="font-size: 14.0pt;">　&#8212;&#8212;《校服的裙摆》 </span>    <br />    <br />    <span style="font-size: 14.0pt;">19.我们就是这样苍老的，从时光的一端辗转到时光的另一端，请别说再见，不需要再见。 </span>    <br />    <span style="font-size: 14.0pt;">　&#8212;&#8212;《校服的裙摆》 </span>    <br />    <br />    <span style="font-size: 14.0pt;">20.甜言蜜语，说给左耳听。 </span>    <br />    <span style="font-size: 14.0pt;">　&#8212;&#8212;《左耳》 </span>    <br />    <br />    <span style="font-size: 14.0pt;">21.我没有勇气折断我的翅膀，却也飞不到任何地方。 </span>    <br />    <span style="font-size: 14.0pt;">　&#8212;&#8212;《左耳》 </span>    <br />    <br />    <span style="font-size: 14.0pt;">22.我们的爱情染上了尘埃 等待一场风暴的洗礼 </span>    <br />    <span style="font-size: 14.0pt;">　&#8212;&#8212;《左耳》 </span>    <br />    <br />    <span style="font-size: 14.0pt;">23.有些人，有些事,是不是你想忘记,就真的能忘记? </span>    <br />    <span style="font-size: 14.0pt;">　&#8212;&#8212;《左耳》 </span>    <br />    <br />    <span style="font-size: 14.0pt;">24.最痛苦的是，消失了的东西，它就永远的不见了，永远都不会再回来，却偏还要留下一根细而尖的针，一直插在你心头，一直拔不去，它想让你疼，你就得疼 </span>    <br />    <span style="font-size: 14.0pt;">　&#8212;&#8212;《左耳》 </span>    <br />    <br />    <br />    <br />    <br />    <span style="font-size: 14.0pt;">你永远也看不见我最爱你的时候，因为我只有在看不见你的时候，才最爱你。同样，你永远也看不见我最寂寞的时候，因为我只有在你看不见我的时候，我才最寂寞。 </span>    <br />    <br />    <span style="font-size: 14.0pt;">要理想不要幻想，要激情不要矫情。凡事知足常乐</span></p></div><img src ="http://www.cppblog.com/Cunch/aggbug/152735.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cunch/" target="_blank">Cunch</a> 2011-08-07 22:09 <a href="http://www.cppblog.com/Cunch/archive/2011/08/07/152735.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对程序员来说最好的发明</title><link>http://www.cppblog.com/Cunch/archive/2011/08/04/152447.html</link><dc:creator>Cunch</dc:creator><author>Cunch</author><pubDate>Thu, 04 Aug 2011 08:18:00 GMT</pubDate><guid>http://www.cppblog.com/Cunch/archive/2011/08/04/152447.html</guid><wfw:comment>http://www.cppblog.com/Cunch/comments/152447.html</wfw:comment><comments>http://www.cppblog.com/Cunch/archive/2011/08/04/152447.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/Cunch/comments/commentRss/152447.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cunch/services/trackbacks/152447.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IT行业，每个公司都有自己的一份代码规范，为的是大家可以互相更好的交流，同时对外发布的时候，感觉是一个人干的，这样很好。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 今天有个人问我，怎么自动生成一个文件头，其实我早就想了，就是太懒了，同事发现Visual assist是可以办到的，上网一搜发现这个功能真是很强大啊</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 很多自动生成，For example 写个win32程序，开始的那些操作大概就得100多行吧，现在告诉你只要几个字母就能搞定了，太牛逼了。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; </p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 那我就班门弄斧了，大牛别拍我啊</p> <p>&nbsp;&nbsp;&nbsp; 第一步：到你可以修改snippet的地方来</p> <p><a href="http://www.cppblog.com/images/cppblog_com/Cunch/Windows-Live-Writer/318dd5d3fc3f_DEB3/image_5.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" alt="image" src="http://www.cppblog.com/images/cppblog_com/Cunch/Windows-Live-Writer/318dd5d3fc3f_DEB3/image_thumb_1.png" border="0" height="132" width="582" /></a></p> <p> 点击[Edit]， 进入编辑器;</p> <p>第二步：</p> <p><a href="http://www.cppblog.com/images/cppblog_com/Cunch/Windows-Live-Writer/318dd5d3fc3f_DEB3/image_7.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" alt="image" src="http://www.cppblog.com/images/cppblog_com/Cunch/Windows-Live-Writer/318dd5d3fc3f_DEB3/image_thumb_2.png" border="0" height="362" width="535" /></a>&nbsp; </p> <p>在这里,你会发现很多缩写，如果用过的化，现在知道它藏那了把，在这里可以根据自己的设置来进行添加</p> <p>注意要写Shortcut，这个缩写才能起作用。</p> <p>下面给个win32自动生成的例子吧。</p> <p>首先：</p> <p><a href="http://www.cppblog.com/images/cppblog_com/Cunch/Windows-Live-Writer/318dd5d3fc3f_DEB3/image_11.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" alt="image" src="http://www.cppblog.com/images/cppblog_com/Cunch/Windows-Live-Writer/318dd5d3fc3f_DEB3/image_thumb_4.png" border="0" height="393" width="583" /></a></p> <p>在Shortcut中填写win_creator，点击运用就好了，然后OK拉</p> <p>在代码中，写win_creator，后选中下面那个蓝色，回车就生成了。</p>       <p><a href="http://www.cppblog.com/images/cppblog_com/Cunch/Windows-Live-Writer/318dd5d3fc3f_DEB3/image_13.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" alt="image" src="http://www.cppblog.com/images/cppblog_com/Cunch/Windows-Live-Writer/318dd5d3fc3f_DEB3/image_thumb_5.png" border="0" height="116" width="444" /></a></p> <p>显示下生成的代码（写得还很简洁啊）：</p> <p><a href="http://www.cppblog.com/images/cppblog_com/Cunch/Windows-Live-Writer/318dd5d3fc3f_DEB3/image_15.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" alt="image" src="http://www.cppblog.com/images/cppblog_com/Cunch/Windows-Live-Writer/318dd5d3fc3f_DEB3/image_thumb_6.png" border="0" height="348" width="705" /></a></p> <p>&nbsp;</p> <p>至于其他运用之类的，大家可以参考：</p> <p><a title="http://www.cppblog.com/yeduwu/articles/97785.html" href="http://www.cppblog.com/yeduwu/articles/97785.html">http://www.cppblog.com/yeduwu/articles/97785.html</a>， 这个有很多关于代码注释的内容。</p> <p>&nbsp;</p> <p>大家有啥更好用法或者东西，希望大家分享下啊。</p><img src ="http://www.cppblog.com/Cunch/aggbug/152447.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cunch/" target="_blank">Cunch</a> 2011-08-04 16:18 <a href="http://www.cppblog.com/Cunch/archive/2011/08/04/152447.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个3D的多人在线游戏， 服务端 + 客户端</title><link>http://www.cppblog.com/Cunch/archive/2011/07/09/150544.html</link><dc:creator>Cunch</dc:creator><author>Cunch</author><pubDate>Sat, 09 Jul 2011 08:22:00 GMT</pubDate><guid>http://www.cppblog.com/Cunch/archive/2011/07/09/150544.html</guid><wfw:comment>http://www.cppblog.com/Cunch/comments/150544.html</wfw:comment><comments>http://www.cppblog.com/Cunch/archive/2011/07/09/150544.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/Cunch/comments/commentRss/150544.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cunch/services/trackbacks/150544.html</trackback:ping><description><![CDATA[<blockquote> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最近学院组织了一个实训，要求是利用Socket通信和D3D的知识， 写一个多人在线的游戏， 服务端是在linux下， 客户是在Windows下； 写这个的目的是想让大家给我找错, 欢迎大家的意见。我的QQ 是343167101，希望和大家一起讨论。</p></blockquote> <p>&nbsp;</p> <p>服务端（linux下）：</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 服务端使用的是非阻塞Select模型，下面是项目的结构图： </p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.cppblog.com/images/cppblog_com/Cunch/Windows-Live-Writer/1f1d3852caa2_D85F/%E6%9C%8D%E5%8A%A1%E5%99%A83_4.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="服务器3" alt="服务器3" src="http://www.cppblog.com/images/cppblog_com/Cunch/Windows-Live-Writer/1f1d3852caa2_D85F/%E6%9C%8D%E5%8A%A1%E5%99%A83_thumb_1.jpg" border="0" height="396" width="781" /></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 由于其中有很多的消息，其次为了扩展，所以使用了工厂模式，我把从客户端接受的消息都放在输入缓冲区中， 向客户端发送的消息都放在输出缓冲区中， 为了对玩家进行管理</p> <p>设计了一个Manager(单例)来管理玩家，主要是为了实现删除，添加，获取等操作， 所以就用了STL中Map这个容器。值得一提的是InputSocketStream是使用的一种循环队列的思</p> <p>想设计的。</p> <p><a href="/Files/Cunch/GameServer__2_.zip">服务器端代码</a></p> <p>&nbsp;</p> <p>客户端：</p> <p>客户端由于是在windows中，所以使用了Windows的socket通信，同时使用了多线程，其中一个线程主要是为了接受玩家的数据，主线程主要是为了负责逻辑和渲染。</p> <p>渲染层的结构：</p> <blockquote> <p>&nbsp;</p></blockquote> <p><a href="http://www.cppblog.com/images/cppblog_com/Cunch/Windows-Live-Writer/1f1d3852caa2_D85F/%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%B8%B2%E6%9F%93_2.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="客户端渲染" alt="客户端渲染" src="http://www.cppblog.com/images/cppblog_com/Cunch/Windows-Live-Writer/1f1d3852caa2_D85F/%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%B8%B2%E6%9F%93_thumb.jpg" border="0" height="354" width="779" /></a></p> <p>&nbsp;</p> <p>CUI端，目前做的比较简单就是使用CEGUI这个重量级的界面库，发现不是那么好用，太庞大了。</p> <p>&nbsp;</p> <p>通信端：（主要是负责和服务器的通信），包括玩家和虚拟玩家的消息</p> <p>&nbsp;</p> <p><a href="http://www.cppblog.com/images/cppblog_com/Cunch/Windows-Live-Writer/1f1d3852caa2_D85F/%E5%AE%A2%E6%88%B7%E7%AB%AF4_2.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="客户端4" alt="客户端4" src="http://www.cppblog.com/images/cppblog_com/Cunch/Windows-Live-Writer/1f1d3852caa2_D85F/%E5%AE%A2%E6%88%B7%E7%AB%AF4_thumb.jpg" border="0" height="255" width="795" /></a></p> <p>&nbsp;</p> <p>想用的需要被指CEGUI 0.7.1</p> <p><a href="/Files/Cunch/NetGameClient.zip">客户端的代码,</a>： 由于资源文件太大了就不上传了<br /></p> <p>目前还存在的问题就是虚拟玩家的同步问题，不知到有高手懂这个问题的吗，提供个思路.</p> <p>我的思路是这样的，比如玩家按下W键，向服务器发送这个消息，服务器负责转发给其他的客户端，该客户端开始走动，知道玩家抬起W键后发送停止的消息给服务器，服务器负责转发。但是在实现这个问题的时候，由于我使用了DiretInput，但是响应Keydown事件时，按下W键时，Keydown执行了很多次，没有找到一个办法知道keydown这个事件什么时候停止的。谁有好的做法希望能告诉我。 </p><p>下面发个游戏的截图：</p> <p>&nbsp;</p> <p><a href="http://www.cppblog.com/images/cppblog_com/Cunch/Windows-Live-Writer/1f1d3852caa2_D85F/image_2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" alt="image" src="http://www.cppblog.com/images/cppblog_com/Cunch/Windows-Live-Writer/1f1d3852caa2_D85F/image_thumb.png" border="0" height="513" width="950" /></a></p><img src ="http://www.cppblog.com/Cunch/aggbug/150544.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cunch/" target="_blank">Cunch</a> 2011-07-09 16:22 <a href="http://www.cppblog.com/Cunch/archive/2011/07/09/150544.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]C++ 面试常见问题</title><link>http://www.cppblog.com/Cunch/archive/2011/04/12/144038.html</link><dc:creator>Cunch</dc:creator><author>Cunch</author><pubDate>Tue, 12 Apr 2011 07:32:00 GMT</pubDate><guid>http://www.cppblog.com/Cunch/archive/2011/04/12/144038.html</guid><wfw:comment>http://www.cppblog.com/Cunch/comments/144038.html</wfw:comment><comments>http://www.cppblog.com/Cunch/archive/2011/04/12/144038.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Cunch/comments/commentRss/144038.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cunch/services/trackbacks/144038.html</trackback:ping><description><![CDATA[<div class="BlogContent TextContent">
<p><span style="FONT-SIZE: 12px"><span style="FONT-SIZE: medium"><font size=3><strong><span style="COLOR: #800000">1.求下面函数的返回值（微软）<br></span></strong><br>int func(x)<br>{<br>int countx = 0;<br>while(x)<br>{<br>countx ++;<br>x = x&amp;(x-1);<br>}<br>return countx;<br>} <br><br>假定x = 9999。 答案：8<br><br>思路：将x转化为2进制，看含有的1的个数。<br><br></font></span><span style="FONT-SIZE: medium"><font size=3><span style="COLOR: #800000"><strong>2. 什么是&#8220;引用&#8221;？申明和使用&#8220;引用&#8221;要注意哪些问题？<br></strong></span><br>答：引用就是某个目标变量的<span style="COLOR: #0000ff">&#8220;别名&#8221;(alias)，</span>对<span style="COLOR: #0000ff">应用的操作与对变量直接操作效果完全相同</span>。<span style="COLOR: #0000ff"><strong>申明一个引用的时候，切记要对其进行初始化</strong></span>。引用声明完毕后，相当于目标变量名有两个名称，即该目标原名称和引用名，<strong>不能再把该引用名作为其他变量名的别名</strong>。声明一个引用，不是新定义了一个变量，它只表示该引用名是目标变量名的一个别名，<span style="COLOR: #ff0000"><strong>它本身不是一种数据类型，因此引用本身不占存储单元，系统也不给引用分配存储单元</strong></span>。不能建立数组的引用。<br><br><strong><span style="COLOR: #800000">3. <span style="COLOR: #ff0000">将&#8220;引用&#8221;作为函数参数有哪些特点？</span></span></strong><br><br>（1）<span style="COLOR: #ff0000"><strong>传递引用给函数与传递指针的效果是一样的</strong></span>。这时，被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用，所以在<strong><span style="BACKGROUND-COLOR: #888888">被调函数中对形参变量的操作就是对其相应的目标对象（在主调函数中）的操作</span></strong>。<br><br>（2）使用<span style="COLOR: #ff0000">引用传递函数的参数，在内存中并没有产生实参的副本</span>，它是直接对实参操作；而使用<span style="COLOR: #ff0000">一般变量传递函数的参数，当发生函数调用时，需要给形参分配存储单元</span>，形参变量是实参变量的副本；如果<span style="COLOR: #ff0000">传递的是对象，还将调用拷贝构造函数</span>。因此，当参数传递的数据较大时，用<strong><span style="BACKGROUND-COLOR: #888888">引用比用一般变量传递参数的效率和所占空间都好</span></strong>。<br><br>（3）使用指针作为函数的参数虽然也能达到与使用引用的效果，但是，在<strong>被调函数中同样要给形参分配存储单元，且需要重复使用"*指针变量名"的形式进行运算，这很容易产生错误且程序的阅读性较差</strong>；另一方面，在<strong>主调函数的调用点处，必须用变量的地址作为实参</strong>。而引用更容易使用，更清晰。<br><br><span style="COLOR: #800000"><strong>4. 在什么时候需要使用&#8220;常引用&#8221;？</strong></span>　<br><br>如果既要利用引用提高程序的效率，又要保护传递给函数的数据不在函数中被改变，就应使用常引用。常引用声明方式：const 类型标识符 &amp;引用名=目标变量名；<br><br>例1<br><br>int a ;<br>const int &amp;ra=a;<br>ra=1; //错误<br>a=1; //正确<br><br>例2<br><br>string foo( );<br>void bar(string &amp; s);<br><br>那么下面的表达式将是非法的：<br><br>bar(foo( ));<br>bar("hello world");<br><br>原因在于foo( )和"hello world"串都会产生一个临时对象，而在C++中，这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型，这是非法的。<br><br>引用型参数应该在能被定义为const的情况下，尽量定义为const 。<br><br></font></span><span style="FONT-SIZE: medium"><font size=3><strong><span style="COLOR: #800000">5. 将&#8220;引用&#8221;作为函数返回值类型的格式、好处和需要遵守的规则?<br></span></strong><br>格式：类型标识符 &amp;函数名（形参列表及类型说明）{ //函数体 }<br><br>好处：在内存中不产生被返回值的副本；（注意：正是因为这点原因，所以返回一个局部变量的引用是不可取的。因为随着该局部变量生存期的结束，相应的引用也会失效，产生runtime error!<br><br>注意事项：<br><br>（1）不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。主要原因是局部变量会在函数返回后被销毁，因此被返回的引用就成为了"无所指"的引用，程序会进入未知状态。<br><br>（2）不能返回函数内部new分配的内存的引用。这条可以参照Effective C++[1]的Item 31。虽然不存在局部变量的被动销毁问题，可对于这种情况（返回函数内部new分配内存的引用），又面临其它尴尬局面。例如，被函数返回的引用只是作为一个临时变量出现，而没有被赋予一个实际的变量，那么这个引用所指向的空间（由new分配）就无法释放，造成memory leak。<br><br>（3）可以返回类成员的引用，但最好是const。这条原则可以参照Effective C++[1]的Item 30。主要原因是当对象的属性是与某种业务规则（business rule）相关联的时候，其赋值常常与某些其它属性或者对象的状态有关，因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常量引用（或指针），那么对该属性的单纯赋值就会破坏业务规则的完整性。<br><br>（4）流操作符重载返回值申明为&#8220;引用&#8221;的作用：<br><br>流操作符&lt;&lt;和&gt;&gt;，这两个操作符常常希望被连续使用，例如：cout &lt;&lt; "hello" &lt;&lt; endl;　因此这两个操作符的返回值应该是一个仍然支持这两个操作符的流引用。可选的其它方案包括：返回一个流对象和返回一个流对象指针。但是对于返回一个流对象，程序必须重新（拷贝）构造一个新的流对象，也就是说，连续的两个&lt;&lt;操作符实际上是针对不同对象的！这无法让人接受。对于返回一个流指针则不能连续使用&lt;&lt;操作符。因此，返回一个流对象引用是惟一选择。这个唯一选择很关键，它说明了引用的重要性以及无可替代性，也许这就是C++语言中引入引用这个概念的原因吧。赋值操作符=。这个操作符象流操作符一样，是可以连续使用的，例如：x = j = 10;或者(x=10)=100;赋值操作符的返回值必须是一个左值，以便可以被继续赋值。因此引用成了这个操作符的惟一返回值选择。<br><br>例3<br><br>＃i nclude &lt;iostream.h&gt;<br>int &amp;put(int n);<br>int vals[10];<br>int error=-1;<br>void main()<br>{<br>put(0)=10; //以put(0)函数值作为左值，等价于vals[0]=10;<br>put(9)=20; //以put(9)函数值作为左值，等价于vals[9]=20;<br>cout&lt;&lt;vals[0];<br>cout&lt;&lt;vals[9];<br>}<br>int &amp;put(int n)<br>{<br>if (n&gt;=0 &amp;&amp; n&lt;=9 ) return vals[n];<br>else { cout&lt;&lt;"subscript error"; return error; }<br>}<br><br>（5）在另外的一些操作符中，却千万不能返回引用：+-*/ 四则运算符。它们不能返回引用，Effective C++[1]的Item23详细的讨论了这个问题。主要原因是这四个操作符没有side effect，因此，它们必须构造一个对象作为返回值，可选的方案包括：返回一个对象、返回一个局部变量的引用，返回一个new分配的对象的引用、返回一个静态对象引用。根据前面提到的引用作为返回值的三个规则，第2、3两个方案都被否决了。静态对象的引用又因为((a+b) == (c+d))会永远为true而导致错误。所以可选的只剩下返回一个对象了。<br><br></font></span><span style="FONT-SIZE: medium"><font size=3><span style="COLOR: #800000"><strong>6. <span style="COLOR: #ff0000">&#8220;引用&#8221;与多态的关系？</span><br></strong></span><br>引用是除指针外另一个可以产生多态效果的手段。这意味着，一个基类的引用可以指向它的派生类实例。<br><br>例4<br><br>Class A; Class B : Class A{...}; B b; A&amp; ref = b;<br><br><span style="COLOR: #800000"><strong>7. &#8220;引用&#8221;与指针的区别是什么？</strong></span><br><br><strong><span style="COLOR: #ff0000">指针通过某个指针变量指向一个对象后，对它所指向的变量间接操作。</span>程序中使用指针，程序的可读性差；而引用本身就是目标变量的别名，对引用的操作就是对目标变量的操作。</strong>此外，就是上面提到的对函数传ref和pointer的区别。<br><br><span style="COLOR: #800000"><strong>8. 什么时候需要&#8220;引用&#8221;？</strong></span><br><br>流操作符&lt;&lt;和&gt;&gt;赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。<br><br>以上 2-8 参考：http://blog.csdn.net/wfwd/archive/2006/05/30/763551.aspx<br><br><span style="COLOR: #800000"><strong>9. 结构与联合有和区别？</strong></span><br>1. 结构和联合都是由多个不同的数据类型成员组成, 但</font><font size=3><strong><span style="COLOR: #ff0000">在任何同一时刻, 联合中只存放了一个被选中的成员（所有成员共用一块地址空间）, 而结构的所有成员都存在（不同成员的存放地址不同）。 <br></span></strong>2. 对于<strong><span style="COLOR: #ff0000">联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了</span></strong>, 而对于结构的不同成员赋值是互不影响的。<br><br></font></span><span style="FONT-SIZE: medium"><font size=3><span style="COLOR: #800000"><strong>10. 下面关于&#8220;联合&#8221;的题目的输出？<br></strong></span><br>a)<br>＃include &lt;stdio.h&gt;<br>union<br>{<br>int i;<br>char x[2];<br>}a;<br><br>void main()<br>{<br>a.x[0] = 10;<br>a.x[1] = 1;<br>printf("%d",a.i);<br>}<br>答案：266 (低位低地址，高位高地址，内存占用情况是Ox010A）<br><br>b)<br><br>main()<br>{<br>union{ /*定义一个联合*/<br>int i;<br>struct{ /*在联合中定义一个结构*/<br>char first;<br>char second;<br>}half;<br>}number;<br>number.i=0x4241; /*联合成员赋值*/<br>printf("%c%c\n", number.half.first, mumber.half.second);<br>number.half.first='a'; /*联合中结构成员赋值*/<br>number.half.second='b';<br>printf("%x\n", number.i);<br>getch();<br>}<br>答案： AB (0x41对应'A',是低位；Ox42对应'B',是高位）<br><br>6261 (number.i和number.half共用一块地址空间）</font></span></span></p>
<p><span style="FONT-SIZE: 12px"><span style="FONT-SIZE: medium"><font size=3><span style="COLOR: #800000"><strong>11. 已知strcpy的函数原型：char *strcpy(char *strDest, const char *strSrc)其中strDest 是目的字符串，strSrc 是源字符串。不调用C++/C 的字符串库函数，请编写函数 strcpy。<br></strong></span><br><br>答案：<br>char *strcpy(char *strDest, const char *strSrc)<br>{<br>if ( strDest == NULL || strSrc == NULL)<br>return NULL ;<br>if ( strDest == strSrc)<br>return strDest ;<br>char *tempptr = strDest ;<br>while( (*strDest++ = *strSrc++) != &#8216;\0&#8217;)<br>return tempptr ;<br>}<br><br><span style="COLOR: #800000"><strong>12. 已知String类定义如下：</strong></span><br><br>class String<br>{<br>public:<br>String(const char *str = NULL); // 通用构造函数<br>String(const String &amp;another); // 拷贝构造函数<br>~ String(); // 析构函数<br>String &amp; operater =(const String &amp;rhs); // 赋值函数<br>private:<br>char *m_data; // 用于保存字符串<br>};<br><br>尝试写出类的成员函数实现。<br><br>答案：<br><br>String::String(const char *str)<br>{<br>if ( str == NULL ) //strlen在参数为NULL时会抛异常才会有这步判断<br>{<br>m_data = new char[1] ;<br>m_data[0] = '\0' ;<br>}<br>else<br>{<br>m_data = new char[strlen(str) + 1];<br>strcpy(m_data,str);<br>}<br><br>} <br><br>String::String(const String &amp;another)<br>{<br>m_data = new char[strlen(another.m_data) + 1];<br>strcpy(m_data,other.m_data);<br>}<br><br><br>String&amp; String::operator =(const String &amp;rhs)<br>{<br>if ( this == &amp;rhs)<br>return *this ;<br>delete []m_data; //删除原来的数据，新开一块内存<br>m_data = new char[strlen(rhs.m_data) + 1];<br>strcpy(m_data,rhs.m_data);<br>return *this ;<br>}<br><br><br>String::~String()<br>{<br>delete []m_data ;<br>}<br><br></font></span><span style="FONT-SIZE: medium"><font size=3><span style="COLOR: #800000"><strong>13. .h头文件中的ifndef/define/endif 的作用？<br></strong></span><br>答：防止该头文件被重复引用。<br><br></font></span><span style="FONT-SIZE: medium"><font size=3><strong><span style="COLOR: #800000">14. ＃i nclude&lt;file.h&gt; 与 ＃i nclude "file.h"的区别？<br></span></strong><br>答：前者是从Standard Library的路径寻找和引用file.h，而<strong>后者是从当前工作路径搜寻并引用file.h</strong>。<br><br><span style="COLOR: #800000"><strong>15.在C++ 程序中调用被C 编译器编译后的函数，为什么要加extern &#8220;C&#8221;？</strong></span><br><br>首先，作为extern是C/C++语言中表明函数和全局变量作用范围（可见性）的关键字，该关键字告诉编译器，其声明的函数和变量可以在本模块或其它模块中使用。<br><br>通常，在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如，如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样，模块B中调用模块A中的函数时，在编译阶段，模块B虽然找不到该函数，但是并不会报错；它会在连接阶段中从模块A编译生成的目标代码中找到此函数<br><br>extern "C"是连接申明(linkage declaration),被extern "C"修饰的变量和函数是按照C语言方式编译和连接的,来看看C++中对类似C的函数是怎样编译的：<br><br>作为一种面向对象的语言，C++支持函数重载，而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如，假设某个函数的原型为：<br><br>void foo( int x, int y );<br>　　<br><br>该函数被C编译器编译后在符号库中的名字为_foo，而C++编译器则会产生像_foo_int_int之类的名字（不同的编译器可能生成的名字不同，但是都采用了相同的机制，生成的新名字称为&#8220;mangled name&#8221;）。<br><br>_foo_int_int 这样的名字包含了函数名、函数参数数量及类型信息，C++就是靠这种机制来实现函数重载的。例如，在C++中，函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的，后者为_foo_int_float。<br><br>同样地，C++中的变量除支持局部变量外，还支持类成员变量和全局变量。用户所编写程序的类成员变量可能与全局变量同名，我们以"."来区分。而本质上，编译器在进行编译时，与函数的处理相似，也为类中的变量取了一个独一无二的名字，这个名字与用户程序中同名的全局变量名字不同。<br><br>未加extern "C"声明时的连接方式<br><br>假设在C++中，模块A的头文件如下：<br><br>// 模块A头文件　moduleA.h<br>#ifndef MODULE_A_H<br>#define MODULE_A_H<br>int foo( int x, int y );<br>#endif　　<br><br>在模块B中引用该函数：<br><br>// 模块B实现文件　moduleB.cpp<br>＃i nclude "moduleA.h"<br>foo(2,3);<br>　　<br><br>实际上，在连接阶段，连接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_int这样的符号！<br><br>加extern "C"声明后的编译和连接方式<br><br>加extern "C"声明后，模块A的头文件变为：<br><br>// 模块A头文件　moduleA.h<br>#ifndef MODULE_A_H<br>#define MODULE_A_H<br>extern "C" int foo( int x, int y );<br>#endif　　<br><br>在模块B的实现文件中仍然调用foo( 2,3 )，其结果是：<br>（1）模块A编译生成foo的目标代码时，没有对其名字进行特殊处理，采用了C语言的方式；<br><br>（2）连接器在为模块B的目标代码寻找foo(2,3)调用时，寻找的是未经修改的符号名_foo。<br><br>如果在模块A中函数声明了foo为extern "C"类型，而模块B中包含的是extern int foo( int x, int y ) ，则模块B找不到模块A中的函数；反之亦然。<br><br>所以，可以用一句话概括extern &#8220;C&#8221;这个声明的真实目的（任何语言中的任何语法特性的诞生都不是随意而为的，来源于真实世界的需求驱动。我们在思考问题时，不能只停留在这个语言是怎么做的，还要问一问它为什么要这么做，动机是什么，这样我们可以更深入地理解许多问题）：实现C++与C及其它语言的混合编程。　　<br><br>明白了C++中extern "C"的设立动机，我们下面来具体分析extern "C"通常的使用技巧：<br><br>extern "C"的惯用法<br><br>（1）在C++中引用C语言中的函数和变量，在包含C语言头文件（假设为cExample.h）时，需进行下列处理：<br><br>extern "C"<br>{<br>＃i nclude "cExample.h"<br>}<br><br>而在C语言的头文件中，对其外部函数只能指定为extern类型，C语言中不支持extern "C"声明，在.c文件中包含了extern "C"时会出现编译语法错误。<br><br>C++引用C函数例子工程中包含的三个文件的源代码如下：<br><br>/* c语言头文件：cExample.h */<br>#ifndef C_EXAMPLE_H<br>#define C_EXAMPLE_H<br>extern int add(int x,int y);<br>#endif<br><br><br>/* c语言实现文件：cExample.c */<br>＃i nclude "cExample.h"<br>int add( int x, int y )<br>{<br>return x + y;<br>}<br><br><br>// c++实现文件，调用add：cppFile.cpp<br>extern "C"<br>{<br>＃i nclude "cExample.h"<br>}<br>int main(int argc, char* argv[])<br>{<br>add(2,3);<br>return 0;<br>}<br><br>如果C++调用一个C语言编写的.DLL时，当包括.DLL的头文件或声明接口函数时，应加extern "C" {　}。<br><br>（2）在C中引用C++语言中的函数和变量时，C++的头文件需添加extern "C"，但是在C语言中不能直接引用声明了extern "C"的该头文件，应该仅将C文件中将C++中定义的extern "C"函数声明为extern类型。<br><br>C引用C++函数例子工程中包含的三个文件的源代码如下：<br><br>//C++头文件 cppExample.h<br>#ifndef CPP_EXAMPLE_H<br>#define CPP_EXAMPLE_H<br>extern "C" int add( int x, int y );<br>#endif<br><br><br>//C++实现文件 cppExample.cpp<br>＃i nclude "cppExample.h"<br>int add( int x, int y )<br>{<br>return x + y;<br>}<br><br><br>/* C实现文件 cFile.c<br>/* 这样会编译出错：＃i nclude "cExample.h" */<br>extern int add( int x, int y );<br>int main( int argc, char* argv[] )<br>{<br>add( 2, 3 );<br>return 0;<br>}<br><br><span style="COLOR: #808000"><strong>15题目的解答请参考《C++中extern &#8220;C&#8221;含义深层探索》注解：</strong></span><br><br><span style="COLOR: #800000"><strong>16. 关联、聚合(Aggregation)以及组合(Composition)的区别？</strong></span><br><br>涉及到UML中的一些概念：<strong>关联是表示两个类的一般性联系</strong>，比如&#8220;学生&#8221;和&#8220;老师&#8221;就是一种关联关系；<strong>聚合表示has-a的关系，是一种相对松散的关系，聚合类不需要对被聚合类负责</strong>，如下图所示，用空的菱形表示聚合关系：<br><br><br><br>从实现的角度讲，聚合可以表示为:<br><br>class A {...} class B { A* a; .....}<br><br>而<strong>组合表示contains-a的关系，关联性强于聚合：组合类与被组合类有相同的生命周期</strong>，组合类要对被组合类负责，采用实心的菱形表示组合关系：<br><br><br><br>实现的形式是:<br><br>class A{...} class B{ A a; ...}<br><br>参考文章：http://blog.csdn.net/wfwd/archive/2006/05/30/763753.aspx<br><br>http://blog.csdn.net/wfwd/archive/2006/05/30/763760.aspx<br><br></font></span><span style="FONT-SIZE: medium"><font size=3><span style="COLOR: #800000"><strong>17.面向对象的三个基本特征，并简单叙述之？<br></strong></span><br>1. 封装：将客观事物抽象成类，每个类对自身的数据和方法实行protection(private, protected,public)<br><br>2. 继承：广义的继承有三种实现形式：</font></span></span></p>
<p><span style="FONT-SIZE: 12px"><span style="FONT-SIZE: medium"><font size=3>实现继承（指使用基类的属性和方法而无需额外编码的能力）、</font></span></span></p>
<p><span style="FONT-SIZE: 12px"><span style="FONT-SIZE: medium"><font size=3>可视继承（子窗体使用父窗体的外观和实现代码）、</font></span></span></p>
<p><span style="FONT-SIZE: 12px"><span style="FONT-SIZE: medium"><font size=3>接口继承（仅使用属性和方法，实现滞后到子类实现）。</font></span></span></p>
<p><span style="FONT-SIZE: 12px"><span style="FONT-SIZE: medium"><font size=3>前两种（类继承）和后一种（对象组合=&gt;接口继承以及纯虚函数）构成了功能复用的两种方式。<br><br>3. 多态：是将父对象设置成为和一个或更多的他的子对象相等的技术，赋值之后，父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说，就是一句话：<strong><span style="COLOR: #0000ff">允许将子类类型的指针赋值给父类类型的指针</span></strong>。<br><br></font></span><span style="FONT-SIZE: medium"><font size=3><strong><span style="COLOR: #800000">18. 重载（overload)和重写(overried，有的书也叫做&#8220;覆盖&#8221;）的区别？<br></span></strong><br>常考的题目。从定义上来说：<br><br>重载：是指允许存在多个同名函数，而这些函数的参数表不同（或许参数个数不同，或许参数类型不同，或许两者都不同）。<br><br>重写：是指<strong>子类重新定义复类虚函数</strong>的方法。<br><br>从<span style="COLOR: #ff0000"><span style="BACKGROUND-COLOR: #ffff00"><strong>实现原理上来说</strong></span></span>：<br><br>重载：<strong>编译器根据函数不同的参数表，对同名函数的名称做修饰，然后这些同名函数就成了不同的函数（<span style="COLOR: #ff0000">至少对于编译器来说是这样的</span>）。</strong>如，有两个同名函数：function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的：int_func、str_func。对于这两个函数的调用，在编译器间就已经确定了，是静态的。也就是说，它们的<strong>地址在编译期就绑定了（<span style="COLOR: #ff0000">早绑定</span>），</strong>因此，<strong><span style="COLOR: #ff0000"><span style="BACKGROUND-COLOR: #ffff00">重载和多态无关</span></span></strong>！<br><br>重写：和多态真正相关。当<strong>子类重新定义了父类的虚函数后</strong>，父类指针根据赋给它的不同的子类指针，动态的调用属于子类的该函数，<strong><span style="COLOR: #ff0000">这样的函数调用在编译期间是无法确定的</span></strong>（调用的子类的虚函数的地址无法给出）。因此，<span style="COLOR: #ff0000"><strong>这样的函数地址是在运行期绑定的（晚绑定）。</strong></span><br><br></font></span><span style="FONT-SIZE: medium"><font size=3><span style="COLOR: #800000"><strong>19. 多态的作用？<br></strong></span><br>主要是两个：1. <span style="COLOR: #0000ff"><span style="BACKGROUND-COLOR: #ffff00"><strong>隐藏实现细节</strong></span></span>，使得代码能够模块化；扩展代码模块，<strong><span style="COLOR: #0000ff">实现代码重用</span></strong>；2. <span style="COLOR: #0000ff"><span style="BACKGROUND-COLOR: #ffff00"><strong>接口重用</strong></span></span>：为了类在继承和派生的时候，保证使用家族中任一类的实例的某一属性时的正确调用。<br><br><span style="COLOR: #800000"><strong>20. Ado与Ado.net的相同与不同？</strong></span><br><br>除了&#8220;能够让应用程序处理存储于DBMS 中的数据&#8220;这一基本相似点外，两者没有太多共同之处。但是Ado使用OLE DB 接口并基于微软的COM 技术，而ADO.NET 拥有自己的ADO.NET 接口并且基于微软的.NET 体系架构。众所周知.NET 体系不同于COM 体系，ADO.NET 接口也就完全不同于ADO和OLE DB 接口，这也就是说ADO.NET 和ADO是两种数据访问方式。ADO.net 提供对XML 的支持。</font></span></span></p>
<p><span style="FONT-SIZE: 12px"><span style="FONT-SIZE: medium"><span style="COLOR: #800000"><strong><span style="FONT-SIZE: small"><font size=2>21. New delete 与malloc free 的联系与区别?<br></font></span></strong></span><font size=3>答案：<span style="COLOR: #ff0000"><strong><span style="BACKGROUND-COLOR: #ffff00">都是在堆(heap)上进行动态的内存操作</span></strong></span>。用malloc函数需要指定内存分配的字节数并且<span style="COLOR: #0000ff"><strong><span style="BACKGROUND-COLOR: #ffff00">不能初始化对象，new 会自动调用对象的构造函数</span></strong></span>。<span style="COLOR: #0000ff"><strong><span style="BACKGROUND-COLOR: #ffff00">delete 会调用对象的destructor</span></strong></span>，而free 不会调用对象的destructor.<br><br></font></span><span style="FONT-SIZE: medium"><span style="FONT-SIZE: small"><font size=2><span style="COLOR: #800000"><strong>22. #define DOUBLE(x) x+x ，i = 5*DOUBLE(5)； i 是多少？</strong></span><br></font></span><font size=3>答案：i 为30。<br><br></font></span><span style="FONT-SIZE: medium"><span style="FONT-SIZE: small"><font size=2><span style="COLOR: #800000"><strong>23. 有哪几种情况只能用intialization list 而不能用assignment?</strong></span><br><br></font></span><font size=3>答案：当类中含有const、reference 成员变量；基类的构造函数都需要初始化表。<br><br></font></span><span style="FONT-SIZE: medium"><span style="FONT-SIZE: small"><font size=2><span style="COLOR: #800000"><strong>24. C++是不是类型安全的？</strong></span><br></font></span><font size=3>答案：不是。两个<strong><span style="COLOR: #0000ff">不同类型的指针之间可以强制转换</span></strong>（用reinterpret cast)。C#是类型安全的。<br><br></font></span><span style="FONT-SIZE: medium"><span style="FONT-SIZE: small"><font size=2><strong><span style="COLOR: #800000">25. main 函数执行以前，还会执行什么代码？</span></strong><br></font></span><font size=3>答案：全局对象的构造函数会在main 函数之前执行。<br><br></font></span><span style="FONT-SIZE: medium"><span style="FONT-SIZE: small"><font size=2><strong><span style="COLOR: #800000">26. 描述内存分配方式以及它们的区别?</span></strong><br></font></span><font size=3>1） 从<strong>静态存储区域分配。内存在程序编译的时候就已经分配好，这块内存在程序的整个运行期间都存在。例如全局变量，static 变量。</strong><br>2） 在<span style="COLOR: #ff0000"><strong><span style="BACKGROUND-COLOR: #ffff00">栈上创建</span>。在执行函数时，函数内<span style="BACKGROUND-COLOR: #888888">局部变量</span>的存储单元都可以在栈上创建，函数执行<span style="BACKGROUND-COLOR: #ffff00">结束时这些存储单元自动被释放</span></strong></span>。<strong><span style="BACKGROUND-COLOR: #888888"><span style="COLOR: #0000ff">栈内存分配运算内置于处理器的指令集</span></span></strong>。<br>3） 从<span style="COLOR: #ff0000"><strong><span style="BACKGROUND-COLOR: #ffff00">堆上分配，亦称动态内存分配</span></strong></span>。程序在运行的时候<strong>用malloc 或new 申请任意多少的内存，程序员自己负责在何时用free 或delete 释放内存。</strong>动态内存的生存期由程序员决定，<span style="COLOR: #ff0000"><strong><span style="BACKGROUND-COLOR: #ffff00">使用非常灵活，但问题也最多</span></strong></span>。<br><br></font></span><span style="FONT-SIZE: medium"><span style="FONT-SIZE: small"><font size=2><span style="COLOR: #800000"><strong>27.struct 和 class 的区别</strong></span><br><br></font></span><font size=3>答案：<strong>struct 的成员默认是公有的</strong>，而类的成员默认是私有的。<span style="COLOR: #ff0000"><strong>struct 和 class 在其他方面是功能相当的</strong></span>。<br><br>从感情上讲，大多数的开发者感到类和结构有很大的差别。<strong>感觉上结构仅仅象一堆缺乏封装和功能的开放的内存位，而类就象活的并且可靠的社会成员</strong>，它有智能服务，有牢固的封装屏障和一个良好定义的接口。既然大多数人都这么认为，那么</font><font size=3><strong>只有在你的类有很少的方法并且有公有数据（这种事情在良好设计的系统中是存在的!）时，你也许应该使用 struct 关键字，否则，你应该使用 class 关键字。 <br></strong><br></font></span><span style="FONT-SIZE: medium"><strong><span style="FONT-SIZE: x-small"><font size=1><span style="COLOR: #800000">28.当一个类A 中没有生命任何成员变量与成员函数,这时sizeof(A)的值是多少，如果不是零，请解释一下编译器为什么没有让它为零。（Autodesk）</span><br></font></span></strong><font size=3>答案：肯定不是零。举个反例，如果是零的话，声明一个class A[10]对象数组，而每一个对象占用的空间是零，这时就没办法区分A[0],A[1]&#8230;了。<br><br></font></span><span style="FONT-SIZE: medium"><span style="COLOR: #800000"><strong><span style="FONT-SIZE: x-small"><font size=1>29. 在8086 汇编下，逻辑地址和物理地址是怎样转换的？（Intel）<br></font></span></strong></span><font size=3>答案：通用寄存器给出的地址，是段内偏移地址，相应<span style="COLOR: #ff0000"><strong>段寄存器地址*10H+通用寄存器内地址</strong></span>，就得到了真正要访问的地址。<br><br></font></span><span style="FONT-SIZE: medium"><span style="FONT-SIZE: x-small"><font size=1><strong><span style="COLOR: #800000">30. 比较C++中的4种类型转换方式？</span></strong><br><br></font></span><font size=3>请参考：http://blog.csdn.net/wfwd/archive/2006/05/30/763785.aspx，重点是static_cast, dynamic_cast和reinterpret_cast的区别和应用。<br><br></font></span><span style="FONT-SIZE: medium"><span style="FONT-SIZE: x-small"><font size=1><span style="COLOR: #800000"><strong>31.分别写出BOOL,int,float,指针类型的变量a 与&#8220;零&#8221;的比较语句。</strong></span><br></font></span><font size=3>答案：<br>BOOL : if ( !a ) or if(a)<br>int : if ( a == 0)<br>float : const EXPRESSION EXP = 0.000001<br>if ( a &lt; EXP &amp;&amp; a &gt;-EXP)<br>pointer : if ( a != NULL) or if(a == NULL)<br><br><br><br></font></span><span style="FONT-SIZE: medium"><span style="COLOR: #800000"><strong><span style="FONT-SIZE: x-small"><font size=1>32.请说出const与#define 相比，有何优点？<br></font></span></strong></span><font size=3>答案：1）<strong> const 常量有数据类型，而宏常量没有数据类型</strong>。编译器可以对前者进行类型安全检查。而对<span style="COLOR: #ff0000"><strong>后者只进行字符替换，没有类型安全检查</strong></span>，并且在<strong>字符替换可能会产生意料不到的错误</strong>。<br>2） 有些集成化的<strong>调试工具可以对const 常量进行调试，但是不能对宏常量进行调试</strong>。<br><br></font></span><span style="FONT-SIZE: medium"><span style="FONT-SIZE: x-small"><font size=1><span style="COLOR: #800000"><strong>33.简述数组与指针的区别？</strong></span><br></font></span><font size=3><strong>数组要么在静态存储区被创建（如全局数组），要么在栈上被创建。指针可以随时指向任意类型的内存块。<br></strong>(1)修改内容上的差别<br>char a[] = &#8220;hello&#8221;;<br>a[0] = &#8216;X&#8217;;<br>char *p = &#8220;world&#8221;; // 注意p 指向常量字符串<br>p[0] = &#8216;X&#8217;; // 编译器不能发现该错误，运行时错误<br>(2) 用运算符sizeof 可以计算出数组的容量（字节数）。sizeof(p),p 为指针得到的是一个指针变量的字节数，而不是p 所指的内存容量。C++/C 语言没有办法知道指针所指的内存容量，除非在申请内存时记住它。注意当数组作为函数的参数进行传递时，该数组自动退化为同类型的指针。<br>char a[] = "hello world";<br>char *p = a;<br>cout&lt;&lt; sizeof(a) &lt;&lt; endl; // 12 字节<br>cout&lt;&lt; sizeof(p) &lt;&lt; endl; // 4 字节<br>计算数组和指针的内存容量<br>void Func(char a[100])<br>{<br>cout&lt;&lt; sizeof(a) &lt;&lt; endl; // 4 字节而不是100 字节<br>}<br><br></font></span><span style="FONT-SIZE: medium"><span style="FONT-SIZE: x-small"><font size=1><span style="COLOR: #800000"><strong>34.类成员函数的重载、覆盖和隐藏区别？</strong></span><br></font></span><font size=3>答案：<br>a.</font><font size=3><strong><span style="COLOR: #0000ff">成员函数被重载的特征：<br>（1）相同的范围（在同一个类中）；<br>（2）函数名字相同；<br>（3）参数不同；<br>（4）virtual 关键字可有可无</span></strong>。<br>b.<strong><span style="COLOR: #0000ff">覆盖是指派生类函数覆盖基类函数</span></strong>，特征是：<br>（1）<span style="COLOR: #0000ff"><strong>不同的范围</strong></span>（分别位于派生类与基类）；<br>（2）<strong><span style="COLOR: #0000ff">函数</span><span style="COLOR: #0000ff">名字相同</span></strong>；<br>（3）<strong><span style="COLOR: #0000ff">参数相同</span></strong>；<br>（4）<strong><span style="COLOR: #0000ff">基类函数必须有virtual 关键字</span></strong>。(<span style="COLOR: #ff0000">虚函数 added by alphajay</span>)<br>c<span style="COLOR: #0000ff"><strong>.&#8220;隐藏&#8221;是指派生类的函数屏蔽了与其同名的基类函数</strong></span>，规则如下：<br>（1）<span style="COLOR: #0000ff"><strong>如果<span style="COLOR: #ff0000">派生类</span>的函数与<span style="COLOR: #ff0000">基类</span>的函数同名，但是参数不同</strong></span>。此时，不论有无virtual关键字，基类的函数将被隐藏（<span style="COLOR: #ff0000"><strong>注意别与重载混淆</strong></span>）。<br>（2）<span style="COLOR: #0000ff"><strong>如果派生类的函数与基类的函数同名，并且参数也相同，但是<span style="COLOR: #ff0000">基类函数没有virtual 关键字</span></strong></span>。此时，基类的函数被隐藏（<span style="COLOR: #ff0000"><strong>注意别与覆盖混淆</strong></span>）<br><br></font></span><span style="FONT-SIZE: medium"><span style="COLOR: #800000"><strong><span style="FONT-SIZE: x-small"><font size=1>35. There are two int variables: a and b, don&#8217;t use &#8220;if&#8221;, &#8220;? :&#8221;, &#8220;switch&#8221;or other judgement statements, find out the biggest one of the two numbers.<br></font></span></strong></span><font size=3>答案：( ( a + b ) + abs( a - b ) ) / 2<br><br></font></span><span style="FONT-SIZE: medium"><span style="COLOR: #800000"><strong><span style="FONT-SIZE: x-small"><font size=1>36. 如何打印出当前源文件的文件名以及源文件的当前行号？<br></font></span></strong></span><font size=3>答案：<br>cout &lt;&lt; __FILE__ ;<br>cout&lt;&lt;__LINE__ ;<br>__FILE__和__LINE__是系统预定义宏，这种宏并不是在某个文件中定义的，而是由编译器定义的。<br><br></font></span><span style="FONT-SIZE: medium"><span style="COLOR: #800000"><strong><span style="FONT-SIZE: x-small"><font size=1>37. main 主函数执行完毕后，是否可能会再执行一段代码，给出说明？<br></font></span></strong></span><font size=3>答案：<strong>可以，可以用_onexit 注册一个函数</strong>，它会在main 之后执行int fn1(void), fn2(void), fn3(void), fn4 (void);<br>void main( void )<br>{<br>String str("zhanglin");<br>_onexit( fn1 );<br>_onexit( fn2 );<br>_onexit( fn3 );<br>_onexit( fn4 );<br>printf( "This is executed first.\n" );<br>}<br>int fn1()<br>{<br>printf( "next.\n" );<br>return 0;<br>}<br>int fn2()<br>{<br>printf( "executed " );<br>return 0;<br>}<br>int fn3()<br>{<br>printf( "is " );<br>return 0;<br>}<br>int fn4()<br>{<br>printf( "This " );<br>return 0;<br>}<br>The _onexit function is passed the address of a function (func) to be called when the program terminates normally. Successive calls to _onexit create a register of functions that are executed in LIFO (last-in-first-out) order. The functions passed to _onexit cannot take parameters.<br><br></font></span><span style="FONT-SIZE: medium"><span style="COLOR: #800000"><strong><span style="FONT-SIZE: x-small"><font size=1>38. 如何判断一段程序是由C 编译程序还是由C++编译程序编译的？<br></font></span></strong></span><font size=3>答案：<br>#ifdef __cplusplus<br>cout&lt;&lt;"c++";<br>#else<br>cout&lt;&lt;"c";<br>#endif</font></span></span></p>
</div>
<img src ="http://www.cppblog.com/Cunch/aggbug/144038.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cunch/" target="_blank">Cunch</a> 2011-04-12 15:32 <a href="http://www.cppblog.com/Cunch/archive/2011/04/12/144038.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>atoi函数实现</title><link>http://www.cppblog.com/Cunch/archive/2011/03/13/141711.html</link><dc:creator>Cunch</dc:creator><author>Cunch</author><pubDate>Sun, 13 Mar 2011 05:08:00 GMT</pubDate><guid>http://www.cppblog.com/Cunch/archive/2011/03/13/141711.html</guid><wfw:comment>http://www.cppblog.com/Cunch/comments/141711.html</wfw:comment><comments>http://www.cppblog.com/Cunch/archive/2011/03/13/141711.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/Cunch/comments/commentRss/141711.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cunch/services/trackbacks/141711.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;今天看见大家在讨论atoi这个函数，我也凑个热闹，学习下atoi函数的用法，记得当时学C语言，以为就只能将全是数字的字符串转化成整数，现在明白了远不至如此。<br><br>1、能够将从当前开始的字符（数字或+、-）到第一个不是数字的字符结束的数字字符串，转化成整数；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个也就是有人在blog中谈论的前缀匹配。<br>2、需要注意的指针在这个过程中的指向发生了改变<br><br>下面给出我的atoi实现代码<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px;"><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;aatoii(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;str)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(str&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;NULL)&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>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;sign&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;(</span><span style="color: #000000;">'</span><span style="color: #000000;">0</span><span style="color: #000000;">'</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;str[</span><span style="color: #000000;">0</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;str[</span><span style="color: #000000;">0</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">9</span><span style="color: #000000;">'</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">(str[</span><span style="color: #000000;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">==</span><span style="color: #000000;">'</span><span style="color: #000000;">-</span><span style="color: #000000;">'</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;str[</span><span style="color: #000000;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">==</span><span style="color: #000000;">'</span><span style="color: #000000;">+</span><span style="color: #000000;">'</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(str[</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;">'</span><span style="color: #000000;">+</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;str[</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;">'</span><span style="color: #000000;">-</span><span style="color: #000000;">'</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(str[</span><span style="color: #000000;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">==</span><span style="color: #000000;">'</span><span style="color: #000000;">-</span><span style="color: #000000;">'</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sign&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&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>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #000000;">'</span><span style="color: #000000;">0</span><span style="color: #000000;">'</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">str&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">str&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">9</span><span style="color: #000000;">'</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;result</span><span style="color: #000000;">*</span><span style="color: #000000;">10</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">str</span><span style="color: #000000;">++</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">0</span><span style="color: #000000;">'</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;result;<br>}<br><br></span></div>
<br><br>修改版：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px;"><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;aatoii(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;str)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(str&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;NULL)&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>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;sign&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;(</span><span style="color: #000000;">'</span><span style="color: #000000;">0</span><span style="color: #000000;">'</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;str[</span><span style="color: #000000;">0</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;str[</span><span style="color: #000000;">0</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">9</span><span style="color: #000000;">'</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">(str[</span><span style="color: #000000;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">==</span><span style="color: #000000;">'</span><span style="color: #000000;">-</span><span style="color: #000000;">'</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;str[</span><span style="color: #000000;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">==</span><span style="color: #000000;">'</span><span style="color: #000000;">+</span><span style="color: #000000;">'</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(str[</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;">'</span><span style="color: #000000;">+</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;str[</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;">'</span><span style="color: #000000;">-</span><span style="color: #000000;">'</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(str[</span><span style="color: #000000;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">==</span><span style="color: #000000;">'</span><span style="color: #000000;">-</span><span style="color: #000000;">'</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sign&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #000000;">'</span><span style="color: #000000;">0</span><span style="color: #000000;">'</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">str&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">str&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">9</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;result</span><span style="color: #000000;">*</span><span style="color: #000000;">10</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">str</span><span style="color: #000000;">++</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">0</span><span style="color: #000000;">'</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;sign;<br>}</span></div>
<br>后面说我没溢出判断：<br>我仔细想了想：我认为没必有，由于我保证了传进来的str是有意义的：<br>无外乎这几种情况： {'\0'}, {'+', '\0'}, {'1', '2', '\0'}&nbsp;, {'a', 'b', '1', '2', '\0'},这些都应该没有问题<br>，由于while('0' &lt;= *str &amp;&amp; *str &lt;= '9')，等于间接就判断了。<br><br>修改版二：<br>现在发现我对溢出的理解是错误，下面给出代码<br>ps：发现linux的颜色真好看，<br><br><img alt=""  src="http://www.cppblog.com/images/cppblog_com/cunch/Screenshot-1.png" width="835" height="586"><br><br><br>&nbsp;<br>3、今天我才明白const char* str; 是修饰字符串不能改变的，而不是指针，&nbsp;修饰常量指针的是char* const str；<br><br>&nbsp;&nbsp;&nbsp; 那我就说说吧：<br>&nbsp;&nbsp;&nbsp;&nbsp;const int * const pint;&nbsp; //一个const指针，指向一个const成员<br>&nbsp;&nbsp;&nbsp; const int * pint;&nbsp;&nbsp;&nbsp;//一个非const指针， 指向一个const成员<br>&nbsp;&nbsp;&nbsp; int *pint;&nbsp; //一个非const指针，指向一个非const成员<br>&nbsp;&nbsp;&nbsp; int * const pint;&nbsp; //一个const指针，指向一个非const成员<br>&nbsp;&nbsp;&nbsp; int const * pint; //和第二个一样， 一个非const指针， 指向一个const成员， 这个不常用<br><br><br><br><br>  <img src ="http://www.cppblog.com/Cunch/aggbug/141711.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cunch/" target="_blank">Cunch</a> 2011-03-13 13:08 <a href="http://www.cppblog.com/Cunch/archive/2011/03/13/141711.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++笔试二</title><link>http://www.cppblog.com/Cunch/archive/2011/03/09/141391.html</link><dc:creator>Cunch</dc:creator><author>Cunch</author><pubDate>Wed, 09 Mar 2011 00:04:00 GMT</pubDate><guid>http://www.cppblog.com/Cunch/archive/2011/03/09/141391.html</guid><wfw:comment>http://www.cppblog.com/Cunch/comments/141391.html</wfw:comment><comments>http://www.cppblog.com/Cunch/archive/2011/03/09/141391.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Cunch/comments/commentRss/141391.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cunch/services/trackbacks/141391.html</trackback:ping><description><![CDATA[<div class=postText>给定九个数，例如：1，3，3，5，6，7，8，8，9计算出这九个数的排列的种数。需要考虑重复情况，如果给定9个1，则只有一种结果。 <br>限制：不能使用stl库 <br>要求：完成函数&nbsp;unsigned&nbsp;int&nbsp;foo(unsigned&nbsp;int&nbsp;*arr); <br>输入算法代码，并给出算法复杂度分析。
<p>分析：&nbsp;</p>
<p>#include &lt;cstdlib&gt;<br>#include &lt;iostream&gt;</p>
<p>using namespace std;<br>unsigned int foo(unsigned int *arr)<br>{<br>&nbsp;&nbsp;&nbsp; unsigned int p[] ={1,2,6,24,120,720,5040,40320,362880};<br>&nbsp;&nbsp;&nbsp; unsigned int i,j,c,s=p[8];//first the number is p<sup>9<sub>9</sub></sup><br>&nbsp;&nbsp;&nbsp; for(i = 0; i &lt; 7; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j = i+1; j &lt; 8; j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(arr[i]&gt;arr[j])&nbsp; //swap two number<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr[i]^=arr[j];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr[j]^=arr[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr[i]^=arr[j];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; i = 0;<br>&nbsp;&nbsp;&nbsp; c = 0;<br>&nbsp;&nbsp;&nbsp; while(i&lt;8)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j = i+1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(arr[i]==arr[j])//compute the number of the repetition&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c++;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j++;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s/=p[c];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=j;<br>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; return s;<br>}<br>&nbsp;&nbsp; <br>int main()<br>{<br>&nbsp;&nbsp;&nbsp; unsigned int a[]={1,3,3,5,6,7,8,8,9};<br>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"The number of permutation is: "&lt;&lt;foo(a)&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp; system("pause");<br>&nbsp;&nbsp;&nbsp; return 0;<br>}&nbsp;&nbsp;&nbsp;&nbsp; <br>还可以改进排序那部分。</p>
<p>转一个经典的题目：</p>
<p>给一个天平,问如何用3次把这个小球找出来 <br>并且求出这个小球是比其他的轻还是重 <br>将12个球分别编号为a1,a2,a3.......a10,a11,a12. <br>第一步：将12球分开3拨，每拨4个，a1~a4第一拨，记为b1，&nbsp;a5~a8第2拨，记为b2，其余第3拨，记为b3； <br>第二步：将b1和b2放到天平两盘上，记左盘为c1，右为c2；这时候分两中情况： <br><br>1.c1和c2平衡，此时可以确定从a1到a8都是常球；然后把c2拿空，并从c1上拿下a4，从a9到a12四球里随便取三球，假设为a9到a11，放到c2上。此时c1上是a1到a3，c2上是a9到a11。从这里又分三种情况： <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A：天平平衡，很简单，说明没有放上去的a12就是异球，而到此步一共称了两次，所以将a12随便跟11个常球再称一次，也就是第三次，马上就可以确定a12是重还是轻； <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B：若c1上升，则这次称说明异球为a9到a11三球中的一个，而且是比常球重。取下c1所有的球，并将a8放到c1上，将a9取下，比较a8和a11（第三次称），如果平衡则说明从c2上取下的a9是偏重异球，如果不平衡，则偏向哪盘则哪盘里放的就是偏重异球； <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C：若c1下降，说明a9到a11里有一个是偏轻异球。次种情况和B类似，所以接下来的步骤照搬B就是； <br><br>2.c1和c2不平衡，这时候又分两种情况，c1上升和c1下降，但是不管哪种情况都能说明a9到a12是常球。这步是解题的关键。也是这个题最妙的地方。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A：c1上升，此时不能判断异球在哪盘也不能判断是轻还是重。取下c1中的a2到a4三球放一边，将c2中的a5和a6放到c1上，然后将常球a9放到c2上。至此，c1上是a1，a5和a6，c2上是a7，a8和a9。此时又分三中情况： <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1）如果平衡，说明天平上所有的球都是常球，异球在从c1上取下a2到a4中。而且可以断定异球轻重。因为a5到a8都是常球，而第2次称的时候c1是上升的，所以a2到a4里必然有一个轻球。那么第三次称就用来从a2到a4中找到轻球。这很简单，随便拿两球放到c1和c2，平衡则剩余的为要找球，不平衡则哪边低则哪个为要找球； <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2）c1仍然保持上升，则说明要么a1是要找的轻球，要么a7和a8两球中有一个是重球（这步懂吧？好好想想，很简单的。因为a9是常球，而取下的a2到a4肯定也是常球，还可以推出换盘放置的a5和a6也是常球。所以要么a1轻，要么a7或a8重）。至此，还剩一次称的机会。只需把a7和a8放上两盘，平衡则说明a1是要找的偏轻异球，如果不平衡，则哪边高说明哪个是偏重异球； <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3）如果换球称第2次后天平平衡打破，并且c1降低了，这说明异球肯定在换过来的a5和a6两求中，并且异球偏重，否则天平要么平衡要么保持c1上升。确定要找球是偏重之后，将a5和a6放到两盘上称第3次根据哪边高可以判定a5和a6哪个是重球； <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B：第1次称后c1是下降的，此时可以将c1看成c2，其实以后的步骤都同A，所以就不必要再重复叙述了。至此，不管情况如何，用且只用三次就能称出12个外观手感一模一样的小球中有质量不同于其他11球的偏常的球。而且在称的过程中可以判定其是偏轻还是偏重。 <br><br>3.U2 合唱团在17 分钟内得赶到演唱会场，途中必需跨过一座桥，四个人从桥的同一端出发，你得帮助他们到达另一端，天色很暗，而他们只有一只手电筒。一次同时最多可以有两人一起过桥，而过桥的时候必须持有手电筒，所以就得有人把手电筒带来带去，来回桥两端。手电筒是不能用丢的方式来传递的。四个人的步行速度各不同，若两人同行则以较慢者的速度为准。Bono 需花1 分钟过桥，Edge 需花2 分钟过桥，Adam需花 5 分钟过桥，Larry 需花10 分钟过桥。他们要如何在17 分钟内过桥呢？（有个同济的学生写文章说他当时在微软面试时就是碰到了这道题，最短只能做出在19分钟内过桥，微软的人对他讲这样的结果已经是不错的了！）&nbsp; <br>&nbsp; A点到 B 点 <br>&nbsp;1 和2 过去 2 分钟 2&nbsp; <br>&nbsp;2 过来 4 分钟 2+2=4 <br>10和 5过去 14 分钟 4+10=14&nbsp;&nbsp; <br>1 过来 15 分钟 14+1=15&nbsp;&nbsp; <br>1 和2 过去 17 分钟 15+2=17 </p>
<p>第一组&nbsp;&nbsp;<br>　　1.烧一根不均匀的绳，从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子，问如何用烧绳的方法来计时一个小时十五分钟呢?<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ans:三根绳，<font color=#ff0000>开始的时候，第一根点燃两端，第二根点燃一端，第三根不点</font>。<font color=#ff0000>第一根绳烧完(30分钟)后，点燃第二根绳的另一端</font>，第二根只要15分钟就可以烧完了，第二根绳烧完(45分钟)后，点燃第三根绳子两端，第三根绳烧完(1小时15分)后，计时完成<br><br>　　2.你有一桶果冻，其中有黄色、绿色、红色三种，闭上眼睛抓取同种颜色的两个。抓取多少个就可以确定你肯定有两个同一颜色的果冻?<br><br>　　3.如果你有无穷多的水，一个3公升的提捅，一个5公升的提捅，两只提捅形状上下都不均匀，问你如何才能准确称出4公升的水?<br><br>　　4.一个岔路口分别通向诚实国和说谎国。来了两个人，已知一个是诚实国的，另一个是说谎国的。诚实国永远说实话，说谎国永远说谎话。现在你要去说谎国，但不知道应该走哪条路，需要问这两个人。请问应该怎么问?<br><br>　　5.12个球一个天平，现知道只有一个和其它的重量不同，问怎样称才能用三次就找到那个球。13个呢?(注意此题并未说明那个球的重量是轻是重，所以需要仔细考虑)<br><br>　　6.在9个点上画10条直线，要求每条直线上至少有三个点?<br><br>　　7.在一天的24小时之中，时钟的时针、分针和秒针完全重合在一起的时候有几次?都分别是什么时间?你怎样算出来的?<br><br>　　8.怎么样种植4棵树木，使其中任意两棵树的距离相等?<br><br>　　第二组&nbsp;&nbsp;<br><br>　　1.为什么下水道的盖子是圆的?<br><br>　　2.中国有多少辆汽车?<br><br>　　3.将汽车钥匙插入车门，向哪个方向旋转就可以打开车锁?<br><br>　　4.如果你要去掉中国的34个省(含自治区、直辖市和港澳特区及台湾省)中的任何一个，你会去掉哪一个，为什么?<br><br>　　5.多少个加油站才能满足中国的所有汽车?<br><br>　　6.想象你站在镜子前，请问，为什么镜子中的影象可以颠倒左右，却不能颠倒上下?<br><br>　　7.为什么在任何旅馆里，你打开热水，热水都会瞬间倾泻而出?<br><br>　　8.你怎样将Excel的用法解释给你的奶奶听?<br><br>　　9.你怎样重新改进和设计一个ATM银行自动取款机?<br><br>　　10.如果你不得不重新学习一种新的计算机语言，你打算怎样着手来开始?<br><br>　　11.如果你的生涯规划中打算在5年内受到奖励，那获取该项奖励的动机是什么?观众是谁?<br><br>　　12.如果微软告诉你，我们打算投资五百万美元来启动你的投资计划，你将开始什么样商业计划?为什么?<br><br>　　13.如果你能够将全世界的电脑厂商集合在一个办公室里，然后告诉他们将被强迫做一件事，那件事将是什么?　<br><br>&nbsp;<br><br>第三组&nbsp;&nbsp;<br><br>　　1.你让工人为你工作7天，回报是一根金条，这个金条平分成相连的7段，你必须在每天结束的时候给他们一段金条。如果只允许你两次把金条弄断，你如何给你的工人付费?<br><br>　　2.有一辆火车以每小时15公里的速度离开北京直奔广州，同时另一辆火车每小时20公里的速度从广州开往北京。如果有一只鸟，以30公里每小时的速度和两辆火车同时启动，从北京出发，碰到另一辆车后就向相反的方向返回去飞，就这样依次在两辆火车之间来回地飞，直到两辆火车相遇。请问，这只鸟共飞行了多长的距离?<br><br>　　3.你有四个装药丸的罐子，每个药丸都有一定的重量，被污染的药丸是没被污染的药丸的重量+1。只称量一次，如何判断哪个罐子的药被污染了?<br><br>　　4.门外三个开关分别对应室内三盏灯，线路良好，在门外控制开关时候不能看到室内灯的情况，现在只允许进门一次，确定开关和灯的对应关系?<br><br>　　5.人民币为什么只有1、2、5、10的面值?<br><br>　　6.你有两个罐子以及50个红色弹球和50个蓝色弹球，随机选出一个罐子，&nbsp;随机选出一个弹球放入罐子，怎么给出红色弹球最大的选中机会?在你的计划里，得到红球的几率是多少?<br><br>　　7.给你两颗6面色子，可以在它们各个面上刻上0-9任意一个数字，要求能够用它们拼出任意一年中的日期数值<br><br>　　第四组&nbsp;<br><br>　　第一题&nbsp;.&nbsp;五个海盗抢到了100颗宝石，每一颗都一样大小和价值连城。他们决定这么分：<br><br>　　抽签决定自己的号码(1、2、3、4、5)<br><br>　　首先，由1号提出分配方案，然后大家表决，当且仅当超过半数的人同意时，按照他的方案<br><br>　　进行分配，否则将被扔进大海喂鲨鱼<br><br>　　如果1号死后，再由2号提出分配方案，然后剩下的4人进行表决，当且仅当超过半数的人同<br><br>　　意时，按照他的方案进行分配，否则将被扔入大海喂鲨鱼<br><br>　　依此类推<br><br>　　条件：每个海盗都是很聪明的人，都能很理智地做出判断，从而做出选择。<br><br>　　问题：第一个海盗提出怎样的分配方案才能使自己的收益最大化?<br><br>　　第二题&nbsp;.&nbsp;一道关于飞机加油的问题，已知：<br><br>　　每个飞机只有一个油箱，<br><br>　　飞机之间可以相互加油(注意是相互，没有加油机)<br><br>　　一箱油可供一架飞机绕地球飞半圈，<br><br>　　问题：<br><br>　　为使至少一架飞机绕地球一圈回到起飞时的飞机场，至少需要出动几架飞机?(所有飞机从同一机场起飞，而且必须安全返回机场，不允许中途降落，中间没有飞机场)第三题.&nbsp;汽车加油问题&nbsp;&nbsp;<br><br>　　一辆载油500升的汽车从A开往1000公里外的B，已知汽车每公里耗油量为1升，A处有无穷多的油，其他任何地点都没有油，但该车可以在任何地点存放油以备中转，问从A到B最少需要多少油<br><br>　　第四题.&nbsp;掷杯问题<br><br>　　一种杯子，若在第N层被摔破，则在任何比N高的楼层均会破，若在第M层不破，则在任何比M低的楼层均会破，给你两个这样的杯子，让你在100层高的楼层中测试，要求用最少的测试次数找出恰巧会使杯子破碎的楼层。<br><br>　　第五题.&nbsp;推理游戏<br><br>　　教授选出两个从2到9的数，把它们的和告诉学生甲，把它们的积告诉学生乙，让他们轮流猜这两个数<br><br>　　甲说：&#8220;我猜不出&#8221;<br><br>　　乙说：&#8220;我猜不出&#8221;<br><br>　　甲说：&#8220;我猜到了&#8221;<br><br>　　乙说：&#8220;我也猜到了&#8221;<br><br>　　问这两个数是多少<br><br>　　第六题.&nbsp;病狗问题<br><br>　　一个住宅区内有100户人家，每户人家养一条狗，每天傍晚大家都在同一个地方遛狗。已知这些狗中有一部分病狗，由于某种原因，狗的主人无法判断自己的狗是否是病狗，却能够分辨其他的狗是否有病，现在，上级传来通知，要求住户处决这些病狗，并且不允许指认他人的狗是病狗(就是只能判断自己的)，过了7天之后，所有的病狗都被处决了，问，一共有几只病狗?为什么?<br><br>　　第八题.&nbsp;监狱里有100个房间，每个房间内有一囚犯。一天，监狱长说，你们狱房外有一电灯，你们在放风时可以控制这个电灯(熄或亮)。每天只能有一个人出来放风，并且防风是随机的。如果在有限时间内，你们中的某人能对我说：&#8220;我敢保证，现在每个人都已经至少放过一次风了。&#8221;我就放了你们!问囚犯们要采取什么策略才能被监狱长放掉?如果采用了这种策略，大致多久他们可以被释放?<br><br>&nbsp;<br><br>第五组&nbsp;&nbsp;<br><br>　　1.某手机厂家由于设计失误，有可能造成电池寿命比原来设计的寿命短一半(不是冲放电时间)，解决方案就是免费更换电池或给50元购买该厂家新手机的折换券。请给所有已购买的用户写信告诉解决方案。<br><br>　　2.一高层领导在参观某博物馆时，向博物馆馆员小王要了一块明代的城砖作为纪念，按国家规定，任何人不得将博物馆收藏品变为私有。博物馆馆长需要如何写信给这位领导，将城砖取回。<br><br>　　3.营业员小姐由于工作失误，将2万元的笔记本电脑以1.2万元错卖给李先生，王小姐的经理怎么写信给李先生试图将钱要回来?<br><br>　　4.给你一款新研制的手机，如果你是测试组的组长，你会如何测试?<br><br>　　5.如何为函数int&nbsp;atoi(const&nbsp;char&nbsp;*&nbsp;pstr)编写测试向量?<br><br>　　第六组&nbsp;&nbsp;<br><br>　　1.链表和数组的区别在哪里?<br><br>　　2.编写实现链表排序的一种算法。说明为什么你会选择用这样的方法?<br><br>　　3.编写实现数组排序的一种算法。说明为什么你会选择用这样的方法?<br><br>　　4.请编写能直接实现char&nbsp;*&nbsp;strcpy(char&nbsp;*&nbsp;pstrDest,const&nbsp;char&nbsp;*&nbsp;pstrSource)函数功能的代码。<br><br>　　5.编写反转字符串的程序，要求优化速度、优化空间。<br><br>　　6.在链表里如何发现循环链接?<br><br>　　7.给出洗牌的一个算法，并将洗好的牌存储在一个整形数组里。<br><br>　　8.写一个函数，检查字符是否是整数，如果是，返回其整数值。(或者：怎样只用4行代码<br><br>　　9.给出一个函数来输出一个字符串的所有排列。<br><br>　　10.请编写实现void&nbsp;*&nbsp;malloc(int)内存分配函数功能一样的代码。<br><br>　　11.给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。<br><br>　　12.怎样编写一个程序，把一个有序整数数组放到二叉树中?<br><br>　　13.怎样从顶部开始逐层打印二叉树结点数据?请编程。<br><br>　　14.怎样把一个链表掉个顺序(也就是反序，注意链表的边界条件并考虑空链表)?&nbsp;--<br><br>　　15.请编写能直接实现int&nbsp;atoi(const&nbsp;char&nbsp;*&nbsp;pstr)函数功能的代码<br><br>-----------------------------------------------------------------------------------<br>第一组题答案：&nbsp;<br><br>　　<br>　　2)根据抽屉原理，4个<br><br>　　3)3升装满;3升-〉5升(全注入);3升装满;3升-〉5升(剩1升);5升倒掉;3升-〉5升(注入1升);3升装满;3升-〉5升;完成(另：可用回溯法编程求解)<br><br>　　4)问其中一人：另外一个人会说哪一条路是通往诚实国的?回答者所指的那条路必然是通往说谎国的。<br><br>　　5)12个球：<br><br>　　第一次：4，4&nbsp;如果平了：<br><br>　　那么剩下的球中取3放左边,取3个好球放右边，称：<br><br>　　如果左边重，那么取两个球称一下，哪个重哪个是次品，平的话第三个重，是次品，轻的话同理<br><br>　　如果平了，那么剩下一个次品，还可根据需要称出次品比正品轻或者重<br><br>　　如果不平：<br><br>　　那么不妨设左边重右边轻，为了便于说明，将左边4颗称为重球，右边4颗称为轻球，剩下4颗称为好球<br><br>　　取重球2颗，轻球2颗放在左侧，右侧放3颗好球和一颗轻球<br><br>　　如果左边重<br><br>　　称那两颗重球，重的一个次品，平的话右边轻球次品<br><br>　　如果右边重<br><br>　　称左边两颗轻球，轻的一个次品<br><br>　　如果平<br><br>　　称剩下两颗重球，重的一个次品，平的话剩下那颗轻球次品<br><br>　　13个球：<br><br>　　第一次：4，4，如果平了<br><br>　　剩5颗球用上面的方法仍旧能找出次品，只是不能知道次品是重是轻<br><br>　　如果不平，同上　<br><br>6)&nbsp;&nbsp;<br><br>　　o&nbsp;o&nbsp;o<br><br>　　o&nbsp;o&nbsp;o<br><br>　　o&nbsp;o&nbsp;o<br><br>　　7)<br><br>　　23次，因为分针要转24圈，时针才能转1圈，而分针和时针重合两次之间的间隔显然&gt;1小时，它们有23次重合机会，每次重合中秒针有一次重合机会，所以是23次<br><br>　　重合时间可以对照手表求出，也可列方程求出<br><br>　　8)<br><br>　　在地球表面种树，做一个地球内接的正四面体，内接点即为所求<br><br>　　第二组&nbsp;无标准答案&nbsp;&nbsp;<br><br>　　第三组&nbsp;<br><br>　　1.&nbsp;分成1,2,4三段，第一天给1，第二天给2取回1，第3天给1，第4天给4取回1、2，第5天给1，第6天给2取回1，第七天给1<br><br>　　2.&nbsp;求出火车相遇时间，鸟速乘以时间就是鸟飞行的距离<br><br>　　3.&nbsp;四个罐子中分别取1,2,3,4颗药丸，称出比正常重多少，即可判断出那个罐子的药被污染<br><br>　　4.&nbsp;三个开关分别：关，开，开10分钟，然后进屋，暗且凉的为开关1控制的灯，亮的为开关2控制的灯，暗且热的为开关3控制的灯<br><br>　　5.&nbsp;因为可以用1，2，5，10组合成任何需要的货币值，日常习惯为10进制<br><br>　　6.&nbsp;题意不理解...*_*<br><br>　　7.&nbsp;012345&nbsp;0126(9)78<br><br>　　第四组&nbsp;都是很难的题目&nbsp;&nbsp;<br><br>　　第一题：97&nbsp;0&nbsp;1&nbsp;2&nbsp;0&nbsp;或者&nbsp;97&nbsp;0&nbsp;1&nbsp;0&nbsp;2&nbsp;(提示：可用逆推法求出)<br><br>　　第二题：3架飞机5架次，飞法：<br><br>　　ABC&nbsp;3架同时起飞，1/8处，C给AB加满油，C返航，1/4处，B给A加满油，B返航，A到达1/2处，C从机场往另一方向起飞，3/4处，C同已经空油箱的A平分剩余油量，同时B从机场起飞，AC到7/8处同B平分剩余油量，刚好3架飞机同时返航。所以是3架飞机5架次。第三题：需要建立数学模型&nbsp;&nbsp;<br><br>　　(提示，严格证明该模型最优比较麻烦，但确实可证，大胆猜想是解题关键)<br><br>　　题目可归结为求数列&nbsp;an=500/(2n+1)&nbsp;n=0,1,2,3......的和Sn什么时候大于等于1000,解得n&gt;6<br><br>　　当n=6时，S6=977.57<br><br>　　所以第一个中转点离起始位置距离为1000-977.57=22.43公里<br><br>　　所以第一次中转之前共耗油&nbsp;22.43*(2*7+1)=336.50升<br><br>　　此后每次中转耗油500升<br><br>　　所以总耗油量为7*500+336.50=3836.50升<br><br>　　第四题：需要建立数学模型<br><br>　　题目可归结为求自然数列的和S什么时候大于等于100，解得n&gt;13<br><br>　　第一个杯子可能的投掷楼层分别为：14，27，39，50，60，69，77，84，90，95，99，100<br><br>　　第五题：3和4(可严格证明)<br><br>　　设两个数为n1，n2，n1&gt;=n2，甲听到的数为n=n1+n2，乙听到的数为m=n1*n2<br><br>　　证明n1=3，n2=4是唯一解<br><br>　　证明：要证以上命题为真，不妨先证n=7<br><br>　　1)必要性：<br><br>　　i)&nbsp;n&gt;5&nbsp;是显然的，因为n&lt;4不可能，n=4或者n=5甲都不可能回答不知道<br><br>　　ii)&nbsp;n&gt;6&nbsp;因为如果n=6的话，那么甲虽然不知道(不确定2+4还是3+3)但是无论是2，4还是3，3乙都不可能说不知道(m=8或者m=9的话乙说不知道是没有道理的)<br><br>　　iii)&nbsp;n&lt;8&nbsp;因为如果n&gt;=8的话，就可以将n分解成&nbsp;n=4+x&nbsp;和&nbsp;n=6+(x-2)，那么m可以是4x也可以是6(x-2)而4x=6(x-2)的必要条件是x=6即n=10，那样n又可以分解成8+2，所以总之当n&gt;=8时，n至少可以分解成两种不同的合数之和，这样乙说不知道的时候，甲就没有理由马上说知道。<br><br>　　以上证明了必要性<br><br>　　2)充分性<br><br>　　当n=7时，n可以分解成2+5或3+4<br><br>　　显然2+5不符合题意，舍去，容易判断出3+4符合题意，m=12，证毕<br><br>　　于是得到n=7&nbsp;m=12&nbsp;n1=3&nbsp;n2=4是唯一解。第六题：7只(数学归纳法证明)&nbsp;&nbsp;<br><br>　　1)若只有1只病狗，因为病狗主人看不到有其他病狗，必然会知道自己的狗是病狗(前提是一定存在病狗)，所以他会在第一天把病狗处决。<br><br>　　2)设有k只病狗的话，会在第k天被处决，那么，如果有k+1只，病狗的主人只会看到k只病狗，而第k天没有人处决病狗，病狗主人就会在第k+1天知道自己的狗是病狗，于是病狗在第k+1天被处决<br><br>　　3)由1)2)得，若有n只病狗，必然在第n天被处决<br><br>　　第八题：<br><br>　　约定好一个人作为报告人(可以是第一个放风的人)<br><br>　　规则如下：<br><br>　　1、报告人放风的时候开灯并数开灯次数<br><br>　　2、其他人第一次遇到开着灯放风时，将灯关闭<br><br>　　3、当报告人第100次开灯的时候，去向监狱长报告，要求监狱长放人......<br><br>　　按照概率大约30年后(10000天)他们可以被释放<br><br>　　第五组无标准答案&nbsp;&nbsp;<br><br>　　第六组部分题参考答案：&nbsp;&nbsp;<br><br>　　4.<br><br>char&nbsp;*&nbsp;strcpy(char&nbsp;*&nbsp;pstrDest,const&nbsp;char&nbsp;*&nbsp;pstrSource)<br>{<br>&nbsp;assert((pstrDest!=NULL)&amp;&amp;(pstrSource!=NULL));&nbsp;<br>&nbsp;char&nbsp;*&nbsp;pstr=pstrDest;<br>&nbsp;while((*(pstrDest++)=*(pstrSource++))!='\0');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;pstr;<br>}<br>&nbsp;<br><br><br>　　5.<br><br>char&nbsp;*&nbsp;strrev(char&nbsp;*&nbsp;pstr)<br>{<br>&nbsp;assert(pstr!=NULL);<br>&nbsp;<br>&nbsp;char&nbsp;*&nbsp;p=pstr;<br>&nbsp;char&nbsp;*&nbsp;pret=pstr;<br>&nbsp;while(*(p++)!='\0');<br>&nbsp;p--;<br>&nbsp;char&nbsp;tmp;<br>&nbsp;while(p&gt;pstr)<br>&nbsp;{<br>&nbsp;&nbsp;tmp=*p;<br>&nbsp;&nbsp;*(p--)=*(pstr);<br>&nbsp;&nbsp;*(pstr++)=tmp;&nbsp;&nbsp;<br>&nbsp;}<br>&nbsp;return&nbsp;pret; <br><br>百度笔试题：<br>IP段格式:ip1&nbsp;ip2。之间以空格分开，ip形式为X.X.X.X，数据保存在文件中，文件不超过2k行，无序。现在要求编写算法去掉可重IP，可重有三种形式：包含、交叠、紧靠。 <br><br>例如，文件内容为： <br>10.0.0.0&nbsp;10.0.0.12 <br>10.0.0.5&nbsp;10.0.0.10&nbsp;&nbsp;&nbsp;&nbsp;( &lt;=&nbsp;包含) <br>10.0.0.8&nbsp;10.0.0.<span style="COLOR: #ff0000">15</span>&nbsp;&nbsp;&nbsp;&nbsp;( &lt;=&nbsp;交叠) <br>10.0.0.<span style="COLOR: #ff00ff">15</span>&nbsp;10.0.0.24&nbsp;&nbsp;&nbsp;( &lt;=&nbsp;紧靠) <br><br>最后输出为: <br>10.0.0.0&nbsp;10.0.0.24</p>
<p>code：<br>/*<br>**这个函数的作用是将文件中的一行对应的两个数据转换成整形的数据<br>**比如把10.0.0.0&nbsp;10.0.0.12 转换后，left=10*2<sup>24,</sup>就是10.0.0.0对应的整数，每个数字对应8位，right=left+12<br>*/<br>void ParseLine( char line[], size_t length, unsigned int &amp;left, unsigned int &amp;right)<br>{<br>&nbsp;&nbsp;&nbsp; size_t i;<br>&nbsp;&nbsp;&nbsp; for( i=0; i&lt;length; i++ )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( line[i]=='.' || line[i]==' ' )//将点变成0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line[i]=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <font style="BACKGROUND-COLOR: #00ffff"><font style="BACKGROUND-COLOR: #ffff00">char *p&nbsp;&nbsp; = (char*)&amp;left;</font><br></font>&nbsp;&nbsp;&nbsp; char *num = line;<br>&nbsp;&nbsp;&nbsp; for( i=3; i&lt;4; --i ) //<font color=#ff0000>size是size_t，而size_t是unsigned int，所以i=0再自减后变成了最大的整数，循环就会终止<br></font>&nbsp;&nbsp;&nbsp; {<br>&nbsp;//&nbsp;cout&lt;&lt;i&lt;&lt;",";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *(p+i) = strtol( num, &amp;num&nbsp; ,10 );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;cout&lt;&lt;static_cast&lt;int&gt;(*(p+i))&lt;&lt;",";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ++num;<br>&nbsp;//&nbsp;cout&lt;&lt;num&lt;&lt;":";<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; cout&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp; p = (char*)&amp;right;<br>&nbsp;&nbsp;&nbsp; for( i=3; i&lt;4; --i )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *(p+i) = strtol( num, &amp;num, 10 );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ++num;<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p><br>void UniqueSequence(&nbsp; vector&lt;unsigned int&gt; &amp; uSeq, unsigned int left, unsigned int right )<br>{<br>&nbsp;&nbsp;&nbsp; size_t i, lPos=-1, rPos=-1;<br>&nbsp;&nbsp;&nbsp; for( i=0; i&lt;uSeq.size(); i++ )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( left &lt;= uSeq.at(i)&nbsp; )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lPos = i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; for( ;i&lt;uSeq.size(); i++ )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( right&lt;=uSeq.at(i) )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rPos=i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; if( lPos == -1 )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uSeq.push_back( left );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uSeq.push_back( right );&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; if( lPos%2 == 0 )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(&nbsp; uSeq.at(lPos)==left )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uSeq.insert( uSeq.begin()+lPos, left );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --lPos;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; if( rPos == -1 )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uSeq.erase( uSeq.begin()+(lPos+1), uSeq.end() );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uSeq.push_back(right);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;else if(&nbsp; rPos%2 == 0&nbsp; )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( uSeq.at(rPos)== right )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uSeq.erase( uSeq.begin()+(lPos+1), uSeq.begin()+(rPos+1) );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uSeq.erase( uSeq.begin()+(lPos+1), uSeq.begin()+rPos );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uSeq.insert( uSeq.begin()+rPos, right&nbsp; );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uSeq.erase( uSeq.begin()+(lPos+1), uSeq.begin()+rPos );<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p><br>void PrintIP( unsigned int num )<br>{<br>&nbsp;&nbsp;&nbsp; char *p = (char*)&amp;num;<br>&nbsp;&nbsp;&nbsp; for( size_t i=3;i&gt;0; --i)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt; (int)p[i]&lt;&lt;".";<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; cout&lt;&lt;(int)p[0];<br>}</p>
<p>#define MAX_BUFFER_LENGTH 100<br>int main()<br>{<br>&nbsp;&nbsp;&nbsp; unsigned int left, right;<br>&nbsp;&nbsp;&nbsp; char buffer[MAX_BUFFER_LENGTH];<br>&nbsp;&nbsp;&nbsp; ifstream infile( "test.txt" );<br>&nbsp;&nbsp;&nbsp; if( infile.fail() )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; vector&lt;unsigned int&gt; uSeq;<br>&nbsp;&nbsp;&nbsp; while( infile.getline(buffer, MAX_BUFFER_LENGTH) )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ParseLine(buffer, strlen(buffer), left, right);<br>&nbsp;//&nbsp;cout&lt;&lt;left&lt;&lt;","&lt;&lt;right&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UniqueSequence( uSeq, left, right );<br>&nbsp;&nbsp;for( size_t i=0; i&lt;uSeq.size(); i+=2 )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintIP(uSeq.at(i) );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"&nbsp; ";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintIP(uSeq.at(i+1));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;cout&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; for( size_t i=0; i&lt;uSeq.size(); <font color=#ff0000>i+=2</font> )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintIP(uSeq.at(i) );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"&nbsp; ";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintIP(uSeq.at(i+1));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br><br>/*<strong>long</strong> <strong>strtol(</strong> <strong>const</strong> <strong>char</strong> <strong>*</strong><em>nptr</em><strong>,</strong> <strong>char</strong> <strong>**</strong><em>endptr</em><strong>,</strong> <strong>int</strong> <em>base</em> <strong>),</strong>其中nptr是以NULL结尾字符串，<em>endptr</em>是字符串停止扫描的地方（Pointer to character that stops scan），<strong>strtol</strong> returns the value represented in the string <em>nptr，The <strong>strtol</strong> function converts nptr to a <strong>long</strong>. <strong>strtol</strong> stops reading the string nptr at the first character it cannot recognize as part of a number. This may be the terminating null character, or it may be the first numeric character greater than or equal to base. <br></em><font style="BACKGROUND-COLOR: #ffcc00">string = "-10110134932This stopped it";<br>&nbsp; l = strtol( string, &amp;stopstring, 10 );<br>&nbsp; printf( "string = %s", string );<br>&nbsp; printf("&nbsp;&nbsp; strtol = %ld", l );<br>&nbsp; printf("&nbsp;&nbsp; Stopped scan at: %s", stopstring );<br>&nbsp; string = "10110134932";<br>&nbsp; printf( "string = %s\n", string );<br>&nbsp; /* Convert string using base 2, 4, and 8: */<br>&nbsp; for( base = 2; base &lt;= 8; base *= 2 )<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp; /* Convert the string: */<br>&nbsp;&nbsp;&nbsp;&nbsp; ul = strtoul( string, &amp;stopstring, base );<br>&nbsp;&nbsp;&nbsp;&nbsp; printf( "&nbsp;&nbsp; strtol = %ld (base %d)\n", ul, base );<br>&nbsp;&nbsp;&nbsp;&nbsp; printf( "&nbsp;&nbsp; Stopped scan at: %s\n", stopstring );<br>&nbsp; }<br>打印的结果是：<br>string = -10110134932This stopped it&nbsp;&nbsp; strtol = -2147483647&nbsp;&nbsp; Stopped scan at: This stopped itstring = 10110134932<br>&nbsp; strtol = 45 (base 2)<br>&nbsp; Stopped scan at: 34932<br>&nbsp; strtol = 4423 (base 4)<br>&nbsp; Stopped scan at: 4932<br>&nbsp; strtol = 2134108 (base 8)<br>&nbsp; Stopped scan at: 932<br>*/</font></p>
<p><font style="BACKGROUND-COLOR: #ffffff">5.如果存在两个变量：a和b，不使用&#8220;if&#8221;、&#8220;?:&#8221;、 &#8220;switch&#8221;和其它的判断语句，找出两个数中的最大值。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 答案：( ( a + b ) + abs( a - b ) ) / 2</font></p>
<p>6. 写一个函数找出一个整数数组中，第二大的数 （microsoft）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const int MINNUMBER = -32767 ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int find_sec_max( int data[] , int count)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int maxnumber = data[0] ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int sec_max = MINNUMBER ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for ( int i = 1 ; i &lt; count ; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( data[i] &gt; maxnumber )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sec_max = maxnumber ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxnumber = data[i] ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( data[i] &gt; sec_max )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sec_max = data[i] ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return sec_max ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
</div>
<img src ="http://www.cppblog.com/Cunch/aggbug/141391.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cunch/" target="_blank">Cunch</a> 2011-03-09 08:04 <a href="http://www.cppblog.com/Cunch/archive/2011/03/09/141391.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转C++笔试</title><link>http://www.cppblog.com/Cunch/archive/2011/03/09/141390.html</link><dc:creator>Cunch</dc:creator><author>Cunch</author><pubDate>Tue, 08 Mar 2011 23:55:00 GMT</pubDate><guid>http://www.cppblog.com/Cunch/archive/2011/03/09/141390.html</guid><wfw:comment>http://www.cppblog.com/Cunch/comments/141390.html</wfw:comment><comments>http://www.cppblog.com/Cunch/archive/2011/03/09/141390.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Cunch/comments/commentRss/141390.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cunch/services/trackbacks/141390.html</trackback:ping><description><![CDATA[<div class=postText>
<p><br>一、如何判断一个单链表是有环的？（注意不能用标志位，最多只能用两个额外指针）<br>&nbsp;&nbsp; struct node { char val; node* next;}<br>&nbsp;&nbsp;&nbsp;bool check(const node* head) {} //return&nbsp;false : 无环；true: 有环<br>&nbsp;&nbsp;&nbsp; 一种O（n）的办法就是（搞两个指针，一个每次递增一步，一个每次递增两步，如果有环的话两者必然重合，反之亦然）：<br>&nbsp;&nbsp;&nbsp;&nbsp;bool check(const node* head)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(head==NULL)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;return false;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;node *low=head, *fast=head-&gt;next;<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while(fast!=NULL &amp;&amp; fast-&gt;next!=NULL)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; low=low-&gt;next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fast=fast-&gt;next-&gt;next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(low==fast) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp; }</p>
<p>&nbsp;二、删除一个单项链表的最中间的元素，要求时间尽可能短（不能使用两次循环）<br>struct link<br>{<br>&nbsp;&nbsp;&nbsp; int data;<br>&nbsp;&nbsp;&nbsp; struct link *next;<br>};<br><font color=#ff0000>void delMiddle(link *head)<br></font>{<br>&nbsp;&nbsp; &nbsp;if(head == NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp; &nbsp;else if(head-&gt;next == NULL)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;delete head;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;return;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp; &nbsp;else<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;link *low = head;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; link *fast = head-&gt;next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(fast != NULL &amp;&amp; fast-&gt;next != NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;{&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;fast = fast-&gt;next-&gt;next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;if(fast == NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;low = low-&gt;next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; link *temp = low-&gt;next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;low-&gt;next = low-&gt;next-&gt;next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;delete temp;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; }<br>}<br>int main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;struct link *head,*l;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct link *s;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;head = (link*)malloc(sizeof(link));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; head-&gt;data=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;head-&gt;next = NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l = head;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;for(int i=1; i&lt;9; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s = (link*)malloc(sizeof(link));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s-&gt;data = i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s-&gt;next = NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l-&gt;next= s;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;l = l-&gt;next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(head);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;delMiddle(head);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(head);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
<p>三、输入n，求一个n*n矩阵，规定矩阵沿45度线递增(威盛)<br><span style="COLOR: #008000">/**<br>&nbsp;* 得到如下样式的二维数组<br>* zigzag（jpeg编码里取象素数据的排列顺序）<br>*<br>*&nbsp;&nbsp; 0, 1, 5, 6,14,15,27,28,<br>*&nbsp;&nbsp; 2, 4, 7,13,16,26,29,42,<br>*&nbsp;&nbsp; 3, 8,12,17,25,30,41,43,<br>*&nbsp;&nbsp; 9,11,18,24,31,40,44,53,<br>*&nbsp;&nbsp; 10,19,23,32,39,45,52,54,<br>*&nbsp;&nbsp; 20,22,33,38,46,51,55,60,<br>*&nbsp;&nbsp; 21,34,37,47,50,56,59,61,<br>*&nbsp;&nbsp; 35,36,48,49,57,58,62,63<br>&nbsp;*/</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">void zigzag(int n)<br>{<br>&nbsp;int **a =(int**) malloc(n*sizeof(int *));&nbsp; //分配空间<br>&nbsp;<br>&nbsp;if(NULL == a)<br>&nbsp;&nbsp;return ;<br>&nbsp;int i;<br>&nbsp;for(i = 0; i &lt; n; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((a[i] =(int*) malloc(n * sizeof(int))) == NULL) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(--i&gt;=0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(a[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(a);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;bool flag = false; //这个标志位用来判断是从45度角生成还是225度角生成<br>&nbsp;int count = 0;<br>&nbsp;for(i=0; i&lt;n; i++)&nbsp; //生成的上半部分的数据<br>&nbsp;{<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;if(flag)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;for(int r = 0; r&lt;=i; r++)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;a[r][i-r] = count;<br>&nbsp;&nbsp;&nbsp;&nbsp;count++;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;flag = false;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;for(int r = i; r&gt;=0; r--)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;a[r][i-r] = count;<br>&nbsp;&nbsp;&nbsp;&nbsp;count++;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;flag = true;<br>&nbsp;&nbsp;}<br>&nbsp;}<br>&nbsp;for(i=n-1; i&gt;=0; i--)&nbsp; //生成的是下半部分的数据<br>&nbsp;{<br>&nbsp;//&nbsp;cout&lt;&lt;i&lt;&lt;endl;<br>&nbsp;&nbsp;if(flag)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;for(int r = 0; r&lt;=i-1; r++)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;int r1 = n-i+r;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //代表当前行<br>&nbsp;&nbsp;&nbsp;&nbsp;int c1 = 2*n-i-1-r1;&nbsp; //代表当前列<br>&nbsp;&nbsp;&nbsp;&nbsp;a[r1][c1] = count;<br>&nbsp;&nbsp;&nbsp;&nbsp;count++;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;flag = false;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;for(int r = i-1; r&gt;=0; r--)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"ddd"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;int r1 = n-i+r;<br>&nbsp;&nbsp;&nbsp;&nbsp;int c1 = 2*n-i-1-r1;<br>&nbsp;//&nbsp;&nbsp;&nbsp;cout&lt;&lt;r1&lt;&lt;","&lt;&lt;c1&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;a[r1][c1] = count;<br>&nbsp;&nbsp;&nbsp;&nbsp;count++;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;flag = true;<br>&nbsp;&nbsp;}<br>&nbsp;}<br>&nbsp;for(int r = 0; r&lt;n; r++)<br>&nbsp;{<br>&nbsp;&nbsp;for(int c=0; c&lt;n; c++)<br>&nbsp;&nbsp;&nbsp;cout&lt;&lt;a[r][c]&lt;&lt;",";<br>&nbsp;&nbsp;cout&lt;&lt;endl;<br>&nbsp;}<br>}<br>int main()<br>{<br>&nbsp;int n;<br>&nbsp;cin&gt;&gt;n;<br>&nbsp;zigzag(n);<br>&nbsp;return 0;<br>}<br>网上还有一个人写了一个比较巧的算法：<br><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*<br>* 得到如下样式的二维数组<br>* zigzag（jpeg编码里取象素数据的排列顺序）<br>*<br>*&nbsp;&nbsp; 0, 1, 5, 6,14,15,27,28,<br>*&nbsp;&nbsp; 2, 4, 7,13,16,26,29,42,<br>*&nbsp;&nbsp; 3, 8,12,17,25,30,41,43,<br>*&nbsp;&nbsp; 9,11,18,24,31,40,44,53,<br>*&nbsp;&nbsp; 10,19,23,32,39,45,52,54,<br>*&nbsp;&nbsp; 20,22,33,38,46,51,55,60,<br>*&nbsp;&nbsp; 21,34,37,47,50,56,59,61,<br>*&nbsp;&nbsp; 35,36,48,49,57,58,62,63<br></span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br><br>#include </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></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main()<br>{<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> N;<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> s, i, j;<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> squa;<br>&nbsp;&nbsp;&nbsp; scanf(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">%d</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">N);<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> 分配空间 </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">a </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> malloc(N </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">));<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(a </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> N; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">((a[i] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> malloc(N </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">))) </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> NULL) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">i</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(a[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(a);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> 数组赋值 </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp; squa </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> N</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">N;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> N; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(j </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">; j </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> N; j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> j;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(s </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> N)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=#ff0000>a[i][j] </font></span><font color=#ff0000><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> s</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(s</span><span style="COLOR: #000000">+</span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">/</span><span style="COLOR: #800080">2</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> (((i</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">j)</span><span style="COLOR: #000000">%</span><span style="COLOR: #800080">2</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">?</span></font><span style="COLOR: #000000"><font color=#ff0000> i : j);<br></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (N</span><span style="COLOR: #000000">-</span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">i) </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> (N</span><span style="COLOR: #000000">-</span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">j);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=#ff0000>a[i][j] </font></span><font color=#ff0000><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> squa </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> s</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(s</span><span style="COLOR: #000000">+</span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">/</span><span style="COLOR: #800080">2</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> (N </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> (((i</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">j)</span><span style="COLOR: #000000">%</span><span style="COLOR: #800080">2</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">?</span></font><span style="COLOR: #000000"><font color=#ff0000> i : j));<br></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> 打印输出 </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> N; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(j </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">; j </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> N; j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">%-6d</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">, a[i][j]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">\n</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">;<br>}<br></span></span></p>
<p><span style="COLOR: #000000"><span style="COLOR: #000000">四、打印1到1000的整数，不能使用流程控制语句(for,while,goto等)也不能使用递归<br>1.<br>typedef <span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000"> _test{<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> a;<br>&nbsp;&nbsp;&nbsp; _test(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">%d\n</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">,_test::a);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }Test;<br>&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> Test::a </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">;<br><br>&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp; main()&nbsp;&nbsp; <br>&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; Test tt[</span><span style="COLOR: #800080">1000</span><span style="COLOR: #000000">];<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">;<br>&nbsp; }&nbsp;&nbsp; <br>2.<br>#include &nbsp; &lt;stdio.h&gt; <br>#define &nbsp; B &nbsp; P,P,P,P,P,P,P,P,P,P <br>#define &nbsp; P &nbsp; L,L,L,L,L,L,L,L,L,L <br>#define &nbsp; L &nbsp; I,I,I,I,I,I,I,I,I,I,N <br>#define &nbsp; I &nbsp; printf( "%3d &nbsp; ",i++) <br>#define &nbsp; N &nbsp; printf( "\n ")&nbsp;<br>int&nbsp; main() <br>{ <br>&nbsp; &nbsp; int &nbsp; i &nbsp; = &nbsp; 1; <br>&nbsp; &nbsp; B; <br>} <br>或<br><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000"> A(x) x;x;x;x;x;x;x;x;x;x;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main () <br>{<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> n </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">; <br>&nbsp;&nbsp;&nbsp; A(A(A(printf (</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">%d </span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">, n</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">))));<br><br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">;<br>}</span><br><br></span></span></span><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></p>
<p><span style="COLOR: #000000">五、struct &nbsp; S &nbsp; { <br>&nbsp; &nbsp; &nbsp; &nbsp; int &nbsp; i; <br>&nbsp; &nbsp; &nbsp; &nbsp; int &nbsp; * &nbsp; p; <br>}; <br>void &nbsp; main() <br>{ <br>&nbsp; &nbsp; &nbsp; &nbsp; S &nbsp; s; <br>&nbsp; &nbsp; &nbsp; &nbsp; int &nbsp; * &nbsp; p &nbsp; = &nbsp; &amp;s.i; <br>&nbsp; &nbsp; &nbsp; &nbsp; p[0] &nbsp; = &nbsp; 4; <br>&nbsp; &nbsp; &nbsp; &nbsp; p[1] &nbsp; = &nbsp; 3; <br>&nbsp; &nbsp; &nbsp; &nbsp; s.p &nbsp; = &nbsp; p; <br>&nbsp; &nbsp; &nbsp; &nbsp; s.p[1] &nbsp; = &nbsp; 1; <br>&nbsp; &nbsp; &nbsp; &nbsp; s.p[0] &nbsp; = &nbsp; 2; <br>} <br>问程序会在哪一行死掉。 （microsoft）<br>解： S&nbsp;&nbsp; s; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp; </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;&nbsp; p&nbsp;&nbsp; </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp; </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">s.i;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">s.i的地址存储在p里</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p[</span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">]&nbsp;&nbsp; </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp; </span><span style="COLOR: #800080">4</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">修改了s.i</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p[</span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">]&nbsp;&nbsp; </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp; </span><span style="COLOR: #800080">3</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">修改了s.p</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;s.p&nbsp;&nbsp; </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp; p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">s.p指向s.i</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;s.p[</span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">]&nbsp;&nbsp; </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp; </span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">修改s.p本身</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.p[</span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">]&nbsp;&nbsp; </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp; </span><span style="COLOR: #800080">2</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">s.p指向的是0x00000001,尝试向这里写,出错<br><font color=#000000>&nbsp;&nbsp;&nbsp;&nbsp; s.p[0] &nbsp; &nbsp; &nbsp; = &nbsp; &nbsp; &nbsp; 2; &nbsp; 时出错 <br>&nbsp;&nbsp;&nbsp;&nbsp; 因为s.p存的是s.i的地址,s.p[1]为s.p,当s.p[1]=1时,s.p此时存放的是1了,而不是地址s.i,故在s.p[0] &nbsp; = &nbsp; 2时出错. <br>此时相当于s.p=ox00000001;地址ox0000001 &nbsp; = &nbsp; 2;当然就出错了 <br><br>如果语句s.p[0] &nbsp; =2 &nbsp; 先于s.p[1]=1则程序就不会出错.此时语句相当于s.i=2;s.p=1; </font><br></span></span></p>
<p><span style="COLOR: #000000">六、题目描述： <br>1.&nbsp;&nbsp; int &nbsp; swap(int &nbsp; *x,int &nbsp; *y) <br>{ <br>&nbsp; &nbsp; if(x==NULL &nbsp; &#166; &#166; &nbsp; y==NULL) <br>&nbsp; &nbsp; &nbsp; &nbsp; return &nbsp; -1; <br>&nbsp; &nbsp; *x &nbsp; += &nbsp; *y; <br>&nbsp; &nbsp; *y &nbsp; = &nbsp; *x- &nbsp; *y; <br>&nbsp; &nbsp; *x &nbsp; -= &nbsp; *y; <br>&nbsp; &nbsp; &nbsp; return &nbsp; 1; <br>} <br>请改错，溢出已经考虑，不是错误 <br>2. <br>void &nbsp; foo(int &nbsp; *x, &nbsp; int &nbsp; *y) <br>{ <br>&nbsp; &nbsp; *x &nbsp; += &nbsp; *y; <br>&nbsp; &nbsp; *x &nbsp; += &nbsp; *y; <br>} <br>void &nbsp; fun(int &nbsp; *x, &nbsp; int &nbsp; *y) <br>{ &nbsp; <br>&nbsp; &nbsp; *x &nbsp; += &nbsp; 2 &nbsp; * &nbsp; (*y); <br>&nbsp; } <br>问两个函数是否等价，能否互换 <br>解答<font color=#ff0000>：第一题的函数是交换。但假如考虑x, &nbsp; y都是指向同一个变量,结果是这个变量的值为0. <br>第二题的两个函数是有区别的,也考虑x,y是指向同一个变量.这样第一个函数的结果是这个变量的4倍.但第二个函数的结果是变量的3倍</font>.<br></span></p>
</div>
<img src ="http://www.cppblog.com/Cunch/aggbug/141390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cunch/" target="_blank">Cunch</a> 2011-03-09 07:55 <a href="http://www.cppblog.com/Cunch/archive/2011/03/09/141390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>