<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dutor &#187; C</title>
	<atom:link href="http://www.dutor.net/index.php/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.dutor.net</link>
	<description>熟读而精思，循序而渐进，厚积而薄发。</description>
	<lastBuildDate>Tue, 17 Jan 2012 14:44:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>关于变参</title>
		<link>http://www.dutor.net/index.php/2011/08/variadic/</link>
		<comments>http://www.dutor.net/index.php/2011/08/variadic/#comments</comments>
		<pubDate>Sun, 07 Aug 2011 02:32:20 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Cpp]]></category>
		<category><![CDATA[可变参数]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=2626</guid>
		<description><![CDATA[<h4>使用变参</h4>
　　C/C++提供了函数的可变参数(variadic)机制，大部分人写的第一个C程序恐怕就是Hello World吧，使用的应该也是printf("Hello, World\n")。printf就是一个使用可变参数的典型，它的原型声明为，
<pre lang="C">
int printf(const char *fmt, ...);
</pre>
　　其中返回值为实际输出字符个数，fmt为格式控制字符串，而"..."便声明了一个可变参数，你可以根据传递0个或多个参数给printf。printf内部会根据格式控制串中的格式指定符号（d, f, p等等）来逐个解析通过可变参数传进的实参变量。
　　为解析可变参数，C语言提供了一个va_list类型和四个宏，分别是va_start, va_arg, va_end, 和va_copy，这些宏声明在stdarg.h中。]]></description>
			<content:encoded><![CDATA[<h4>使用变参</h4>
<p>　　C/C++提供了函数的可变参数(variadic)机制，大部分人写的第一个C程序恐怕就是Hello World吧，使用的应该也是printf(&#8220;Hello, World\n&#8221;)。printf就是一个使用可变参数的典型，它的原型声明为，</p>

<div class="wp_codebox"><table><tr id="p26261"><td class="code" id="p2626code1"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>fmt<span style="color: #339933;">,</span> ...<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>　　其中返回值为实际输出字符个数，fmt为格式控制字符串，而&#8221;&#8230;&#8221;便声明了一个可变参数，你可以根据传递0个或多个参数给printf。printf内部会根据格式控制串中的格式指定符号（d, f, p等等）来逐个解析通过可变参数传进的实参变量。<br />
　　为解析可变参数，C语言提供了一个va_list类型和四个宏，分别是va_start, va_arg, va_end, 和va_copy，这些宏声明在stdarg.h中。为了方便描述，下面实现一个简单的类似printf的函数：</p>

<div class="wp_codebox"><table><tr id="p26262"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
</pre></td><td class="code" id="p2626code2"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> mockprintf<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>fmt<span style="color: #339933;">,</span> ...<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    va_list ap<span style="color: #339933;">;</span>
    va_start<span style="color: #009900;">&#40;</span>ap<span style="color: #339933;">,</span> fmt<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>s <span style="color: #339933;">=</span> fmt<span style="color: #339933;">;</span> <span style="color: #339933;">*</span>s<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>s<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">switch</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>s<span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'d'</span><span style="color: #339933;">:</span>
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;meet d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #993333;">int</span> d <span style="color: #339933;">=</span> va_arg<span style="color: #009900;">&#40;</span>ap<span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> d<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'s'</span><span style="color: #339933;">:</span>
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;meet s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>str <span style="color: #339933;">=</span> va_arg<span style="color: #009900;">&#40;</span>ap<span style="color: #339933;">,</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'c'</span><span style="color: #339933;">:</span>
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;meet c<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #993333;">char</span> c <span style="color: #339933;">=</span> va_arg<span style="color: #009900;">&#40;</span>ap<span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%c<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> c<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">default</span><span style="color: #339933;">:</span>
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;unknown format specifier<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    va_end<span style="color: #009900;">&#40;</span>ap<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #993333;">int</span>
main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    mockprintf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;cdfs&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'A'</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x45</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;string&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>　　va_list的实现与编译器和平台相关，通常是一个指向参数栈的指针。va_start使用变参列表前的最后一个命名参数（named argument）作为参数，以此定位变参列表的第一个参数的地址，并将ap指向该参数（此处假设va_list实现为指针）。宏va_arg需要两个参数，va_list变量和下一个预期的参数的类型，该宏以指定类型返回（展开为）对应的参数值，并调整va_list指向下一个参数。最后，每一个va_start需要一个va_end作为结束。另外，示例函数中没有用到va_copy，这是一个用来复制va_list变量到另一个va_list变量的宏，目的是应对平台间va_list实现的差异。<br />
　　值得一提的是，va_start和va_end可以重复调用，用以多次对变参列表进行解析。</p>
<h4>printf家族</h4>
<p>　　C的printf家族包含8个成员，原型如下，</p>

<div class="wp_codebox"><table><tr id="p26263"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code" id="p2626code3"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #993333;">int</span> <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>fmt<span style="color: #339933;">,</span> ...<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> fprintf<span style="color: #009900;">&#40;</span>FILE <span style="color: #339933;">*</span>stream<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>fmt<span style="color: #339933;">,</span> ...<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> sprintf<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>str<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>fmt<span style="color: #339933;">,</span> ...<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> snprintf<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>str<span style="color: #339933;">,</span> size_t size<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>fmt<span style="color: #339933;">,</span> ...<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #339933;">#include &lt;stdarg.h&gt;</span>
<span style="color: #993333;">int</span> vprintf<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>fmt<span style="color: #339933;">,</span> va_list ap<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> vfprintf<span style="color: #009900;">&#40;</span>FILE <span style="color: #339933;">*</span>stream<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>fmt<span style="color: #339933;">,</span> va_list ap<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> vsprintf<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>str<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>fmt<span style="color: #339933;">,</span> va_list ap<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> vsnprintf<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>str<span style="color: #339933;">,</span> size_t size<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>fmt<span style="color: #339933;">,</span> va_list ap<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>　　前四个函数没有什么特殊的。后面四个v系列可以接受va_list变量，通常用在对可变参数输出的包装，在日志记录系统中较为常用。比如下面代码，</p>

<div class="wp_codebox"><table><tr id="p26264"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p2626code4"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">enum</span> LogLevel <span style="color: #008000;">&#123;</span> ERROR, WARN, INFO, DEBUG <span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">void</span> <span style="color: #0000dd;">log</span><span style="color: #008000;">&#40;</span>LogLevel level, <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>fmt, ...<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">va_list</span> ap<span style="color: #008080;">;</span>
    <span style="color: #0000dd;">va_start</span><span style="color: #008000;">&#40;</span>ap, fmt<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    vsnprintf<span style="color: #008000;">&#40;</span>buf, <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>buf<span style="color: #008000;">&#41;</span>, fmt, ap<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">va_end</span><span style="color: #008000;">&#40;</span>ap<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #666666;">//~ write buf to file, or do something else.</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>　　v系列函数并不会调用va_end宏，因此在这些函数返回后，需要调用函数自己进行va_end。若要再次解析变参列表，就需要重新va_start, va_end。</p>
<h4>宏变参</h4>
<p>　　除了函数，在C/C++中，带参宏定义也可以接受变参，使用方法和函数类似。比如，若将上面的log函数的某个级别的日志输入定义成宏，</p>

<div class="wp_codebox"><table><tr id="p26265"><td class="code" id="p2626code5"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define log_warn(fmt, ...) log(WARN, fmt, __VA_ARGS__)</span></pre></td></tr></table></div>

<p>　　__VA_ARGS__只是被预处理器简单的展开为传递给宏log_warn的变参列表，包括逗号分隔符。若想使用具有鲜明意义的名字，而不是统一的__VA_ARGS__，可以这样，</p>

<div class="wp_codebox"><table><tr id="p26266"><td class="code" id="p2626code6"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define log_warn(fmt, args...) log(WARN, fmt, args)</span></pre></td></tr></table></div>

<p>　　上述宏定义中，有一个问题值得注意，就是当变参列表为空时，log函数调用的参数列表会有一个结尾的逗号，这在某些编译器中会被诊断为错误（据说MSVC不会），这种情况下可以将fmt也纳入变参列表，</p>

<div class="wp_codebox"><table><tr id="p26267"><td class="code" id="p2626code7"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define log_warn(...) log(WARN, __VA_ARGS__)</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2011/08/variadic/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>关于头文件</title>
		<link>http://www.dutor.net/index.php/2011/04/about-header-files/</link>
		<comments>http://www.dutor.net/index.php/2011/04/about-header-files/#comments</comments>
		<pubDate>Sat, 09 Apr 2011 03:23:02 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Cpp]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=2547</guid>
		<description><![CDATA[　　头文件中通常包含有：函数原型（声明）、宏定义、内联函数定义。
　　头文件使用#include宏命令引入。有两种形式：#inlcude &#60;header.h>和#include "header.h". 两种形式的区别在于预处理器（preprocessor）查找头文件的方式的不同：对于前者，预处理器仅在系统预定义的标准路径中查找（标准查找路径由环境变量指明），比如/usr/include, /usr/local/include；对于后者，预处理器首先查找（源文件所在的）当前目录，若未找到，则到标准路径查找。另外，查找路径还可以通过编译器选项（-I for gcc）指定。通常，对于C/C++标准库和其他系统范围的程序库，使用&#60;>形式，对于程序本身定义的头文件，采用""形式。]]></description>
			<content:encoded><![CDATA[<p>　　头文件中通常包含有：函数原型（声明）、宏定义、内联函数定义。<br />
　　头文件使用#include宏命令引入。有两种形式：#inlcude &lt;header.h>和#include &#8220;header.h&#8221;. 两种形式的区别在于预处理器（preprocessor）查找头文件的方式的不同：对于前者，预处理器仅在系统预定义的标准路径中查找（标准查找路径由环境变量指明），比如/usr/include, /usr/local/include；对于后者，预处理器首先查找（源文件所在的）当前目录，若未找到，则到标准路径查找。另外，查找路径还可以通过编译器选项（-I for gcc）指定。通常，对于C/C++标准库和其他系统范围的程序库，使用&lt;>形式，对于程序本身定义的头文件，采用&#8221;"形式。<br />
　　编译器在传递参数给函数时，依据的是该函数的原型。因此，在调用外部函数时，务必包含其对应的头文件，否则，可能会出现传递的参数与函数实际使用的参数格式不一致的情况。瞧，</p>

<div class="wp_codebox"><table><tr id="p25478"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code" id="p2547code8"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//~ foo.c</span>
<span style="color: #993333;">float</span> 
foo<span style="color: #009900;">&#40;</span><span style="color: #993333;">float</span> f<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> f <span style="color: #339933;">*</span> f<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">//~ main.c</span>
<span style="color: #993333;">int</span>
main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">double</span> d <span style="color: #339933;">=</span> foo<span style="color: #009900;">&#40;</span><span style="color:#800080;">3.1415926</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>独立编译，</p>

<div class="wp_codebox"><table><tr id="p25479"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p2547code9"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">cc</span> foo.c main.c <span style="color: #660033;">-c</span>
$ <span style="color: #c20cb9; font-weight: bold;">cc</span> foo.o main.o <span style="color: #660033;">-omain</span>
$ .<span style="color: #000000; font-weight: bold;">/</span>main</pre></td></tr></table></div>

<p>　　你执行上面程序可能没发现什么问题，但在某些情况下，问题就来了。比如，如果编译器只使用栈来传递浮点数，main中向foo传递的是double（通常浮点字面常量被编译器解释为double），foo却按float处理参数，结果可想而知了。</p>
<p>　　对于内联函数（内联展开只是对编译器的建议），由于编译器在进行内联展开时需要看到函数的定义（而不仅仅是原<br />
型），所以，内联函数通常直接在头文件中声明和定义。如果把内联函数的定义同其他<br />
函数一样，将声明和定义分开（在单独的源文件中定义），那么该“内联”函数就只能在其所定义的文件中展开。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2011/04/about-header-files/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>何谓格式化输入/输出</title>
		<link>http://www.dutor.net/index.php/2010/10/format-stdio/</link>
		<comments>http://www.dutor.net/index.php/2010/10/format-stdio/#comments</comments>
		<pubDate>Fri, 22 Oct 2010 02:22:48 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=2494</guid>
		<description><![CDATA[　　不多说，都在代码里了。
<pre lang="cpp" line="1">
#include <stdio.h>

int
main(int AC, char **AV)
{
    FILE *fd = fopen("data", "w+");
    fprintf(fd, "%x%c", 0x41, '1');
    fseek(fd, 0, SEEK_SET);
    int n;
    fscanf(fd, "%d", &#038;n);
    fseek(fd, 0, SEEK_SET);
    char s[4];
    int c = fread(s, 1, sizeof(s), fd);
    s[c] = '\0';
    printf("%d, %s\n", n, s);
    fclose(fd);
    return 0;
}
</pre>]]></description>
			<content:encoded><![CDATA[<p>　　不多说，都在代码里了。</p>

<div class="wp_codebox"><table><tr id="p249410"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code" id="p2494code10"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #0000ff;">int</span>
main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> AC, <span style="color: #0000ff;">char</span> <span style="color: #000040;">**</span>AV<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">FILE</span> <span style="color: #000040;">*</span>fd <span style="color: #000080;">=</span> <span style="color: #0000dd;">fopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;data&quot;</span>, <span style="color: #FF0000;">&quot;w+&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">fprintf</span><span style="color: #008000;">&#40;</span>fd, <span style="color: #FF0000;">&quot;%x%c&quot;</span>, <span style="color: #208080;">0x41</span>, <span style="color: #FF0000;">'1'</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">fseek</span><span style="color: #008000;">&#40;</span>fd, <span style="color: #0000dd;">0</span>, <span style="color: #0000ff;">SEEK_SET</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> n<span style="color: #008080;">;</span>
    <span style="color: #0000dd;">fscanf</span><span style="color: #008000;">&#40;</span>fd, <span style="color: #FF0000;">&quot;%d&quot;</span>, <span style="color: #000040;">&amp;</span>n<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">fseek</span><span style="color: #008000;">&#40;</span>fd, <span style="color: #0000dd;">0</span>, <span style="color: #0000ff;">SEEK_SET</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">char</span> s<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> c <span style="color: #000080;">=</span> <span style="color: #0000dd;">fread</span><span style="color: #008000;">&#40;</span>s, <span style="color: #0000dd;">1</span>, <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>s<span style="color: #008000;">&#41;</span>, fd<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    s<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #FF0000;">'<span style="color: #006699; font-weight: bold;">\0</span>'</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d, %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, n, s<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">fclose</span><span style="color: #008000;">&#40;</span>fd<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2010/10/format-stdio/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>没有malloc的单链表</title>
		<link>http://www.dutor.net/index.php/2010/10/linked-list-without-malloc/</link>
		<comments>http://www.dutor.net/index.php/2010/10/linked-list-without-malloc/#comments</comments>
		<pubDate>Tue, 05 Oct 2010 03:43:43 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=2464</guid>
		<description><![CDATA[　　在StackOverflow上面看到的，分析一下下面的代码，对初学者理解什么是堆，什么是栈，对象是如何拷贝的有所帮助。
<pre lang="c" line="1">
#include <stdio.h>
typedef struct node
{
      int i;
      struct node *next;
}node;
node getnode(int a)
{
      struct node n;
      n.i=a;
      n.next=NULL;
      return n;
}
</pre>]]></description>
			<content:encoded><![CDATA[<p>　　在StackOverflow上面看到的，分析一下下面的代码，对初学者理解什么是堆，什么是栈，对象是如何拷贝的有所帮助。</p>

<div class="wp_codebox"><table><tr id="p246411"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
</pre></td><td class="code" id="p2464code11"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> node
<span style="color: #009900;">&#123;</span>
      <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
      <span style="color: #993333;">struct</span> node <span style="color: #339933;">*</span>next<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>node<span style="color: #339933;">;</span>
node getnode<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> a<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
      <span style="color: #993333;">struct</span> node n<span style="color: #339933;">;</span>
      n.<span style="color: #202020;">i</span><span style="color: #339933;">=</span>a<span style="color: #339933;">;</span>
      n.<span style="color: #202020;">next</span><span style="color: #339933;">=</span>NULL<span style="color: #339933;">;</span>
      <span style="color: #b1b100;">return</span> n<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
     <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
     node newtemp<span style="color: #339933;">,</span>root<span style="color: #339933;">,</span>temp<span style="color: #339933;">;</span>
     scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,&amp;</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     root<span style="color: #339933;">=</span>getnode<span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     temp<span style="color: #339933;">=</span>root<span style="color: #339933;">;</span>
&nbsp;
     <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span>
     <span style="color: #009900;">&#123;</span>
         newtemp<span style="color: #339933;">=</span>getnode<span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
         temp.<span style="color: #202020;">next</span><span style="color: #339933;">=&amp;</span>newtemp<span style="color: #339933;">;</span>
         <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>root.<span style="color: #202020;">next</span><span style="color: #339933;">==</span>NULL<span style="color: #009900;">&#41;</span>
         <span style="color: #009900;">&#123;</span>
            root<span style="color: #339933;">=</span>temp<span style="color: #339933;">;</span>
         <span style="color: #009900;">&#125;</span>
        temp<span style="color: #339933;">=*</span><span style="color: #009900;">&#40;</span>temp.<span style="color: #202020;">next</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #009900;">&#125;</span>
     temp<span style="color: #339933;">=</span>root<span style="color: #339933;">;</span>
&nbsp;
     <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span> temp.<span style="color: #202020;">next</span> <span style="color: #339933;">!=</span> NULL <span style="color: #009900;">&#41;</span>
     <span style="color: #009900;">&#123;</span>
         <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot; %d &quot;</span><span style="color: #339933;">,</span>temp.<span style="color: #202020;">i</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
         temp<span style="color: #339933;">=*</span><span style="color: #009900;">&#40;</span>temp.<span style="color: #202020;">next</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2010/10/linked-list-without-malloc/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>副作用与顺序点</title>
		<link>http://www.dutor.net/index.php/2010/09/side-effect-and-sequence-point/</link>
		<comments>http://www.dutor.net/index.php/2010/09/side-effect-and-sequence-point/#comments</comments>
		<pubDate>Sat, 18 Sep 2010 16:17:47 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[副作用]]></category>
		<category><![CDATA[顺序点]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=2437</guid>
		<description><![CDATA[　　那么，C/C++中，哪些地方是顺序点呢？
<ul>
	<li>每个表达式的结束处；</li>
	<li>函数调用中，在所有参数求值完成后，函数体开始执行前有一个顺序点，而参数间的逗号处则没有顺序点。所以f(++i, ++i)的行为也是未定义的；</li>
	<li>逻辑运算符&#038;&、&#124;&#124;还有条件运算符?:的第一个参数末尾处有一个顺序点；</li>
	<li>逗号表达式中每一个逗号处有一个顺序点。因此x = (++i, ++i)是有确定行为的；</li>
	<li>在每一个完整的变量声明处有一个顺序点，例如int i, j;中逗号和分号处分别有一个顺序点；</li>
	<li>for循环控制条件中的两个分号处各有一个顺序点。</li>
</ul>
　　那么，现在，这个程序有问题吗？
<pre lang="c" line="1">
int
main()
{
    int m = 1, n = 0;
    printf("%d, %d\n", m, n);
    m ^= n ^= m ^= n;
    printf("%d, %d\n", m, n);
    return 0;
}
</pre>]]></description>
			<content:encoded><![CDATA[<p>　　C/C++中有一个叫做<a href="http://en.wikipedia.org/wiki/Sequence_point" target="_blank">顺序点（Sequence Point）</a>的概念，通常我们并没有必要去了解和深究。但如果掌握了顺序点的概念，一些晦涩的表达式（比如某些无聊的面试题目）可能就会变得简单明了了。为了介绍顺序点，就不得不提到副作用（Side Effect）。<br />
　　所谓副作用，是相对于传统表达式而言的。例如，i = j * k没有副作用，而i = ++j * k++或者i = f(j) * g(k)就有副作用。即是说，如果变量在一个表达式的运算中改变了自己的值，则称这个表达式有副作用。而顺序点就是为限定这些副作用产生歧义或者不确定行为所设定的。程序或者表达式中，在任意一个顺序点，它之前的所有副作用都已经完成，它之后的所有副作用都尚未发生；任意两个顺序点之间的副作用的发生顺序都是未定义的。这样说可能并不太清楚，咱们来看一个例子，</p>

<div class="wp_codebox"><table><tr id="p243712"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p2437code12"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span>
main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> n <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> m <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">++</span>n<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">++</span>n<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">++</span>n<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">++</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d, %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> m<span style="color: #339933;">,</span> n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>　　上面代码的输出应该是什么呢？答案是，it depends. 可能因你所使用的编译器的不同（甚至是版本的不同）而产生较大的差异。用标准的话说，这样的行为是未定义的（undefined）。可是，为什么呢？<br />
　　这是因为赋值表达式int m = (++n) + (++n) + (++n) + (++n);没有顺序点，或者说只在表达式结尾的分号处有一个顺序点。因此，各副作用的计算顺序是不确定的。即是说，在计算第一个++n时，不知道其他++n是否已经被计算过（计算了几个）。使用gcc 4.2.4，上面程序输出11, 4，使用vs2008，程序输出16, 4。<br />
　　<br />
　　那么，C/C++中，哪些地方是顺序点呢？</p>
<ul>
<li>每个表达式的结束处；</li>
<li>函数调用中，在所有参数求值完成后，函数体开始执行前有一个顺序点，而参数间的逗号处则没有顺序点。所以f(++i, ++i)的行为也是未定义的；</li>
<li>逻辑运算符&#038;&#038;、||还有条件运算符?:的第一个参数末尾处有一个顺序点；</li>
<li>逗号表达式中每一个逗号处有一个顺序点。因此x = (++i, ++i)是有确定行为的；</li>
<li>在每一个完整的变量声明处有一个顺序点，例如int i, j;中逗号和分号处分别有一个顺序点；</li>
<li>for循环控制条件中的两个分号处各有一个顺序点。</li>
</ul>
<p>　　如果你打算规规矩矩的写你的代码，这些都是可以通过使用括号和临时变量来避免未定义的行为的。总之，要保证，在两个相邻顺序点之间同一个变量不可以被修改两次以上或者同时有读取和修改，否则，就会产生未定义的行为。例如，i = ++i。<br />
　　那么，现在，这个程序有问题吗？</p>

<div class="wp_codebox"><table><tr id="p243713"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p2437code13"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span>
main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> m <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> n <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d, %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> m<span style="color: #339933;">,</span> n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    m <span style="color: #339933;">^=</span> n <span style="color: #339933;">^=</span> m <span style="color: #339933;">^=</span> n<span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d, %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> m<span style="color: #339933;">,</span> n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>除了顺序点，即把m ^= n ^= m ^= n;改做m^=n;n^=m;m^=n;上面程序还可能有其它问题。C++中，如果m和n如果是同一个整数的引用呢？C中，在操作类似数组之类的对象时，也有可能出现m,n指向同一对象的可能性，这时，这个对象就被清零了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2010/09/side-effect-and-sequence-point/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>qsort</title>
		<link>http://www.dutor.net/index.php/2010/07/qsort/</link>
		<comments>http://www.dutor.net/index.php/2010/07/qsort/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 12:57:10 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[qsort]]></category>
		<category><![CDATA[排序]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=2347</guid>
		<description><![CDATA[　　对qsort需要注意几点：
<ul>
	<li>qsort中第一个参数是待排序数组的开始地址，既然是数组，各元素就是同类型、同大小的对象，且数组是<strong>“一维数组”</strong>（即地址是连续的）；</li>
	<li>qsort用以区分对象的依据是第二和第三个参数，分别表示对象个数和每个对象的大小（字节）；</li>
	<li>qsort并不知道每个对象的类型和结构，排序准则由用户在第四个参数（比较函数）中指出，qsort按该比较函数准则的“升序”对数组进行排序；</li>
	<li>标准C不支持运算符重载，各对象的交换（因为这是qsort）靠的是逐字节的拷贝（memcpy?）。</li>
</ul>
　　在上面的两片代码中，待排序的对象一个是字符型指针，一个是char (*)[10]型数组。然后，就没有然后了。]]></description>
			<content:encoded><![CDATA[<p>　　Felix那里看到的，关于用qsort对指针式字符串数组和二维型字符串数组的排序的，觉得值得贴出来。注意下下面两片代码的区别。</p>

<div class="wp_codebox"><table><tr id="p234714"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="code" id="p2347code14"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">const</span> <span style="color: #993333;">int</span> N <span style="color: #339933;">=</span> <span style="color: #0000dd;">4</span><span style="color: #339933;">;</span>
<span style="color: #993333;">char</span> <span style="color: #339933;">*</span>str<span style="color: #009900;">&#91;</span>N<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> <span style="color: #ff0000;">&quot;xyz&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;cdef&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;abcd&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;caaa&quot;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> cmp<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>l<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>r<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>a <span style="color: #339933;">=</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">**</span><span style="color: #009900;">&#41;</span>l<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>b <span style="color: #339933;">=</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">**</span><span style="color: #009900;">&#41;</span>r<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> strcmp<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> b<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #993333;">int</span>
main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>argv<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    qsort<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>str<span style="color: #339933;">,</span> N<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> cmp <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> N<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> str<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>


<div class="wp_codebox"><table><tr id="p234715"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code" id="p2347code15"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">const</span> <span style="color: #993333;">int</span> N <span style="color: #339933;">=</span> <span style="color: #0000dd;">4</span><span style="color: #339933;">;</span>
<span style="color: #993333;">char</span> str<span style="color: #009900;">&#91;</span>N<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> <span style="color: #ff0000;">&quot;xyz&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;cdef&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;abcd&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;caaa&quot;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span>
main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>argv<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    qsort<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>str<span style="color: #339933;">,</span> N<span style="color: #339933;">,</span>
            <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span><span style="color: #0000dd;">10</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#40;</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">void</span><span style="color: #339933;">*,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">void</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>strcmp <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> N<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> str<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>　　对qsort需要注意几点：</p>
<ul>
<li>qsort中第一个参数是待排序数组的开始地址，既然是数组，各元素就是同类型、同大小的对象，且数组是<strong>“一维数组”</strong>（即地址是连续的）；</li>
<li>qsort用以区分对象的依据是第二和第三个参数，分别表示对象个数和每个对象的大小（字节）；</li>
<li>qsort并不知道每个对象的类型和结构，排序准则由用户在第四个参数（比较函数）中指出，qsort按该比较函数准则的“升序”对数组进行排序；</li>
<li>标准C不支持运算符重载，各对象的交换（因为这是qsort）靠的是逐字节的拷贝（memcpy?）。</li>
</ul>
<p>　　在上面的两片代码中，待排序的对象一个是字符型指针，一个是char (*)[10]型数组。然后，就没有然后了。<br />
　　<br />
　　然后，上面代码，gcc编译出错，g++却可以。<br />
　　const int N = 4; char *str[N];可以。<br />
　　const int N = 4; char *str[N] = {&#8220;a&#8221;,&#8221;b&#8221;,&#8221;c&#8221;,&#8221;d&#8221;};却不可，何解？</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2010/07/qsort/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>struct/class关键字何时是必须的？</title>
		<link>http://www.dutor.net/index.php/2010/05/is-struct-class-necessary/</link>
		<comments>http://www.dutor.net/index.php/2010/05/is-struct-class-necessary/#comments</comments>
		<pubDate>Fri, 21 May 2010 13:16:54 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Cpp]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=2288</guid>
		<description><![CDATA[　　在形如struct structName varName;的语句中，struct是必须的吗？这是一个显而易见的语法问题，但却容易被忽略，尤其容易被C+C++的同志们忽略。
　　在标准C中，struct关键字是必须的：
<pre lang="c" line="1">
struct structName {
    int n;
};
//~ typedef struct structName structName;
int
main()
{
    struct structName n;
    return 0;
}
</pre>
若没有前置的struct关键字，上面的代码就不能通过编译。我的gcc会提示"structName" undeclared, parse error before 'n'的错误。为了方便，通常会使用typedef struct structName structName;语句来为struct structName定义类型别名。
　　但是，在C++中，一般情况下，struct/class关键字就不是必须的。但是，在有些情况下struct/class关键字又是必须的，因为这时的名字structName有歧义性。这是因为，C/C++语言允许用户自定义类型和函数同名。]]></description>
			<content:encoded><![CDATA[<p>　　在形如struct structName varName;的语句中，struct是必须的吗？这是一个显而易见的语法问题，但却容易被忽略，尤其容易被C+C++的同志们忽略。<br />
　　在标准C中，struct关键字是必须的：</p>

<div class="wp_codebox"><table><tr id="p228816"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code" id="p2288code16"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> structName <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> n<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//~ typedef struct structName structName;</span>
<span style="color: #993333;">int</span>
main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">struct</span> structName n<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>若没有前置的struct关键字，上面的代码就不能通过编译。我的gcc会提示&#8221;structName&#8221; undeclared, parse error before &#8216;n&#8217;的错误。为了方便，通常会使用typedef struct structName structName;语句来为struct structName定义类型别名。<br />
　　但是，在C++中，一般情况下，struct/class关键字就不是必须的。但是，在有些情况下struct/class关键字又是必须的，因为这时的名字structName有歧义性。这是因为，C/C++语言允许用户自定义类型和函数同名。</p>

<div class="wp_codebox"><table><tr id="p228817"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p2288code17"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> structName <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> n<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> structName<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #993333;">int</span>
main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    structName n<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>上面代码，无论使用gcc还是g++，都不能通过编译，即使structName n;明显只能是一个变量定义语句。这时，就需要明确使用关键字struct，即struct structName n;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2010/05/is-struct-class-necessary/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>char &amp; * &amp; []</title>
		<link>http://www.dutor.net/index.php/2009/11/char-pointer/</link>
		<comments>http://www.dutor.net/index.php/2009/11/char-pointer/#comments</comments>
		<pubDate>Sat, 28 Nov 2009 14:12:45 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1731</guid>
		<description><![CDATA[<pre lang="cpp" line="1">
void fun1(char * str) {}
void fun2(char ** str) {}

//~ int main(int argc, char ** argv)
int main(int argc, char * argv[])
{
	char str1[] = "Hello, Piggy!";
	char str2[][4] = "Hello, Piggy!";
	fun1(str1);
	fun2(str2);
	fun2(&#038;str1);
	return 0;
}
</pre>
　　上面的snippet有错误吗？有几个？你能找出来并说出原因吗？4、5两行有区别吗？想一下，然后看gcc给出的错误信息，]]></description>
			<content:encoded><![CDATA[
<div class="wp_codebox"><table><tr id="p173118"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code" id="p1731code18"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> fun1<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> str<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">void</span> fun2<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">**</span> str<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">//~ int main(int argc, char ** argv)</span>
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> argv<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">char</span> str1<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;Hello, Piggy!&quot;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">char</span> str2<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;Hello, Piggy!&quot;</span><span style="color: #008080;">;</span>
	fun1<span style="color: #008000;">&#40;</span>str1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	fun2<span style="color: #008000;">&#40;</span>str2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	fun2<span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>str1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>　　上面的snippet有错误吗？有几个？你能找出来并说出原因吗？4、5两行有区别吗？想一下，然后看gcc给出的错误信息，</p>
<pre>
test.c: In function ‘main’:
test.c:9: error: invalid initializer
test.c:11: warning: passing argument 1 of ‘fun2’ from incompatible pointer type
test.c:4: note: expected ‘char **’ but argument is of type ‘char (*)[4]’
test.c:12: warning: passing argument 1 of ‘fun2’ from incompatible pointer type
test.c:4: note: expected ‘char **’ but argument is of type ‘char (*)[14]’
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/11/char-pointer/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>关于内联的疑问</title>
		<link>http://www.dutor.net/index.php/2009/11/about-inline/</link>
		<comments>http://www.dutor.net/index.php/2009/11/about-inline/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 23:35:12 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Cpp]]></category>
		<category><![CDATA[内联]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1650</guid>
		<description><![CDATA[　　看<a href="http://chris.dutor.net/2009/11/10/%e6%9c%89%e5%85%b3%e5%86%85%e8%81%94%e5%87%bd%e6%95%b0%e7%9a%84%e4%b8%80%e4%ba%9b%e4%ba%8b/" target="_blank">Chris对内联的总结</a>，说到内联函数在编译时会被放入"符号表"，想一探究竟，结果却发现另外一个问题，疑惑不解。
<pre lang="cpp" line="1">
#include <stdio.h>
inline int add(int a, int b) { return a + b; }
int main()
{
	int n = add(1,2);
	return 0;
}
</pre>]]></description>
			<content:encoded><![CDATA[<p>　　看<a href="http://chris.dutor.net/2009/11/10/%e6%9c%89%e5%85%b3%e5%86%85%e8%81%94%e5%87%bd%e6%95%b0%e7%9a%84%e4%b8%80%e4%ba%9b%e4%ba%8b/" target="_blank">Chris对内联的总结</a>，说到内联函数在编译时会被放入&#8221;符号表&#8221;，想一探究竟，结果却发现另外一个问题，疑惑不解。</p>

<div class="wp_codebox"><table><tr id="p165019"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p1650code19"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;stdio.h&gt;</span>
<span style="color: #0000ff;">inline</span> <span style="color: #0000ff;">int</span> add<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a, <span style="color: #0000ff;">int</span> b<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000ff;">return</span> a <span style="color: #000040;">+</span> b<span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> n <span style="color: #000080;">=</span> add<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>,<span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>


<div class="wp_codebox"><table><tr id="p165020"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1650code20"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">g++</span> <span style="color: #660033;">-otest</span> test.cpp
$ objdump .<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">test</span> <span style="color: #660033;">-d</span></pre></td></tr></table></div>


<div class="wp_codebox"><table><tr id="p165021"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="code" id="p1650code21"><pre class="asm" style="font-family:monospace;"><span style="color: #adadad; font-style: italic;">08048494</span> &lt;main&gt;<span style="color: #339933;">:</span>
 <span style="color: #0000ff;">8048494</span><span style="color: #339933;">:</span>	<span style="color: #0000ff;">55</span>                   	<span style="color: #00007f; font-weight: bold;">push</span>   <span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span>
 <span style="color: #0000ff;">8048495</span><span style="color: #339933;">:</span>	<span style="color: #0000ff;">89</span> e5                	<span style="color: #00007f; font-weight: bold;">mov</span>    <span style="color: #339933;">%</span><span style="color: #00007f;">esp</span><span style="color: #339933;">,%</span><span style="color: #00007f;">ebp</span>
 <span style="color: #0000ff;">8048497</span><span style="color: #339933;">:</span>	<span style="color: #0000ff;">83</span> e4 f0             	<span style="color: #00007f; font-weight: bold;">and</span>    $<span style="color: #0000ff;">0xfffffff0</span><span style="color: #339933;">,%</span><span style="color: #00007f;">esp</span>
 804849a<span style="color: #339933;">:</span>	<span style="color: #0000ff;">83</span> ec <span style="color: #0000ff;">20</span>             	<span style="color: #00007f; font-weight: bold;">sub</span>    $<span style="color: #0000ff;">0x20</span><span style="color: #339933;">,%</span><span style="color: #00007f;">esp</span>
 804849d<span style="color: #339933;">:</span>	c7 <span style="color: #0000ff;">44</span> <span style="color: #0000ff;">24</span> <span style="color: #0000ff;">04</span> <span style="color: #0000ff;">02</span> <span style="color: #0000ff;">00</span> <span style="color: #0000ff;">00</span> 	movl   $<span style="color: #0000ff;">0x2</span><span style="color: #339933;">,</span><span style="color: #0000ff;">0x4</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">esp</span><span style="color: #009900; font-weight: bold;">&#41;</span>
 80484a4<span style="color: #339933;">:</span>	<span style="color: #0000ff;">00</span> 
 80484a5<span style="color: #339933;">:</span>	c7 <span style="color: #0000ff;">04</span> <span style="color: #0000ff;">24</span> <span style="color: #0000ff;">01</span> <span style="color: #0000ff;">00</span> <span style="color: #0000ff;">00</span> <span style="color: #0000ff;">00</span> 	movl   $<span style="color: #0000ff;">0x1</span><span style="color: #339933;">,</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">esp</span><span style="color: #009900; font-weight: bold;">&#41;</span>
 80484ac<span style="color: #339933;">:</span>	e8 <span style="color: #0000ff;">0b</span> <span style="color: #0000ff;">00</span> <span style="color: #0000ff;">00</span> <span style="color: #0000ff;">00</span>       	<span style="color: #00007f; font-weight: bold;">call</span>   80484bc &lt;_Z3addii&gt;
 80484b1<span style="color: #339933;">:</span>	<span style="color: #0000ff;">89</span> <span style="color: #0000ff;">44</span> <span style="color: #0000ff;">24</span> 1c          	<span style="color: #00007f; font-weight: bold;">mov</span>    <span style="color: #339933;">%</span><span style="color: #00007f;">eax</span><span style="color: #339933;">,</span><span style="color: #0000ff;">0x1c</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">esp</span><span style="color: #009900; font-weight: bold;">&#41;</span>
 80484b5<span style="color: #339933;">:</span>	b8 <span style="color: #0000ff;">00</span> <span style="color: #0000ff;">00</span> <span style="color: #0000ff;">00</span> <span style="color: #0000ff;">00</span>       	<span style="color: #00007f; font-weight: bold;">mov</span>    $<span style="color: #0000ff;">0x0</span><span style="color: #339933;">,%</span><span style="color: #00007f;">eax</span>
 80484ba<span style="color: #339933;">:</span>	c9                   	<span style="color: #00007f; font-weight: bold;">leave</span>  
 80484bb<span style="color: #339933;">:</span>	c3                   	<span style="color: #00007f; font-weight: bold;">ret</span>    
&nbsp;
<span style="color: #adadad; font-style: italic;">080484bc</span> &lt;_Z3addii&gt;<span style="color: #339933;">:</span>
 80484bc<span style="color: #339933;">:</span>	<span style="color: #0000ff;">55</span>                   	<span style="color: #00007f; font-weight: bold;">push</span>   <span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span>
 80484bd<span style="color: #339933;">:</span>	<span style="color: #0000ff;">89</span> e5                	<span style="color: #00007f; font-weight: bold;">mov</span>    <span style="color: #339933;">%</span><span style="color: #00007f;">esp</span><span style="color: #339933;">,%</span><span style="color: #00007f;">ebp</span>
 80484bf<span style="color: #339933;">:</span>	8b <span style="color: #0000ff;">45</span> 0c             	<span style="color: #00007f; font-weight: bold;">mov</span>    <span style="color: #0000ff;">0xc</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span><span style="color: #339933;">,%</span><span style="color: #00007f;">eax</span>
 80484c2<span style="color: #339933;">:</span>	8b <span style="color: #0000ff;">55</span> <span style="color: #0000ff;">08</span>             	<span style="color: #00007f; font-weight: bold;">mov</span>    <span style="color: #0000ff;">0x8</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span><span style="color: #339933;">,%</span><span style="color: #00007f;">edx</span>
 80484c5<span style="color: #339933;">:</span>	8d <span style="color: #0000ff;">04</span> <span style="color: #0000ff;">02</span>             	<span style="color: #00007f; font-weight: bold;">lea</span>    <span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">edx</span><span style="color: #339933;">,%</span><span style="color: #00007f;">eax</span><span style="color: #339933;">,</span><span style="color: #0000ff;">1</span><span style="color: #009900; font-weight: bold;">&#41;</span><span style="color: #339933;">,%</span><span style="color: #00007f;">eax</span>
 80484c8<span style="color: #339933;">:</span>	5d                   	<span style="color: #00007f; font-weight: bold;">pop</span>    <span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span>
 80484c9<span style="color: #339933;">:</span>	c3                   	<span style="color: #00007f; font-weight: bold;">ret</span>    
 80484ca<span style="color: #339933;">:</span>	<span style="color: #0000ff;">90</span>                   	<span style="color: #00007f; font-weight: bold;">nop</span>
 80484cb<span style="color: #339933;">:</span>	<span style="color: #0000ff;">90</span>                   	<span style="color: #00007f; font-weight: bold;">nop</span></pre></td></tr></table></div>

<p>　　inline int add(int, int)没有内联，不解。另外，符号表里面也仅仅找到了_Z3addii，我不理解，干嘛把它放进符号表？我想这里的符号表不应该是熟知的那个符号表吧，应该只是编译期的一块用来inline的临时单元。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/11/about-inline/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>一段小程序</title>
		<link>http://www.dutor.net/index.php/2009/11/snippets/</link>
		<comments>http://www.dutor.net/index.php/2009/11/snippets/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 04:40:13 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Cpp]]></category>
		<category><![CDATA[汇编]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1562</guid>
		<description><![CDATA[　　这里面猫腻儿还真不少。

　　karmic到源里面没有以前到vim-full包了，取而代之到是vim包，但现在有很多问题，n"+yy和n"+p无法和系统"剪切板"里到内容关联了，不知道什么原因。

<strong>Update</strong>
　　一切都释然了，只要意识到，>也需要进行类型提升。那么后面到-1啦-2啦之类的，都是很大很大的数了，循环根本就进不去，更别提死循环了。这样看来<strong>四、五</strong>两段程序就没有必要列出来了。其实，我是被它们的汇编代码给迷惑住了。]]></description>
			<content:encoded><![CDATA[<p><strong>一、</strong><br />
源程序，</p>

<div class="wp_codebox"><table><tr id="p156222"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p1562code22"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span>
main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">unsigned</span> a <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> b <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>a <span style="color: #000040;">+</span> b <span style="color: #000080;">&gt;=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">--</span>b<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>汇编后，</p>

<div class="wp_codebox"><table><tr id="p156223"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p1562code23"><pre class="asm" style="font-family:monospace;">	movl	$<span style="color: #0000ff;">1</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000ff;">4</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span>
	movl	$<span style="color: #0000ff;">1</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000ff;">8</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span>
<span style="color: #339933;">.</span>L2<span style="color: #339933;">:</span>
	subl	$<span style="color: #0000ff;">1</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000ff;">8</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span>
	<span style="color: #00007f; font-weight: bold;">jmp</span>	<span style="color: #339933;">.</span>L2</pre></td></tr></table></div>

<p><strong>二、</strong><br />
源程序，</p>

<div class="wp_codebox"><table><tr id="p156224"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p1562code24"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">//...</span>
	<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>a <span style="color: #000040;">+</span> b <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">--</span>b<span style="color: #008080;">;</span>
<span style="color: #666666;">//...</span></pre></td></tr></table></div>

<p>汇编后，</p>

<div class="wp_codebox"><table><tr id="p156225"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p1562code25"><pre class="asm" style="font-family:monospace;">	movl	$<span style="color: #0000ff;">1</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000ff;">4</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span>
	movl	$<span style="color: #0000ff;">1</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000ff;">8</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span>
	<span style="color: #00007f; font-weight: bold;">jmp</span>	<span style="color: #339933;">.</span>L2
<span style="color: #339933;">.</span>L3<span style="color: #339933;">:</span>
	subl	$<span style="color: #0000ff;">1</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000ff;">8</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span>
<span style="color: #339933;">.</span>L2<span style="color: #339933;">:</span>
	movl	<span style="color: #339933;">-</span><span style="color: #0000ff;">8</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #339933;">%</span><span style="color: #00007f;">eax</span>
	addl	<span style="color: #339933;">-</span><span style="color: #0000ff;">4</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #339933;">%</span><span style="color: #00007f;">eax</span>
	testl	<span style="color: #339933;">%</span><span style="color: #00007f;">eax</span><span style="color: #339933;">,</span> <span style="color: #339933;">%</span><span style="color: #00007f;">eax</span>
	<span style="color: #00007f; font-weight: bold;">setne</span>	<span style="color: #339933;">%</span><span style="color: #00007f;">al</span>
	testb	<span style="color: #339933;">%</span><span style="color: #00007f;">al</span><span style="color: #339933;">,</span> <span style="color: #339933;">%</span><span style="color: #00007f;">al</span>
	<span style="color: #00007f; font-weight: bold;">jne</span>	<span style="color: #339933;">.</span>L3</pre></td></tr></table></div>

<p><strong>三、</strong><br />
源程序，</p>

<div class="wp_codebox"><table><tr id="p156226"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p1562code26"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">//...</span>
	<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>a <span style="color: #000040;">+</span> b <span style="color: #000080;">&gt;</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">--</span>b<span style="color: #008080;">;</span>
<span style="color: #666666;">//...</span></pre></td></tr></table></div>

<p>汇编后，</p>

<div class="wp_codebox"><table><tr id="p156227"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p1562code27"><pre class="asm" style="font-family:monospace;">	movl	$<span style="color: #0000ff;">1</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000ff;">4</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span>
	movl	$<span style="color: #0000ff;">1</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000ff;">8</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span>
	<span style="color: #00007f; font-weight: bold;">jmp</span>	<span style="color: #339933;">.</span>L2
<span style="color: #339933;">.</span>L3<span style="color: #339933;">:</span>
	subl	$<span style="color: #0000ff;">1</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000ff;">8</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span>
<span style="color: #339933;">.</span>L2<span style="color: #339933;">:</span>
	movl	<span style="color: #339933;">-</span><span style="color: #0000ff;">8</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #339933;">%</span><span style="color: #00007f;">eax</span>
	addl	<span style="color: #339933;">-</span><span style="color: #0000ff;">4</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #339933;">%</span><span style="color: #00007f;">eax</span>
	cmpl	$<span style="color: #339933;">-</span><span style="color: #0000ff;">1</span><span style="color: #339933;">,</span> <span style="color: #339933;">%</span><span style="color: #00007f;">eax</span>
	<span style="color: #00007f; font-weight: bold;">sete</span>	<span style="color: #339933;">%</span><span style="color: #00007f;">al</span>
	testb	<span style="color: #339933;">%</span><span style="color: #00007f;">al</span><span style="color: #339933;">,</span> <span style="color: #339933;">%</span><span style="color: #00007f;">al</span>
	<span style="color: #00007f; font-weight: bold;">jne</span>	<span style="color: #339933;">.</span>L3</pre></td></tr></table></div>

<p><strong>四、</strong><br />
源程序，</p>

<div class="wp_codebox"><table><tr id="p156228"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p1562code28"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">//...</span>
	<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>a <span style="color: #000040;">+</span> b <span style="color: #000080;">&gt;=</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">--</span>b<span style="color: #008080;">;</span>
<span style="color: #666666;">//...</span></pre></td></tr></table></div>

<p>汇编后，</p>

<div class="wp_codebox"><table><tr id="p156229"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p1562code29"><pre class="asm" style="font-family:monospace;">	movl	$<span style="color: #0000ff;">1</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000ff;">4</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span>
	movl	$<span style="color: #0000ff;">1</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000ff;">8</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span>
	<span style="color: #00007f; font-weight: bold;">jmp</span>	<span style="color: #339933;">.</span>L2
<span style="color: #339933;">.</span>L3<span style="color: #339933;">:</span>
	subl	$<span style="color: #0000ff;">1</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000ff;">8</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span>
<span style="color: #339933;">.</span>L2<span style="color: #339933;">:</span>
	movl	<span style="color: #339933;">-</span><span style="color: #0000ff;">8</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #339933;">%</span><span style="color: #00007f;">eax</span>
	addl	<span style="color: #339933;">-</span><span style="color: #0000ff;">4</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #339933;">%</span><span style="color: #00007f;">eax</span>
	cmpl	$<span style="color: #339933;">-</span><span style="color: #0000ff;">3</span><span style="color: #339933;">,</span> <span style="color: #339933;">%</span><span style="color: #00007f;">eax</span>
	<span style="color: #00007f; font-weight: bold;">seta</span>	<span style="color: #339933;">%</span><span style="color: #00007f;">al</span>
	testb	<span style="color: #339933;">%</span><span style="color: #00007f;">al</span><span style="color: #339933;">,</span> <span style="color: #339933;">%</span><span style="color: #00007f;">al</span>
	<span style="color: #00007f; font-weight: bold;">jne</span>	<span style="color: #339933;">.</span>L3</pre></td></tr></table></div>

<p><strong>五、</strong><br />
源代码，</p>

<div class="wp_codebox"><table><tr id="p156230"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p1562code30"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">//...</span>
	<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>a <span style="color: #000040;">+</span> b <span style="color: #000080;">&gt;=</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">--</span>b<span style="color: #008080;">;</span>
<span style="color: #666666;">//...</span></pre></td></tr></table></div>

<p>汇编后，</p>

<div class="wp_codebox"><table><tr id="p156231"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p1562code31"><pre class="asm" style="font-family:monospace;">	movl	$<span style="color: #0000ff;">1</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000ff;">4</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span>
	movl	$<span style="color: #0000ff;">1</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000ff;">8</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span>
	<span style="color: #00007f; font-weight: bold;">jmp</span>	<span style="color: #339933;">.</span>L2
<span style="color: #339933;">.</span>L3<span style="color: #339933;">:</span>
	subl	$<span style="color: #0000ff;">1</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000ff;">8</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span>
<span style="color: #339933;">.</span>L2<span style="color: #339933;">:</span>
	movl	<span style="color: #339933;">-</span><span style="color: #0000ff;">8</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #339933;">%</span><span style="color: #00007f;">eax</span>
	addl	<span style="color: #339933;">-</span><span style="color: #0000ff;">4</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span><span style="color: #00007f;">ebp</span><span style="color: #009900; font-weight: bold;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #339933;">%</span><span style="color: #00007f;">eax</span>
	testl	<span style="color: #339933;">%</span><span style="color: #00007f;">eax</span><span style="color: #339933;">,</span> <span style="color: #339933;">%</span><span style="color: #00007f;">eax</span>
	<span style="color: #00007f; font-weight: bold;">setne</span>	<span style="color: #339933;">%</span><span style="color: #00007f;">al</span>
	testb	<span style="color: #339933;">%</span><span style="color: #00007f;">al</span><span style="color: #339933;">,</span> <span style="color: #339933;">%</span><span style="color: #00007f;">al</span>
	<span style="color: #00007f; font-weight: bold;">jne</span>	<span style="color: #339933;">.</span>L3</pre></td></tr></table></div>

<p>　　<br />
　　这里面猫腻儿还真不少。</p>
<p>　　karmic到源里面没有以前到vim-full包了，取而代之到是vim包，但现在有很多问题，n&#8221;+yy和n&#8221;+p无法和系统&#8221;剪切板&#8221;里到内容关联了，不知道什么原因。</p>
<p><strong>Update</strong><br />
　　一切都释然了，只要意识到，>也需要进行类型提升。那么后面到-1啦-2啦之类的，都是很大很大的数了，循环根本就进不去，更别提死循环了。这样看来<strong>四、五</strong>两段程序就没有必要列出来了。其实，我是被它们的汇编代码给迷惑住了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/11/snippets/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>线程消息队列</title>
		<link>http://www.dutor.net/index.php/2009/08/thread-queue/</link>
		<comments>http://www.dutor.net/index.php/2009/08/thread-queue/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 10:09:54 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[Unix/Linux]]></category>
		<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[pthread]]></category>
		<category><![CDATA[多线程]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1150</guid>
		<description><![CDATA[<ol>
	<li>减少pthread_cond_signal和sem_post的调用，只在有必要的时候调用；</li>
	<li>尽量避免pthread_mutex进入竞争态。增大消息队列的大小，可以有效减少竞态条件的出现。</li>
</ol>
      /*
       * 此处循环判断的原因如下：假设2个线程在getq阻塞，然后两者都被激活，
       * 而其中一个线程运行比较块，快速消耗了2个数据，
       * 另一个线程醒来的时候已经没有新数据可以消耗了。
       * 另一点，man pthread_cond_wait可以看到，
       * 该函数可以被信号中断返回，此时返回EINTR。
       * 为避免以上任何一点，都必须醒来后再次判断睡眠条件。
       * 更正：pthread_cond_wait是信号安全的系统调用，不会被信号中断。
       */]]></description>
			<content:encoded><![CDATA[<ol>
<li>减少pthread_cond_signal和sem_post的调用，只在有必要的时候调用；</li>
<li>尽量避免pthread_mutex进入竞争态。增大消息队列的大小，可以有效减少竞态条件的出现。</li>
</ol>

<div class="wp_codebox"><table><tr id="p115032"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
</pre></td><td class="code" id="p1150code32"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;pthread.h&gt;</span>
<span style="color: #0000ff;">class</span> CThreadQueue
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    CThreadQueue <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> queueSize <span style="color: #000080;">=</span> <span style="color: #0000dd;">1024</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span>
  sizeQueue <span style="color: #008000;">&#40;</span>queueSize<span style="color: #008000;">&#41;</span>, lput <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>, lget <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>, nFullThread <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>,
      nEmptyThread <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>, nData <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
      pthread_mutex_init <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>mux, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      pthread_cond_init <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>condGet, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      pthread_cond_init <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>condPut, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      buffer <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> <span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span><span style="color: #008000;">&#91;</span>sizeQueue<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
  <span style="color: #0000ff;">virtual</span> ~ CThreadQueue <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
      pthread_mutex_destroy <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>mux<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      pthread_cond_destroy <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>condGet<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      pthread_cond_destroy <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>condPut<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000dd;">delete</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span>buffer<span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
  <span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>getq <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
      <span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>data<span style="color: #008080;">;</span>
      pthread_mutex_lock <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>mux<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #ff0000; font-style: italic;">/*
       * 此处循环判断的原因如下：假设2个线程在getq阻塞，然后两者都被激活，
       * 而其中一个线程运行比较块，快速消耗了2个数据，
       * 另一个线程醒来的时候已经没有新数据可以消耗了。
       * 另一点，man pthread_cond_wait可以看到，
       * 该函数可以被信号中断返回，此时返回EINTR。
       * 为避免以上任何一点，都必须醒来后再次判断睡眠条件。
       * 更正：pthread_cond_wait是信号安全的系统调用，不会被信号中断。
       */</span>
      <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>lget <span style="color: #000080;">==</span> lput <span style="color: #000040;">&amp;&amp;</span> nData <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
        nEmptyThread<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
        pthread_cond_wait <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>condGet, <span style="color: #000040;">&amp;</span>mux<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        nEmptyThread<span style="color: #000040;">--</span><span style="color: #008080;">;</span>
      <span style="color: #008000;">&#125;</span>
&nbsp;
      data <span style="color: #000080;">=</span> buffer<span style="color: #008000;">&#91;</span>lget<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
      nData<span style="color: #000040;">--</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>lget <span style="color: #000080;">==</span> sizeQueue<span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
        lget <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
      <span style="color: #008000;">&#125;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>nFullThread<span style="color: #008000;">&#41;</span>                  <span style="color: #666666;">//必要时才进行signal操作，勿总是signal</span>
      <span style="color: #008000;">&#123;</span>
        pthread_cond_signal <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>condPut<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #008000;">&#125;</span>
      pthread_mutex_unlock <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>mux<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">return</span> data<span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
  <span style="color: #0000ff;">void</span> putq <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>data<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
      pthread_mutex_lock <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>mux<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>lput <span style="color: #000080;">==</span> lget <span style="color: #000040;">&amp;&amp;</span> nData<span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
        nFullThread<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
        pthread_cond_wait <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>condPut, <span style="color: #000040;">&amp;</span>mux<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        nFullThread<span style="color: #000040;">--</span><span style="color: #008080;">;</span>
      <span style="color: #008000;">&#125;</span>
      buffer<span style="color: #008000;">&#91;</span>lput<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> data<span style="color: #008080;">;</span>
      nData<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>lput <span style="color: #000080;">==</span> sizeQueue<span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
        lput <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
      <span style="color: #008000;">&#125;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>nEmptyThread<span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
        pthread_cond_signal <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>condGet<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #008000;">&#125;</span>
      pthread_mutex_unlock <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>mux<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
  pthread_mutex_t mux<span style="color: #008080;">;</span>
  pthread_cond_t condGet<span style="color: #008080;">;</span>
  pthread_cond_t condPut<span style="color: #008080;">;</span>
&nbsp;
  <span style="color: #0000ff;">void</span> <span style="color: #000040;">**</span>buffer<span style="color: #008080;">;</span>                        <span style="color: #666666;">//循环消息队列</span>
  <span style="color: #0000ff;">int</span> sizeQueue<span style="color: #008080;">;</span>                        <span style="color: #666666;">//队列大小</span>
  <span style="color: #0000ff;">int</span> lput<span style="color: #008080;">;</span>                                    <span style="color: #666666;">//location put  放数据的指针偏移</span>
  <span style="color: #0000ff;">int</span> lget<span style="color: #008080;">;</span>                                    <span style="color: #666666;">//location get  取数据的指针偏移</span>
  <span style="color: #0000ff;">int</span> nFullThread<span style="color: #008080;">;</span>                        <span style="color: #666666;">//队列满，阻塞在putq处的线程数</span>
  <span style="color: #0000ff;">int</span> nEmptyThread<span style="color: #008080;">;</span>                        <span style="color: #666666;">//队列空，阻塞在getq处的线程数</span>
  <span style="color: #0000ff;">int</span> nData<span style="color: #008080;">;</span>                              <span style="color: #666666;">//队列中的消息个数，主要用来判断队列空还是满</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">//使用的时候给出稍大的CThreadQueue初始化参数，可以减少进入内核态的操作。</span>
CThreadQueue queue<span style="color: #008080;">;</span>
<span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>
produce <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>arg<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
  pthread_detach <span style="color: #008000;">&#40;</span>pthread_self <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000040;">++</span> <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">100</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
      queue.<span style="color: #007788;">putq</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span> i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>
consume <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>arg<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">int</span> data<span style="color: #008080;">;</span>
  <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
      data <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#40;</span>queue.<span style="color: #007788;">getq</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000dd;">printf</span> <span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;data=%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, data<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span>
main <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  pthread_t pid<span style="color: #008080;">;</span>
  <span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
  <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000040;">++</span> <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span>
      pthread_create <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>pid, <span style="color: #0000dd;">0</span>, produce, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000040;">++</span> <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span>
      pthread_create <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>pid, <span style="color: #0000dd;">0</span>, consume, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  sleep <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">30</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/thread-queue/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>还是delete</title>
		<link>http://www.dutor.net/index.php/2009/08/delete-ag/</link>
		<comments>http://www.dutor.net/index.php/2009/08/delete-ag/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 02:35:10 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[delete]]></category>
		<category><![CDATA[虚拟内存]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1141</guid>
		<description><![CDATA[表明看来似乎合情合理，由于C++的多态特性，允许我们将一个子类地址赋给父类型的指针pb，释放对象时理所当然的对pb进行delete。但，在程序运行时，并没有输出M destructed...，即D::m的析构函数没有被调用，而m的析构函数是需要D::~D()来调用的，所以子类D的析构函数也没有被调用。这是很容易理解的，因为父类的析构函数不是virtual的。由此，我们得出结论，用来继承的父类的析构函数总应该是virtual的，除非你确定它绝对不会被用于多态。关于这一点，《Effective C++》里面已经讲到了。

除了上面的问题，我们还应该关心的是，尽管析构函数没有被调用，那M::i的空间被释放了吗？It's a question！由于析构函数没有被调用，那么释放M::i的任务就完全落在了delete身上的了，那么delete做到了吗？It's a very question！这又回到了<a href="http://www.dutor.net/index.php/2009/08/free-delete/" target="_blank">上一篇日志</a>中所描述的问题上了。我的观点是delete做到了它应该做的事情，它只负责释放当初new申请的空间，即对象<strong>本身</strong>，至于对象里面是否有动态申请的内存，那就不是delete而是对象析构函数自己的工作了。]]></description>
			<content:encoded><![CDATA[<p>以前写过一篇<a href="http://www.dutor.net/index.php/2009/08/free-delete/" target="_blank">关于delete</a>的日志，那里提到的只是一个实验而已，我想正常人不会犯那么弱智的错误吧。但接下来的这个问题就不得不加倍留心了。直接看代码：</p>

<div class="wp_codebox"><table><tr id="p114133"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
</pre></td><td class="code" id="p1141code33"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;pthread.h&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">class</span> M
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
        M<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
        ~M<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;M destructed...&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
        <span style="color: #0000ff;">int</span> i<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">class</span> B
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
        B<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
        <span style="color: #666666;">//! virtual ~B(){}</span>
        ~B<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">class</span> D<span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> B
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
        D<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
        ~D<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
        M m<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span>
main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    B <span style="color: #000040;">*</span> pb <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> D<span style="color: #008080;">;</span>
    <span style="color: #0000dd;">delete</span> pb<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>表明看来似乎合情合理，由于C++的多态特性，允许我们将一个子类地址赋给父类型的指针pb，释放对象时理所当然的对pb进行delete。但，在程序运行时，并没有输出M destructed&#8230;，即D::m的析构函数没有被调用，而m的析构函数是需要D::~D()来调用的，所以子类D的析构函数也没有被调用。这是很容易理解的，因为父类的析构函数不是virtual的。由此，我们得出结论，用来继承的父类的析构函数总应该是virtual的，除非你确定它绝对不会被用于多态。关于这一点，《Effective C++》里面已经讲到了。</p>
<p>除了上面的问题，我们还应该关心的是，尽管析构函数没有被调用，那M::i的空间被释放了吗？It&#8217;s a question！由于析构函数没有被调用，那么释放M::i的任务就完全落在了delete身上的了，那么delete做到了吗？It&#8217;s a very question！这又回到了<a href="http://www.dutor.net/index.php/2009/08/free-delete/" target="_blank">上一篇日志</a>中所描述的问题上了。我的观点是delete做到了它应该做的事情，它只负责释放当初new申请的空间，即对象<strong>本身</strong>，至于对象里面是否有动态申请的内存，那就不是delete而是对象析构函数自己的工作了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/delete-ag/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用streambuf更改fstream的缓冲区</title>
		<link>http://www.dutor.net/index.php/2009/08/mod-stream-bufer/</link>
		<comments>http://www.dutor.net/index.php/2009/08/mod-stream-bufer/#comments</comments>
		<pubDate>Wed, 19 Aug 2009 12:09:54 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[IO]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1127</guid>
		<description><![CDATA[源码之前，了无秘密。
<pre lang="cpp" line="1">
//~ demo.cpp
#include <iostream>
#include <fstream>
#include <string>
#include <streambuf>
using namespace std;
//~ 测试代码 :)
int main()
{
	ifstream in("demo.cpp");
	char buffer[4096]="original content in this buffer";
	cout<<buffer<<endl;
	streambuf * ptrbuff = in.rdbuf(); //~ 将streambuf与文件句柄关联
	ptrbuf->pubsetbuf(bufer, 4096); //~ 设置缓冲区，即设置in的缓冲区
	cout<<buffer<<endl; //~ 此时bufer里面的内容还是original content in this buffer
	string str;
	in>>str; //~ 真正要输入时bufer才被填充为in的内容
	cout<<str<<endl;
	cout<<buffer<<endl;
	return 0;
} 
</pre>
另外，还有一个filebuf，用法相近。看了很多C++方面的书，从来没有那本书对I/O流做过详细的介绍。C里面有setbuf可以修改缓冲区，但我在fstream里面却没看到这么个setbuf，rdbuf倒是有一个，它返回streambuf类型的指针。搜索streambuf的用法，无果，MSDN里面看到streambuf有一个setbuf的成员，甚喜。编译器说，setbuf是私有的，再看MSDN，还有一个pubsetbuf，哟西！]]></description>
			<content:encoded><![CDATA[<p>源码之前，了无秘密。</p>

<div class="wp_codebox"><table><tr id="p112734"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code" id="p1127code34"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">//~ demo.cpp</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;fstream&gt;</span>
<span style="color: #339900;">#include &lt;string&gt;</span>
<span style="color: #339900;">#include &lt;streambuf&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #666666;">//~ 测试代码 :)</span>
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	ifstream in<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;demo.cpp&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">char</span> buffer<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4096</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;original content in this buffer&quot;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>buffer<span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	streambuf <span style="color: #000040;">*</span> ptrbuff <span style="color: #000080;">=</span> in.<span style="color: #007788;">rdbuf</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 将streambuf与文件句柄关联</span>
	ptrbuf<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>pubsetbuf<span style="color: #008000;">&#40;</span>bufer, <span style="color: #0000dd;">4096</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 设置缓冲区，即设置in的缓冲区</span>
	<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>buffer<span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span> <span style="color: #666666;">//~ 此时bufer里面的内容还是original content in this buffer</span>
	string str<span style="color: #008080;">;</span>
	in<span style="color: #000080;">&gt;&gt;</span>str<span style="color: #008080;">;</span> <span style="color: #666666;">//~ 真正要输入时bufer才被填充为in的内容</span>
	<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>str<span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>buffer<span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>另外，还有一个filebuf，用法相近。看了很多C++方面的书，从来没有那本书对I/O流做过详细的介绍。C里面有setbuf可以修改缓冲区，但我在fstream里面却没看到这么个setbuf，rdbuf倒是有一个，它返回streambuf类型的指针。搜索streambuf的用法，无果，MSDN里面看到streambuf有一个setbuf的成员，甚喜。编译器说，setbuf是私有的，再看MSDN，还有一个pubsetbuf，哟西！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/mod-stream-bufer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>再来个队列模板类~</title>
		<link>http://www.dutor.net/index.php/2009/08/queue-template/</link>
		<comments>http://www.dutor.net/index.php/2009/08/queue-template/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 14:40:17 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[模板]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1100</guid>
		<description><![CDATA[<pre lang="cpp" line="1">
template <class T>
class Queue
{
public:
	Queue(int size = 30);
	~Queue();
	void EnQueue(T value);
	T DeQueue();
	T GetFirst();
	bool IsEmpty();
	bool IsFull();
	void ClearQueue();
private:
	T *queue;
	int front;
	int rare;
	int MaxSize;
	int CurLen;
};
</pre>]]></description>
			<content:encoded><![CDATA[<p>Queue.h:</p>

<div class="wp_codebox"><table><tr id="p110035"><td class="code" id="p1100code35"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> 
<span style="color: #0000ff;">class</span> Queue
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
	Queue<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> size <span style="color: #000080;">=</span> <span style="color: #0000dd;">30</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	~Queue<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">void</span> EnQueue<span style="color: #008000;">&#40;</span>T value<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	T DeQueue<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	T GetFirst<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">bool</span> IsEmpty<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">bool</span> IsFull<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">void</span> ClearQueue<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
	T <span style="color: #000040;">*</span>queue<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> front<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> rare<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> MaxSize<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> CurLen<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">template</span> 
Queue<span style="color: #008080;">::</span><span style="color: #007788;">Queue</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> size <span style="color: #000080;">=</span> <span style="color: #0000dd;">30</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	queue <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> T<span style="color: #008000;">&#91;</span>size<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	front <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	rare <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	CurLen <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	MaxSize <span style="color: #000080;">=</span>size<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">template</span> 
Queue<span style="color: #008080;">::</span>~Queue<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">delete</span> queue<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">template</span>
<span style="color: #0000ff;">void</span> Queue<span style="color: #008080;">::</span><span style="color: #007788;">EnQueue</span><span style="color: #008000;">&#40;</span>T value<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	queue<span style="color: #008000;">&#91;</span>rare<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> value<span style="color: #008080;">;</span>
	rare <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>rare <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">%</span>MaxSize<span style="color: #008080;">;</span>
	CurLen<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">template</span>
T Queue<span style="color: #008080;">::</span><span style="color: #007788;">DeQueue</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	T value<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>IsEmpty<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span><span style="color: #000040;">&amp;</span>lt<span style="color: #008080;">;</span><span style="color: #000040;">&amp;</span>lt<span style="color: #008080;">;</span><span style="color: #FF0000;">&quot;Empty When Dequeue&quot;</span><span style="color: #000040;">&amp;</span>lt<span style="color: #008080;">;</span>
T Queue<span style="color: #008080;">::</span><span style="color: #007788;">GetFirst</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	T value<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>IsEmpty<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span><span style="color: #000040;">&amp;</span>lt<span style="color: #008080;">;</span><span style="color: #000040;">&amp;</span>lt<span style="color: #008080;">;</span><span style="color: #FF0000;">&quot;Empty When GetFirst!&quot;</span><span style="color: #000040;">&amp;</span>lt<span style="color: #008080;">;</span>
<span style="color: #0000ff;">bool</span> Queue<span style="color: #008080;">::</span><span style="color: #007788;">IsEmpty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span>front<span style="color: #000080;">==</span>rare<span style="color: #000040;">&amp;</span>amp<span style="color: #008080;">;</span><span style="color: #000040;">&amp;</span>amp<span style="color: #008080;">;</span>CurLen<span style="color: #000080;">==</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">?</span><span style="color: #0000ff;">true</span><span style="color: #008080;">:</span><span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">template</span>
<span style="color: #0000ff;">bool</span> Queue<span style="color: #008080;">::</span><span style="color: #007788;">IsFull</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span>front<span style="color: #000080;">==</span>rare<span style="color: #000040;">&amp;</span>amp<span style="color: #008080;">;</span><span style="color: #000040;">&amp;</span>amp<span style="color: #008080;">;</span>CurLen<span style="color: #000080;">==</span>MaxSize<span style="color: #008000;">&#41;</span><span style="color: #008080;">?</span><span style="color: #0000ff;">true</span><span style="color: #008080;">:</span><span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">template</span>
<span style="color: #0000ff;">void</span> Queue<span style="color: #008080;">::</span><span style="color: #007788;">ClearQueue</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	front <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	rare <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	CurLen <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/queue-template/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一个堆栈类模板，一个表达式计算器</title>
		<link>http://www.dutor.net/index.php/2009/08/stack-and-calculater/</link>
		<comments>http://www.dutor.net/index.php/2009/08/stack-and-calculater/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 07:59:58 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[模板]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1090</guid>
		<description><![CDATA[一个堆栈类模板，和用到此模板的一个表达式计算器。
输入四则运算表达式（可含括号），输出计算结果，暂未提供盛放运算和浮点数功能。
<pre lang="cpp" line="1">class Stack   
{   
public:   
	Stack(int stack_size = 30);   
	~Stack();   
	void Push(T value);   
	T Pop();   
	T Top();   
	bool IsEmpty();   
	bool IsFull();   
	void ClearStack();   
private:   
	int top;   
	T* stack;   
	int size;   
};</pre> 
]]></description>
			<content:encoded><![CDATA[<p>一个堆栈类模板，和用到此模板的一个表达式计算器。<br />
输入四则运算表达式（可含括号），输出计算结果，暂未提供盛放运算和浮点数功能。</p>
<p>Stack.h:</p>

<div class="wp_codebox"><table><tr id="p109036"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
</pre></td><td class="code" id="p1090code36"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>   
&nbsp;
<span style="color: #0000ff;">class</span> Stack   
<span style="color: #008000;">&#123;</span>   
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>   
	Stack<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> stack_size <span style="color: #000080;">=</span> <span style="color: #0000dd;">30</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
	~Stack<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
	<span style="color: #0000ff;">void</span> Push<span style="color: #008000;">&#40;</span>T value<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
	T Pop<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
	T Top<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
	<span style="color: #0000ff;">bool</span> IsEmpty<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
	<span style="color: #0000ff;">bool</span> IsFull<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
	<span style="color: #0000ff;">void</span> ClearStack<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>   
	<span style="color: #0000ff;">int</span> top<span style="color: #008080;">;</span>   
	T<span style="color: #000040;">*</span> stack<span style="color: #008080;">;</span>   
	<span style="color: #0000ff;">int</span> size<span style="color: #008080;">;</span>   
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>   
<span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>   
Stack<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">Stack</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> stack_size<span style="color: #008000;">&#41;</span>   
<span style="color: #008000;">&#123;</span>   
	size <span style="color: #000080;">=</span> stack_size<span style="color: #008080;">;</span>   
	Stack<span style="color: #008080;">::</span><span style="color: #007788;">stack</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> T<span style="color: #008000;">&#91;</span>size<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>   
	Stack<span style="color: #008080;">::</span><span style="color: #007788;">top</span> <span style="color: #000080;">=</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>   
<span style="color: #008000;">&#125;</span>   
&nbsp;
<span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>   
Stack<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span>~Stack<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>   
<span style="color: #008000;">&#123;</span>   
	<span style="color: #0000dd;">delete</span> <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span>stack<span style="color: #008080;">;</span>   
<span style="color: #008000;">&#125;</span>   
&nbsp;
<span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>   
<span style="color: #0000ff;">void</span> Stack<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">Push</span><span style="color: #008000;">&#40;</span>T value<span style="color: #008000;">&#41;</span>   
<span style="color: #008000;">&#123;</span>   
	stack<span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>top<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> value<span style="color: #008080;">;</span>   
<span style="color: #008000;">&#125;</span>   
&nbsp;
<span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>   
T Stack<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">Pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>   
<span style="color: #008000;">&#123;</span>   
	<span style="color: #0000ff;">return</span> stack<span style="color: #008000;">&#91;</span>top<span style="color: #000040;">--</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>   
<span style="color: #008000;">&#125;</span>   
&nbsp;
<span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>   
T Stack<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">Top</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>   
<span style="color: #008000;">&#123;</span>   
	<span style="color: #0000ff;">return</span> Stack<span style="color: #008000;">&#91;</span>top<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>   
<span style="color: #008000;">&#125;</span>   
&nbsp;
<span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>   
<span style="color: #0000ff;">bool</span> Stack<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">IsEmpty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>   
<span style="color: #008000;">&#123;</span>   
	<span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>top<span style="color: #000080;">==</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">?</span><span style="color: #0000ff;">true</span><span style="color: #008080;">:</span><span style="color: #0000ff;">false</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
<span style="color: #008000;">&#125;</span>   
&nbsp;
<span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>   
<span style="color: #0000ff;">bool</span> Stack<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">IsFull</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>   
<span style="color: #008000;">&#123;</span>   
	<span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>top<span style="color: #000080;">==</span><span style="color: #008000;">&#40;</span>size<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">?</span><span style="color: #0000ff;">true</span><span style="color: #008080;">:</span><span style="color: #0000ff;">false</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
<span style="color: #008000;">&#125;</span>   
&nbsp;
<span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>   
<span style="color: #0000ff;">void</span> Stack<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">ClearStack</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>   
<span style="color: #008000;">&#123;</span>   
	top <span style="color: #000080;">=</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>   
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p> <br />
Calculater.h:</p>

<div class="wp_codebox"><table><tr id="p109037"><td class="code" id="p1090code37"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;string&gt;</span>
<span style="color: #339900;">#include &lt;sstream&gt;</span>
<span style="color: #339900;">#include &lt;vector&gt;</span>
<span style="color: #339900;">#include &quot;Stack.h&quot;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">class</span> Calculate
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
	Calculate<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	~Calculate<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> Cal<span style="color: #008000;">&#40;</span>string express<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
	string ParseString<span style="color: #008000;">&#40;</span>string express<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	vector<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span> MidToBehind<span style="color: #008000;">&#40;</span>string express<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> Compute<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a,<span style="color: #0000ff;">int</span> b,<span style="color: #0000ff;">char</span> operater<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	Stack<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> stack_int<span style="color: #008080;">;</span>
	Stack<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">char</span><span style="color: #000080;">&gt;</span> stack_char<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>Calculater.cpp:</p>

<div class="wp_codebox"><table><tr id="p109038"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
</pre></td><td class="code" id="p1090code38"><pre class="cpp" style="font-family:monospace;">Calculate<span style="color: #008080;">::</span><span style="color: #007788;">Calculate</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
&nbsp;
<span style="color: #008000;">&#125;</span>
&nbsp;
Calculate<span style="color: #008080;">::</span>~Calculate<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
&nbsp;
<span style="color: #008000;">&#125;</span>
&nbsp;
vector<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span> Calculate<span style="color: #008080;">::</span><span style="color: #007788;">MidToBehind</span><span style="color: #008000;">&#40;</span>string express<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	stringstream strstrm<span style="color: #008000;">&#40;</span>express<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">char</span> temp_char<span style="color: #008080;">;</span>
	string temp_str<span style="color: #008080;">;</span>
	vector<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span> result_vec<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>strstrm<span style="color: #000080;">&gt;&gt;</span>temp_char<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>temp_char<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #FF0000;">'('</span><span style="color: #000040;">&amp;&amp;</span>temp_char<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #FF0000;">')'</span><span style="color: #000040;">&amp;&amp;</span>temp_char<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #FF0000;">'+'</span><span style="color: #000040;">&amp;&amp;</span>temp_char<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #FF0000;">'-'</span><span style="color: #000040;">&amp;&amp;</span>temp_char<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #FF0000;">'*'</span><span style="color: #000040;">&amp;&amp;</span>temp_char<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #FF0000;">'/'</span><span style="color: #000040;">&amp;&amp;</span>temp_char<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #FF0000;">'='</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			strstrm.<span style="color: #007788;">putback</span><span style="color: #008000;">&#40;</span>temp_char<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			strstrm<span style="color: #000080;">&gt;&gt;</span>temp_str<span style="color: #008080;">;</span>
			result_vec.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>temp_str<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>temp_char <span style="color: #000080;">==</span> <span style="color: #FF0000;">'('</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			stack_char.<span style="color: #007788;">Push</span><span style="color: #008000;">&#40;</span>temp_char<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>temp_char <span style="color: #000080;">==</span> <span style="color: #FF0000;">')'</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>stack_char.<span style="color: #007788;">IsEmpty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;stack is empty when push ')'&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
				stack_char.<span style="color: #007788;">ClearStack</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
			<span style="color: #0000ff;">else</span>
			<span style="color: #008000;">&#123;</span>
				<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>temp_char <span style="color: #000080;">=</span> stack_char.<span style="color: #007788;">Pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>,temp_char <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #FF0000;">'('</span><span style="color: #008000;">&#41;</span>
				<span style="color: #008000;">&#123;</span>
					result_vec.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>string<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>,temp_char<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>stack_char.<span style="color: #007788;">IsEmpty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
					<span style="color: #008000;">&#123;</span>
						<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;stack is empty when pop,not found the '('&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
						stack_char.<span style="color: #007788;">ClearStack</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
					<span style="color: #008000;">&#125;</span>
				<span style="color: #008000;">&#125;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>temp_char <span style="color: #000080;">==</span> <span style="color: #FF0000;">'+'</span><span style="color: #000040;">||</span>temp_char <span style="color: #000080;">==</span> <span style="color: #FF0000;">'-'</span><span style="color: #000040;">||</span>temp_char <span style="color: #000080;">==</span> <span style="color: #FF0000;">'*'</span><span style="color: #000040;">||</span>temp_char <span style="color: #000080;">==</span> <span style="color: #FF0000;">'/'</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">switch</span> <span style="color: #008000;">&#40;</span>temp_char<span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				<span style="color: #0000ff;">char</span> temp_char_2<span style="color: #008080;">;</span>
			<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'+'</span><span style="color: #008080;">:</span>
				<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>stack_char.<span style="color: #007788;">IsEmpty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
				<span style="color: #008000;">&#123;</span>
					temp_char_2 <span style="color: #000080;">=</span> stack_char.<span style="color: #007788;">Pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>temp_char_2 <span style="color: #000080;">==</span> <span style="color: #FF0000;">'('</span><span style="color: #008000;">&#41;</span>
					<span style="color: #008000;">&#123;</span>
						stack_char.<span style="color: #007788;">Push</span><span style="color: #008000;">&#40;</span>temp_char_2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
						<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
					<span style="color: #008000;">&#125;</span>
					<span style="color: #0000ff;">else</span>
						result_vec.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>string<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>,temp_char_2<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #008000;">&#125;</span>
				stack_char.<span style="color: #007788;">Push</span><span style="color: #008000;">&#40;</span>temp_char<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'-'</span><span style="color: #008080;">:</span>
				<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>stack_char.<span style="color: #007788;">IsEmpty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
				<span style="color: #008000;">&#123;</span>
					temp_char_2 <span style="color: #000080;">=</span> stack_char.<span style="color: #007788;">Pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>temp_char_2 <span style="color: #000080;">==</span> <span style="color: #FF0000;">'('</span><span style="color: #008000;">&#41;</span>
					<span style="color: #008000;">&#123;</span>
						stack_char.<span style="color: #007788;">Push</span><span style="color: #008000;">&#40;</span>temp_char_2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
						<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
					<span style="color: #008000;">&#125;</span>
					<span style="color: #0000ff;">else</span>
						result_vec.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>string<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>,temp_char_2<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #008000;">&#125;</span>
				stack_char.<span style="color: #007788;">Push</span><span style="color: #008000;">&#40;</span>temp_char<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'*'</span><span style="color: #008080;">:</span>
				<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>stack_char.<span style="color: #007788;">IsEmpty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
				<span style="color: #008000;">&#123;</span>
					temp_char_2 <span style="color: #000080;">=</span> stack_char.<span style="color: #007788;">Pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>temp_char_2 <span style="color: #000080;">==</span> <span style="color: #FF0000;">'('</span><span style="color: #000040;">||</span>temp_char_2 <span style="color: #000080;">==</span> <span style="color: #FF0000;">'+'</span><span style="color: #000040;">||</span>temp_char_2 <span style="color: #000080;">==</span> <span style="color: #FF0000;">'-'</span><span style="color: #008000;">&#41;</span>
					<span style="color: #008000;">&#123;</span>
						stack_char.<span style="color: #007788;">Push</span><span style="color: #008000;">&#40;</span>temp_char_2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
						<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
					<span style="color: #008000;">&#125;</span>
					<span style="color: #0000ff;">else</span>
						result_vec.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>string<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>,temp_char_2<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #008000;">&#125;</span>
				stack_char.<span style="color: #007788;">Push</span><span style="color: #008000;">&#40;</span>temp_char<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'/'</span><span style="color: #008080;">:</span>
				<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>stack_char.<span style="color: #007788;">IsEmpty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
				<span style="color: #008000;">&#123;</span>
					temp_char_2 <span style="color: #000080;">=</span> stack_char.<span style="color: #007788;">Pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>temp_char_2 <span style="color: #000080;">==</span> <span style="color: #FF0000;">'('</span><span style="color: #000040;">||</span>temp_char_2 <span style="color: #000080;">==</span> <span style="color: #FF0000;">'+'</span><span style="color: #000040;">||</span>temp_char_2 <span style="color: #000080;">==</span> <span style="color: #FF0000;">'-'</span><span style="color: #008000;">&#41;</span>
					<span style="color: #008000;">&#123;</span>
						stack_char.<span style="color: #007788;">Push</span><span style="color: #008000;">&#40;</span>temp_char_2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
						<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
					<span style="color: #008000;">&#125;</span>
					<span style="color: #0000ff;">else</span>
						result_vec.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>string<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>,temp_char_2<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #008000;">&#125;</span>
				stack_char.<span style="color: #007788;">Push</span><span style="color: #008000;">&#40;</span>temp_char<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">default</span><span style="color: #008080;">:</span>
				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>temp_char <span style="color: #000080;">==</span> <span style="color: #FF0000;">'='</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>stack_char.<span style="color: #007788;">IsEmpty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				result_vec.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>string<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>,stack_char.<span style="color: #007788;">Pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">else</span>
			<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;wrong express&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> result_vec<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> Calculate<span style="color: #008080;">::</span><span style="color: #007788;">Compute</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a,<span style="color: #0000ff;">int</span> b,<span style="color: #0000ff;">char</span> operater<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">switch</span><span style="color: #008000;">&#40;</span>operater<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'+'</span><span style="color: #008080;">:</span>
		<span style="color: #0000ff;">return</span> a <span style="color: #000040;">+</span> b<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'-'</span><span style="color: #008080;">:</span>
		<span style="color: #0000ff;">return</span> a <span style="color: #000040;">-</span> b<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'*'</span><span style="color: #008080;">:</span>
		<span style="color: #0000ff;">return</span> a <span style="color: #000040;">*</span> b<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'/'</span><span style="color: #008080;">:</span>
		<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>b <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;divided by 0!wrong!&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
			<span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">else</span>
			<span style="color: #0000ff;">return</span> a <span style="color: #000040;">/</span> b<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">default</span><span style="color: #008080;">:</span>
		<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;Not return&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> Calculate<span style="color: #008080;">::</span><span style="color: #007788;">Cal</span><span style="color: #008000;">&#40;</span>string express<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	string new_exp <span style="color: #000080;">=</span> ParseString<span style="color: #008000;">&#40;</span>express<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	string str_temp<span style="color: #008080;">;</span>
	vector<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span> vec_exp <span style="color: #000080;">=</span> MidToBehind<span style="color: #008000;">&#40;</span>new_exp<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>vector<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">iterator</span> it <span style="color: #000080;">=</span> vec_exp.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>it <span style="color: #000040;">!</span><span style="color: #000080;">=</span> vec_exp.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>it<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		str_temp <span style="color: #000080;">=</span> <span style="color: #000040;">*</span>it<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>str_temp<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;+&quot;</span><span style="color: #000040;">&amp;&amp;</span>str_temp<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;-&quot;</span><span style="color: #000040;">&amp;&amp;</span>str_temp<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;*&quot;</span><span style="color: #000040;">&amp;&amp;</span>str_temp<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;/&quot;</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">int</span> int_temp <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">int</span> <span style="color: #0000dd;">time</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>string<span style="color: #008080;">::</span><span style="color: #007788;">iterator</span> itr <span style="color: #000080;">=</span> str_temp.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>itr <span style="color: #000040;">!</span><span style="color: #000080;">=</span> str_temp.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>itr<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				int_temp <span style="color: #000080;">=</span> int_temp<span style="color: #000040;">*</span><span style="color: #0000dd;">10</span> <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>itr <span style="color: #000040;">-</span> <span style="color: #FF0000;">'0'</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
			stack_int.<span style="color: #007788;">Push</span><span style="color: #008000;">&#40;</span>int_temp<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span> 
		<span style="color: #0000ff;">else</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">int</span> a,b<span style="color: #008080;">;</span>
			b <span style="color: #000080;">=</span> stack_int.<span style="color: #007788;">Pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			a <span style="color: #000080;">=</span> stack_int.<span style="color: #007788;">Pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">char</span> ch <span style="color: #000080;">=</span> str_temp<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">int</span> c <span style="color: #000080;">=</span> Compute<span style="color: #008000;">&#40;</span>a,b,ch<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			stack_int.<span style="color: #007788;">Push</span><span style="color: #008000;">&#40;</span>c<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> stack_int.<span style="color: #007788;">Pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
string Calculate<span style="color: #008080;">::</span><span style="color: #007788;">ParseString</span><span style="color: #008000;">&#40;</span>string express<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	string new_exp<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">bool</span> flag <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>string<span style="color: #008080;">::</span><span style="color: #007788;">iterator</span> it <span style="color: #000080;">=</span> express.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>it <span style="color: #000040;">!</span><span style="color: #000080;">=</span> express.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>it<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>it<span style="color: #000080;">&gt;=</span><span style="color: #FF0000;">'0'</span><span style="color: #000040;">&amp;&amp;</span><span style="color: #000040;">*</span>it<span style="color: #000080;">&lt;=</span><span style="color: #FF0000;">'9'</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>flag<span style="color: #008000;">&#41;</span>
				new_exp.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">' '</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			flag <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
			new_exp.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>it<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">else</span>
		<span style="color: #008000;">&#123;</span>
			flag <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>it <span style="color: #000040;">!</span><span style="color: #000080;">=</span> express.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
				new_exp.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">' '</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			new_exp.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>it<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> new_exp<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/stack-and-calculater/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>关于free和delete</title>
		<link>http://www.dutor.net/index.php/2009/08/free-delete/</link>
		<comments>http://www.dutor.net/index.php/2009/08/free-delete/#comments</comments>
		<pubDate>Sat, 15 Aug 2009 12:01:44 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[虚拟内存]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1081</guid>
		<description><![CDATA[这里的内存会被正确释放吗？答案要分两方面来讨论。*pd对象本身的内存(4Byte)会不会被释放，就像上例中所说，我还是不知道。但(*pd)::pi所指向的内存肯定是打了水漂啦！因为delete看到的只是一个char*类型的pd，只会简单做一些处理(待高人讲解)，而不会调用析构函数demo::~demo()。甚至有时候它会调用其他类的析构函数：
<pre lang="cpp" line="1">
#include <iostream>
using namespace std;
class demo
{
    public:
        //~ 此处省略代码数行……
        ~demo()
        {
             delete [] pi;
        }
    private:
        int * pi;
};

class foo
{
public:
    ~foo(){cout<<"foo's collapsing..."<<endl;
};
int
main()
{
    demo * pd = new demo;
    delete (foo*)pd;
    return 0;
}
</pre>
foo童鞋真是可怜，让我们来了个借尸还魂，Orz，借刀杀人才对！]]></description>
			<content:encoded><![CDATA[<p>本篇日志，纯属娱乐，没有太大实用价值，在百度上面看到，借题发挥而已……</p>

<div class="wp_codebox"><table><tr id="p108139"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p1081code39"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;stdio.h&gt;</span>
<span style="color: #0000ff;">int</span>
main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">int</span><span style="color: #000040;">*</span> pi <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span><span style="color: #0000dd;">malloc</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">free</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span><span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>pi<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>这段程序的内存能完全释放吗？答案是能。<br />
看free函数的原型：void free(void*); 可知，无论你传给它什么类型的指针，它内部都是按照没有类型的void*来处理的。堆管理器会帮程序处理这一切，它记录了你先前申请的这块内存的大小，它看到的只是一块内存，没有任何类型之类的东西。</p>
<p>再看下面这段代码：</p>

<div class="wp_codebox"><table><tr id="p108140"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p1081code40"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span>
main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">int</span><span style="color: #000040;">*</span> pi <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> <span style="color: #0000ff;">int</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">delete</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span><span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span> pi<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>这里的内存被正确释放了吗？答案我也不知道……还请看到的高手解答^_^:-)<br />
接着看，</p>

<div class="wp_codebox"><table><tr id="p108141"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code" id="p1081code41"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">class</span> demo
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
        <span style="color: #666666;">//~ 此处省略代码数行……</span>
        ~demo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
             <span style="color: #0000dd;">delete</span> <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> pi<span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
        <span style="color: #0000ff;">int</span> <span style="color: #000040;">*</span> pi<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span>
main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    demo <span style="color: #000040;">*</span> pd <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> demo<span style="color: #008080;">;</span>
    <span style="color: #0000dd;">delete</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span><span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>pd<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>这里的内存会被正确释放吗？答案要分两方面来讨论。*pd对象本身的内存(4Byte)会不会被释放，就像上例中所说，我还是不知道。但(*pd)::pi所指向的内存肯定是打了水漂啦！因为delete看到的只是一个char*类型的pd，只会简单做一些处理(待高人讲解)，而不会调用析构函数demo::~demo()。甚至有时候它还可能调用其他类的析构函数：</p>

<div class="wp_codebox"><table><tr id="p108142"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="code" id="p1081code42"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">class</span> demo
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
        <span style="color: #666666;">//~ 此处省略代码数行……</span>
        ~demo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
             <span style="color: #0000dd;">delete</span> <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> pi<span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
        <span style="color: #0000ff;">int</span> <span style="color: #000040;">*</span> pi<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">class</span> foo
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    ~foo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;foo's collapsing...&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span>
main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    demo <span style="color: #000040;">*</span> pd <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> demo<span style="color: #008080;">;</span>
    <span style="color: #0000dd;">delete</span> <span style="color: #008000;">&#40;</span>foo<span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>pd<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>foo童鞋真是可怜，让我们来了个借尸还魂，Orz，是借刀杀人才对！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/free-delete/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>模板显式实例化的问题</title>
		<link>http://www.dutor.net/index.php/2009/08/template-explicit-initiate/</link>
		<comments>http://www.dutor.net/index.php/2009/08/template-explicit-initiate/#comments</comments>
		<pubDate>Fri, 14 Aug 2009 12:16:20 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[模板]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1077</guid>
		<description><![CDATA[<pre lang="cpp" line="1">
template <class T>
T Min(T x, T y)
{
	return x < y ? x : y;
}

int main()
{
	unsigned ui = 0;
	int a = Min(ui, 1);
	return 0;
}
</pre>
这几行代码又有哪些错误呢?cl.exe提示说，error C2782: 'T Min(T,T)' : template parameter 'T' is ambiguous。在参数类型的确定上产生了不确定性，这是为什么呢？好吧，1会被解释成是int型的，但是我们平时不是经常把int直接传给unsigned类型的参数吗？可惜的是，此时的Min还不是一个函数，它只是一个模板而已，实例化之前尚不能完成参数的隐式转化(其实，我认为这只是编译器支持与否的问题)。同样，可以用显式特例化的方法来解决：
int a = Min<int>(ui, 1); 或者 int a = Min<unsigned>(ui, 1);
当然，还可以强制类型转换：
int a = Min(ui, (unsigned)1); 或者 int a = Min(<int>ui, 1);]]></description>
			<content:encoded><![CDATA[
<div class="wp_codebox"><table><tr id="p107743"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code" id="p1077code43"><pre class="cpp" style="font-family:monospace;">&nbsp;
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T, <span style="color: #0000ff;">class</span> IT<span style="color: #000080;">&gt;</span>
T Max<span style="color: #008000;">&#40;</span>IT beg, IT end<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">//~ 且不管这个函数是怎么实现的</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> ivec<span style="color: #008080;">;</span>
	<span style="color: #666666;">//~ ... push_back some elements into the vector</span>
	<span style="color: #0000ff;">int</span> a <span style="color: #000080;">=</span> Max<span style="color: #008000;">&#40;</span>ivec.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, ivec.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 编译器在这里报错</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>编译器会提示： &#8216;T Max(IT,IT)&#8217; : could not deduce template argument for &#8216;T&#8217;。意思就是无法&#8221;推演&#8221;出模板参数T的具体类型，以至于无法实例化模板函数Max。解决方法就是显式特例化模板参数：<br />
int a = Max<int, vector<int>::iterator>(ivec.begin(), ivec.end());<br />
由于编译器可以通过具体的实参类型来实例化模板参数IT，所以可以省略对其的显式的实例化：<br />
int a = Max<int>(ivec.begin(), ivec.end());<br />
当有多个模板参数时只能省略参数列表后面的几个，这一点和普通函数的默认实参的规则是类似的。</p>
<p>另外一个例子，来自《C++ Primer》，</p>

<div class="wp_codebox"><table><tr id="p107744"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p1077code44"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
T Min<span style="color: #008000;">&#40;</span>T x, T y<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">return</span> x <span style="color: #000080;">&lt;</span> y <span style="color: #008080;">?</span> x <span style="color: #008080;">:</span> y<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">unsigned</span> ui <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> a <span style="color: #000080;">=</span> Min<span style="color: #008000;">&#40;</span>ui, <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>这几行代码又有哪些错误呢?cl.exe提示说，error C2782: &#8216;T Min(T,T)&#8217; : template parameter &#8216;T&#8217; is ambiguous。在参数类型的确定上产生了不确定性，这是为什么呢？好吧，1会被解释成是int型的，但是我们平时不是经常把int直接传给unsigned类型的参数吗？可惜的是，此时的Min还不是一个函数，它只是一个模板而已，实例化之前尚不能完成参数的隐式转化(其实，我认为这只是编译器支持与否的问题)。同样，可以用显式特例化的方法来解决：<br />
int a = Min<int>(ui, 1); 或者 int a = Min<unsigned>(ui, 1);<br />
当然，还可以强制类型转换：<br />
int a = Min(ui, (unsigned)1); 或者 int a = Min(<int>ui, 1);</p>
<p>晚饭吃的炸酱面，一大碗，没吃饱，又要了一小碗。面做的一点都不好吃，怎奈这几天食欲大振，就像现在的天气一样~ 写这篇日志时，CCTV5直播男篮亚锦赛，CHN VS. TPE，易建联软软的扣了一个篮，解说杨毅：阿联经过这段时间的锻炼，钢筋铁骨啊！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/template-explicit-initiate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++式的告白</title>
		<link>http://www.dutor.net/index.php/2009/08/cpplize-confession/</link>
		<comments>http://www.dutor.net/index.php/2009/08/cpplize-confession/#comments</comments>
		<pubDate>Fri, 14 Aug 2009 08:18:30 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[尚未分类]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[囧Orz]]></category>
		<category><![CDATA[日记]]></category>
		<category><![CDATA[虚拟内存]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1075</guid>
		<description><![CDATA[<pre>
我能抽象出整个世界．．． 
但是我不能抽象出你．．． 
因为你在我心中是那么的具体．．． 
所以我的世界并不完整．．． 
我可以重载甚至覆盖这个世界里的任何一种方法．．． 
但是我却不能重载对你的思念．．． 
也许命中注定了 你在我的世界里永远的烙上了静态的属性．．． 
而我不慎调用了爱你这个方法．．． 
当我义无返顾的把自己作为参数传进这个方法时．．． 
我才发现爱上你是一个死循环．．． 
它不停的返回对你的思念压入我心里的堆栈．．． 
在这无尽的黑夜中．．． 
我的内存里已经再也装不下别人．．． 
我不停的向系统申请空间．．． 
但却捕获一个异常－－－我爱的人不爱我．．． 
为了解决这个异常．．． 
我愿意虚拟出最后一点内存．．． 
把所有我能实现的方法地址压入堆栈．．． 
并且在栈尾压入最后一个方法－－－将字符串＂我爱你，你爱我吗？＂传递给你．．． 
如果返回值为真－－我将用尽一生去爱你．．． 
否则－－我将释放掉所有系统资源 
</pre>]]></description>
			<content:encoded><![CDATA[<pre>
我能抽象出整个世界．．．
但是我不能抽象出你．．．
因为你在我心中是那么的具体．．．
所以我的世界并不完整．．．
我可以重载甚至覆盖这个世界里的任何一种方法．．．
但是我却不能重载对你的思念．．．
也许命中注定了 你在我的世界里永远的烙上了静态的属性．．．
而我不慎调用了爱你这个方法．．．
当我义无返顾的把自己作为参数传进这个方法时．．．
我才发现爱上你是一个死循环．．．
它不停的返回对你的思念压入我心里的堆栈．．．
在这无尽的黑夜中．．．
我的内存里已经再也装不下别人．．．
我不停的向系统申请空间．．．
但却捕获一个异常－－－我爱的人不爱我．．．
为了解决这个异常．．．
我愿意虚拟出最后一点内存．．．
把所有我能实现的方法地址压入堆栈．．．
并且在栈尾压入最后一个方法－－－将字符串＂我爱你，你爱我吗？＂传递给你．．．
如果返回值为真－－我将用尽一生去爱你．．．
否则－－我将释放掉所有系统资源
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/cpplize-confession/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>两片代码</title>
		<link>http://www.dutor.net/index.php/2009/08/two-code/</link>
		<comments>http://www.dutor.net/index.php/2009/08/two-code/#comments</comments>
		<pubDate>Mon, 03 Aug 2009 08:25:05 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[Unix/Linux]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[字符串]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1007</guid>
		<description><![CDATA[看了Linux内核代码linux/string.h中的一些字符串操作函数，有几个写的真是漂亮！
<h6>char * strstr(const char*, const char*)</h6>
<pre lang="cpp" line="1">
/**
 * strstr - Find the first substring in a %NUL terminated string
 * @s1: The string to be searched
 * @s2: The string to search for
 */
char *strstr(const char *s1, const char *s2)
{
	int l1, l2;

	l2 = strlen(s2);
	if (!l2)
		return (char *)s1;
	l1 = strlen(s1);
	while (l1 >= l2) {
		l1--;
		if (!memcmp(s1, s2, l2))
			return (char *)s1;
		s1++;
	}
	return NULL;
}
</pre>]]></description>
			<content:encoded><![CDATA[<p>看了Linux内核代码linux/string.h中的一些字符串操作函数，有几个写的真是漂亮！</p>
<h6>char * strstr(const char*, const char*)</h6>

<div class="wp_codebox"><table><tr id="p100745"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code" id="p1007code45"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/**
 * strstr - Find the first substring in a %NUL terminated string
 * @s1: The string to be searched
 * @s2: The string to search for
 */</span>
<span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span><span style="color: #0000dd;">strstr</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>s1, <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>s2<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> l1, l2<span style="color: #008080;">;</span>
&nbsp;
	l2 <span style="color: #000080;">=</span> <span style="color: #0000dd;">strlen</span><span style="color: #008000;">&#40;</span>s2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>l2<span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>s1<span style="color: #008080;">;</span>
	l1 <span style="color: #000080;">=</span> <span style="color: #0000dd;">strlen</span><span style="color: #008000;">&#40;</span>s1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>l1 <span style="color: #000080;">&gt;=</span> l2<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
		l1<span style="color: #000040;">--</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span><span style="color: #0000dd;">memcmp</span><span style="color: #008000;">&#40;</span>s1, s2, l2<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
			<span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>s1<span style="color: #008080;">;</span>
		s1<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<h6>void * memmove(void *, const void*)</h6>

<div class="wp_codebox"><table><tr id="p100746"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="code" id="p1007code46"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/**
 * memmove - Copy one area of memory to another
 * @dest: Where to copy to
 * @src: Where to copy from
 * @count: The size of the area.
 *
 * Unlike memcpy(), memmove() copes with overlapping areas.
 */</span>
<span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span><span style="color: #0000dd;">memmove</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>dest, <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>src, <span style="color: #0000ff;">size_t</span> count<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>tmp<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>s<span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>dest <span style="color: #000080;">&lt;=</span> src<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
		tmp <span style="color: #000080;">=</span> dest<span style="color: #008080;">;</span>
		s <span style="color: #000080;">=</span> src<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>count<span style="color: #000040;">--</span><span style="color: #008000;">&#41;</span>
			<span style="color: #000040;">*</span>tmp<span style="color: #000040;">++</span> <span style="color: #000080;">=</span> <span style="color: #000040;">*</span>s<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span> 
	<span style="color: #0000ff;">else</span> <span style="color: #008000;">&#123;</span>
		tmp <span style="color: #000080;">=</span> dest<span style="color: #008080;">;</span>
		tmp <span style="color: #000040;">+</span><span style="color: #000080;">=</span> count<span style="color: #008080;">;</span>
		s <span style="color: #000080;">=</span> src<span style="color: #008080;">;</span>
		s <span style="color: #000040;">+</span><span style="color: #000080;">=</span> count<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>count<span style="color: #000040;">--</span><span style="color: #008000;">&#41;</span>
			<span style="color: #000040;">*--</span>tmp <span style="color: #000080;">=</span> <span style="color: #000040;">*--</span>s<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> dest<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<h6>int strcmp(const char*, const char*)</h6>

<div class="wp_codebox"><table><tr id="p100747"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code" id="p1007code47"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/**
 * strncmp - Compare two length-limited strings
 * @cs: One string
 * @ct: Another string
 * @count: The maximum number of bytes to compare
 */</span>
<span style="color: #0000ff;">int</span> <span style="color: #0000dd;">strncmp</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>cs, <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>ct, <span style="color: #0000ff;">size_t</span> count<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">signed</span> <span style="color: #0000ff;">char</span> __res <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>count<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>__res <span style="color: #000080;">=</span> <span style="color: #000040;">*</span>cs <span style="color: #000040;">-</span> <span style="color: #000040;">*</span>ct<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span> <span style="color: #000040;">||</span> <span style="color: #000040;">!</span><span style="color: #000040;">*</span>cs<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
			<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
		count<span style="color: #000040;">--</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> __res<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/two-code/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>struct stat 的用法</title>
		<link>http://www.dutor.net/index.php/2009/05/struct-stat-usage/</link>
		<comments>http://www.dutor.net/index.php/2009/05/struct-stat-usage/#comments</comments>
		<pubDate>Sun, 24 May 2009 12:21:31 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Cpp]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=533</guid>
		<description><![CDATA[<strong>简介</strong>
<pre lang="cpp" line="1">
//! 需要包含de头文件
#include <sys/types.h>
#include <sys/stat.h>

int stat(const char *filename, struct stat *buf); //! prototype,原型

struct stat
{
    dev_t       st_dev;     /* ID of device containing file -文件所在设备的ID*/
    ino_t       st_ino;     /* inode number -inode节点号*/
    mode_t      st_mode;    /* protection -保护模式?*/
    nlink_t     st_nlink;   /* number of hard links -链向此文件的连接数(硬连接)*/
    uid_t       st_uid;     /* user ID of owner -user id*/
    gid_t       st_gid;     /* group ID of owner - group id*/
    dev_t       st_rdev;    /* device ID (if special file) -设备号，针对设备文件*/
    off_t       st_size;    /* total size, in bytes -文件大小，字节为单位*/
    blksize_t   st_blksize; /* blocksize for filesystem I/O -系统块的大小*/
    blkcnt_t    st_blocks;  /* number of blocks allocated -文件所占块数*/
    time_t      st_atime;   /* time of last access -最近存取时间*/
    time_t      st_mtime;   /* time of last modification -最近修改时间*/
    time_t      st_ctime;   /* time of last status change - */
};
</pre>]]></description>
			<content:encoded><![CDATA[<p><strong>简介</strong></p>

<div class="wp_codebox"><table><tr id="p53348"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code" id="p533code48"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">//! 需要包含de头文件</span>
<span style="color: #339900;">#include &lt;sys/types.h&gt;</span>
<span style="color: #339900;">#include &lt;sys/stat.h&gt;</span>
&nbsp;
<span style="color: #0000ff;">int</span> stat<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>filename, <span style="color: #0000ff;">struct</span> stat <span style="color: #000040;">*</span>buf<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//! prototype,原型</span>
&nbsp;
<span style="color: #0000ff;">struct</span> stat
<span style="color: #008000;">&#123;</span>
    dev_t       st_dev<span style="color: #008080;">;</span>     <span style="color: #ff0000; font-style: italic;">/* ID of device containing file -文件所在设备的ID*/</span>
    ino_t       st_ino<span style="color: #008080;">;</span>     <span style="color: #ff0000; font-style: italic;">/* inode number -inode节点号*/</span>
    mode_t      st_mode<span style="color: #008080;">;</span>    <span style="color: #ff0000; font-style: italic;">/* protection -保护模式?*/</span>
    nlink_t     st_nlink<span style="color: #008080;">;</span>   <span style="color: #ff0000; font-style: italic;">/* number of hard links -链向此文件的连接数(硬连接)*/</span>
    uid_t       st_uid<span style="color: #008080;">;</span>     <span style="color: #ff0000; font-style: italic;">/* user ID of owner -user id*/</span>
    gid_t       st_gid<span style="color: #008080;">;</span>     <span style="color: #ff0000; font-style: italic;">/* group ID of owner - group id*/</span>
    dev_t       st_rdev<span style="color: #008080;">;</span>    <span style="color: #ff0000; font-style: italic;">/* device ID (if special file) -设备号，针对设备文件*/</span>
    off_t       st_size<span style="color: #008080;">;</span>    <span style="color: #ff0000; font-style: italic;">/* total size, in bytes -文件大小，字节为单位*/</span>
    blksize_t   st_blksize<span style="color: #008080;">;</span> <span style="color: #ff0000; font-style: italic;">/* blocksize for filesystem I/O -系统块的大小*/</span>
    blkcnt_t    st_blocks<span style="color: #008080;">;</span>  <span style="color: #ff0000; font-style: italic;">/* number of blocks allocated -文件所占块数*/</span>
    <span style="color: #0000ff;">time_t</span>      st_atime<span style="color: #008080;">;</span>   <span style="color: #ff0000; font-style: italic;">/* time of last access -最近存取时间*/</span>
    <span style="color: #0000ff;">time_t</span>      st_mtime<span style="color: #008080;">;</span>   <span style="color: #ff0000; font-style: italic;">/* time of last modification -最近修改时间*/</span>
    <span style="color: #0000ff;">time_t</span>      st_ctime<span style="color: #008080;">;</span>   <span style="color: #ff0000; font-style: italic;">/* time of last status change - */</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p><strong>使用范例</strong></p>

<div class="wp_codebox"><table><tr id="p53349"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
</pre></td><td class="code" id="p533code49"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;ctime&gt;</span>
<span style="color: #339900;">#include &lt;sys/types.h&gt;</span>
<span style="color: #339900;">#include &lt;sys/stat.h&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span>
main <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">struct</span> stat buf<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> result<span style="color: #008080;">;</span>
    result <span style="color: #000080;">=</span> stat <span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;./Makefile&quot;</span>, <span style="color: #000040;">&amp;</span>buf<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>result <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
	  <span style="color: #0000dd;">perror</span> <span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Failed ^_^&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">else</span>
      <span style="color: #008000;">&#123;</span>
	  <span style="color: #666666;">//! 文件的大小，字节为单位</span>
	  <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;size of the file in bytes: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> buf.<span style="color: #007788;">st_size</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	  <span style="color: #666666;">//! 文件创建的时间</span>
	  <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;time of creation of the file: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">ctime</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>buf.<span style="color: #007788;">st_ctime</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span>
	      endl<span style="color: #008080;">;</span>
	  <span style="color: #666666;">//! 最近一次修改的时间</span>
	  <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;time of last modification of the file: &quot;</span> <span style="color: #000080;">&lt;&lt;</span>
	      <span style="color: #0000dd;">ctime</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>buf.<span style="color: #007788;">st_mtime</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	  <span style="color: #666666;">//! 最近一次访问的时间</span>
	  <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;time of last access of the file: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">ctime</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>buf.<span style="color: #007788;">st_atime</span><span style="color: #008000;">&#41;</span>
	      <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
      <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<blockquote><p>输出：</p></blockquote>
<pre>
$ ./test
size of the file in bytes: 36
time of creation of the file: Sun May 24 18:38:10 2009
time of last modification of the file: Sun May 24 18:38:10 2009
time of last access of the file: Sun May 24 18:38:13 2009
</pre>
<p>[warning]This is <em>original</em> article, you could copy it freely with my site links!<br />此日志为dutor原创，您可以自由转载，添加原文链接我将万分感激！[/warning]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/05/struct-stat-usage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C/C++语言常见陷阱(持续更新)</title>
		<link>http://www.dutor.net/index.php/2009/05/c-language-traps/</link>
		<comments>http://www.dutor.net/index.php/2009/05/c-language-traps/#comments</comments>
		<pubDate>Thu, 21 May 2009 14:34:36 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[边走编程]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Cpp]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=504</guid>
		<description><![CDATA[<strong>变量作用域</strong>
<pre lang="cpp" line="1">
int x = 5;
int f() 
{
   int x = 3;       //此x在f作用域中将覆盖全局的x
   {
       extern int x;   //通过extern关键词引入文件作用域的x
       return x;        //于是此作用域内的想是全局的x
   }
}
</pre>
<strong>指针</strong>
<pre lang="cpp" line="1">
int foo();

int (*p)() = &foo;
cout<<p();

p = foo;
cout<<p();

p = *f;
cout<<（*p)();

p = *******foo;
cout<<p();
//上述代码，每一对对指针的赋值和调用都是等价的
</pre>]]></description>
			<content:encoded><![CDATA[<h6>变量作用域</h6>

<div class="wp_codebox"><table><tr id="p50450"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p504code50"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> x <span style="color: #000080;">=</span> <span style="color: #0000dd;">5</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> f<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> 
<span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">int</span> x <span style="color: #000080;">=</span> <span style="color: #0000dd;">3</span><span style="color: #008080;">;</span>       <span style="color: #666666;">//此x在f作用域中将覆盖全局的x</span>
   <span style="color: #008000;">&#123;</span>
       <span style="color: #0000ff;">extern</span> <span style="color: #0000ff;">int</span> x<span style="color: #008080;">;</span>   <span style="color: #666666;">//通过extern关键词引入文件作用域的x</span>
       <span style="color: #0000ff;">return</span> x<span style="color: #008080;">;</span>        <span style="color: #666666;">//于是此作用域内的想是全局的x</span>
   <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<h6>以下代码中的输出语句输出0吗，为什么？</h6>

<div class="wp_codebox"><table><tr id="p50451"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code" id="p504code51"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">struct</span> CLS
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">int</span> m_i<span style="color: #008080;">;</span>
    CLS<span style="color: #008000;">&#40;</span> <span style="color: #0000ff;">int</span> i <span style="color: #008000;">&#41;</span> <span style="color: #008080;">:</span> m_i<span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
    CLS<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        CLS<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> 
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
CLS obj<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> obj.<span style="color: #007788;">m_i</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span></pre></td></tr></table></div>

<blockquote><p>CLS(0);其实只是调用CLS(int)构造函数建立了一个局部对象，而默认构造函数其实相当于什么也没做。</p></blockquote>
<h6>函数指针</h6>

<div class="wp_codebox"><table><tr id="p50452"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code" id="p504code52"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> foo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>p<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #000040;">&amp;</span>foo<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>p<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
p <span style="color: #000080;">=</span> foo<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>p<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
p <span style="color: #000080;">=</span> <span style="color: #000040;">*</span>f<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>（<span style="color: #000040;">*</span>p<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
p <span style="color: #000080;">=</span> <span style="color: #000040;">*******</span>foo<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>p<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #666666;">//上述代码，每一对对指针的赋值和调用都是等价的</span></pre></td></tr></table></div>

<h6>以下代码有什么问题？</h6>

<div class="wp_codebox"><table><tr id="p50453"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code" id="p504code53"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">struct</span> Test
<span style="color: #008000;">&#123;</span>
    Test<span style="color: #008000;">&#40;</span> <span style="color: #0000ff;">int</span> <span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
    Test<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">void</span> fun<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">void</span> main<span style="color: #008000;">&#40;</span> <span style="color: #0000ff;">void</span> <span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    Test a<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    a.<span style="color: #007788;">fun</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    Test b<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    b.<span style="color: #007788;">fun</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<blockquote><p>Test b();编译器会把这一行当成一个函数声明，其返回值是一个Test对象。而不是生成一个对象b</p></blockquote>
<h6>问程序会在哪一行死掉</h6>

<div class="wp_codebox"><table><tr id="p50454"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code" id="p504code54"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">struct</span>   S   
<span style="color: #008000;">&#123;</span>      <span style="color: #666666;">//！ 炸弹加工厂！</span>
        <span style="color: #0000ff;">int</span>   i<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">int</span> <span style="color: #000040;">*</span> p<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">void</span>   main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
        S s<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">int</span> <span style="color: #000040;">*</span>p <span style="color: #000080;">=</span> <span style="color: #000040;">&amp;</span>s.<span style="color: #007788;">i</span><span style="color: #008080;">;</span>  <span style="color: #666666;">//! i地址付给s.p</span>
        p<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">4</span><span style="color: #008080;">;</span>              <span style="color: #666666;">//! 4赋给s.i</span>
        p<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">3</span><span style="color: #008080;">;</span>              <span style="color: #666666;">//! 3赋给s.p</span>
        s.<span style="color: #007788;">p</span> <span style="color: #000080;">=</span> p<span style="color: #008080;">;</span>                <span style="color: #666666;">//! s.i的地址赋给s.p</span>
        s.<span style="color: #007788;">p</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>            <span style="color: #666666;">//! 1赋给s.p,即修改s.p本身</span>
        s.<span style="color: #007788;">p</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>            <span style="color: #666666;">//! ......你觉得呢？</span>
                              <span style="color: #666666;">//! 问题就在这里，向内存0X00000001处写入值2，这是非法的！</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<h6>下面两个函数有什么隐患</h6>

<div class="wp_codebox"><table><tr id="p50455"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p504code55"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> Swap<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #000040;">*</span> x, <span style="color: #0000ff;">int</span><span style="color: #000040;">*</span> y<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>x <span style="color: #000080;">==</span> <span style="color: #0000ff;">NULL</span> <span style="color: #000040;">||</span> y <span style="color: #000080;">==</span> <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> 
    <span style="color: #000040;">*</span>x <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #000040;">*</span>y<span style="color: #008080;">;</span> 
    <span style="color: #000040;">*</span>y <span style="color: #000080;">=</span> <span style="color: #000040;">*</span>x <span style="color: #000040;">-</span> <span style="color: #000040;">*</span>y<span style="color: #008080;">;</span> 
    <span style="color: #000040;">*</span>x <span style="color: #000040;">-</span><span style="color: #000080;">=</span> <span style="color: #000040;">*</span>y<span style="color: #008080;">;</span> 
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<blockquote><p>考虑x,y指向同一变量时候会发生什么？</p></blockquote>
<h6>下面两个函数有什么区别</h6>

<div class="wp_codebox"><table><tr id="p50456"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p504code56"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> foo<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> <span style="color: #000040;">*</span>x, <span style="color: #0000ff;">int</span> <span style="color: #000040;">*</span>y<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>   
    <span style="color: #000040;">*</span>x <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #000040;">*</span>y<span style="color: #008080;">;</span>
    <span style="color: #000040;">*</span>x <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #000040;">*</span>y<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">void</span> fun<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> <span style="color: #000040;">*</span>x, <span style="color: #0000ff;">int</span> <span style="color: #000040;">*</span>y<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>   
    <span style="color: #000040;">*</span>x <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">2</span> <span style="color: #000040;">*</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>y<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<blockquote><p>同上</p></blockquote>
<h6>不用循环，输出1~1000</h6>

<div class="wp_codebox"><table><tr id="p50457"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code" id="p504code57"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">struct</span> print
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">int</span> m_n<span style="color: #008080;">;</span>
    print<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>m_n<span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">' '</span><span style="color: #008080;">;</span>
        m_n<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> print<span style="color: #008080;">::</span><span style="color: #007788;">m_n</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    print test<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">20</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<h6>判断单链表是否有环</h6>

<div class="wp_codebox"><table><tr id="p50458"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code" id="p504code58"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">bool</span>
check <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> node <span style="color: #000040;">*</span> head<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>head <span style="color: #000080;">==</span> <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>  <span style="color: #666666;">//! </span>
    node <span style="color: #000040;">*</span>
	slow <span style="color: #000080;">=</span> head, <span style="color: #000040;">*</span>fast <span style="color: #000080;">=</span> head<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>fast <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span> <span style="color: #000040;">&amp;&amp;</span> fast<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span>  <span style="color: #666666;">//! 没有环，最终会退出</span>
      <span style="color: #008000;">&#123;</span>
	  slow <span style="color: #000080;">=</span> slow<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008080;">;</span>   <span style="color: #666666;">//! 一快一慢两个指针，</span>
	  fast <span style="color: #000080;">=</span> fast<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008080;">;</span>   <span style="color: #666666;">//! 如果有环，可在O(lgN)内相等</span>
	  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>slow <span style="color: #000080;">==</span> fast<span style="color: #008000;">&#41;</span>
	      <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
      <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<h6>下面程序有什么问题？</h6>

<div class="wp_codebox"><table><tr id="p50459"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code" id="p504code59"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;string&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> n<span style="color: #008080;">;</span>
	string str<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>n<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>n<span style="color: #000040;">--</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>str<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">size_t</span> cnt <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> pos <span style="color: #000080;">=</span> str.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> pos <span style="color: #000080;">&gt;=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> <span style="color: #000040;">--</span>pos<span style="color: #008000;">&#41;</span>
			<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">isdigit</span><span style="color: #008000;">&#40;</span>str<span style="color: #008000;">&#91;</span>pos<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
				<span style="color: #000040;">++</span>cnt<span style="color: #008080;">;</span>
		<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>cnt<span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>[warning]This is <em>original</em> article, you could copy it freely with my site links!<br />此日志为dutor原创，您可以自由转载，添加原文链接我将万分感激！[/warning]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/05/c-language-traps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>数组本质</title>
		<link>http://www.dutor.net/index.php/2009/05/essence-of-matrixs-arrays/</link>
		<comments>http://www.dutor.net/index.php/2009/05/essence-of-matrixs-arrays/#comments</comments>
		<pubDate>Mon, 11 May 2009 22:58:01 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[边走编程]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=431</guid>
		<description><![CDATA[<blockquote>       数组和指针之间存在如下等价关系：</blockquote>


<ul>
	<li>一维数组等价于元素的指针：int a[20]  <==> int *const a;</li>
	<li>二维数组等价于指向一维数组的指针，int b[3][4]  <==>  int(*const b) [4];</li>
	<li>三维数组等价于指向二维数组的指针，int c[2][3][4] <==>  int (*const c) [3][4];</li>
</ul>


<blockquote>       其他多维数组与二、三维相似，不再赘述。</blockquote>

]]></description>
			<content:encoded><![CDATA[<blockquote><p>
       任何数组，不论是静态声明的还是动态分配的，其所有元素在内存中都是连续存放的。关于数组教材上已经有很多很详细的讲解了，在这里记录一下不易被理解、且常被“老师们”忽略的地方。<br />
       数组的名字本身就是一个指针，是一个指针常量，即对于一个数组int a[8];a等价于int*const a,因此你不能试图修改数组明a使之指向内存中其他地址。<br />
       申明数组时，要么明确地给出其元素的个数以让编译器为你分配内存，要么不指定个数而直接初始化数组元素，要么既指定个数又进行初始化。<br />
       管好你的数组，不要访问数组意外的内存数据，因为C/C++编译器不会进行数组越界检查。关于为何不检测越界，有多种理由，其中一种说法：访问数组所用的下标是变量，而变量在编译期间是无法确定其值的。<br />
       对于多维数组。数组实际上是可以进行递归定义的：任何维数的数组都可以看作是由比它少一维的数组所组成的一维数组。例如a[3][4][5]可以看成是由二维数组int b[4][5]组成的一维数组，其长度为3，二维数组也是一样。</p></blockquote>
<blockquote><p>       数组和指针之间存在如下等价关系：</p></blockquote>
<ul>
<li>一维数组等价于元素的指针：int a[20]  <==> int *const a;</li>
<li>二维数组等价于指向一维数组的指针，int b[3][4]  <==>  int(*const b) [4];</li>
<li>三维数组等价于指向二维数组的指针，int c[2][3][4] <==>  int (*const c) [3][4];</li>
</ul>
<blockquote><p>       其他多维数组与二、三维相似，不再赘述。</p></blockquote>
<p>[warning]This is <em>original</em> article, you could copy it freely with my site links!<br />此日志为dutor原创，您可以自由转载，添加原文链接我将万分感激！[/warning]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/05/essence-of-matrixs-arrays/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>int a = a</title>
		<link>http://www.dutor.net/index.php/2009/05/int-a-a/</link>
		<comments>http://www.dutor.net/index.php/2009/05/int-a-a/#comments</comments>
		<pubDate>Mon, 11 May 2009 22:38:06 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Cpp]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=420</guid>
		<description><![CDATA[<strong>我的理解：</strong>


<blockquote>      在main函数中由于定义了一个局部变量a，因此全局变量a被隐藏。int a = a;定义a(为a分配内存),然后用a(右侧的a)给a(左侧的a)赋值。所以这段代码是可以通过编译的，但是链接时候就会出错。因为，使用了一个未初始化的变量来给一个变量赋值。有可能在某些编译器上面是可以链接并运行的，说明它对变量的初始化不太严格。</blockquote>]]></description>
			<content:encoded><![CDATA[<p><strong>有这样一段代码：</strong></p>

<div class="wp_codebox"><table><tr id="p42060"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p420code60"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt; </span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span> 
<span style="color: #0000ff;">int</span> a <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> 
<span style="color: #008000;">&#123;</span> 
   <span style="color: #0000ff;">int</span> a <span style="color: #000080;">=</span> a<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> 
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p><strong>我的理解：</strong></p>
<blockquote><p>      在main函数中由于定义了一个局部变量a，因此全局变量a被隐藏。int a = a;定义a(为a分配内存),然后用a(右侧的a)给a(左侧的a)赋值。所以这段代码是可以通过编译的，但是链接时候就会出错。因为，使用了一个未初始化的变量来给一个变量赋值。有可能在某些编译器上面是可以链接并运行的，说明它对变量的初始化不太严格。</p></blockquote>
<p>[warning]This is <em>original</em> article, you could copy it freely with my site links!<br />此日志为dutor原创，您可以自由转载，添加原文链接我将万分感激！[/warning]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/05/int-a-a/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>判断内存增长方式bigendian</title>
		<link>http://www.dutor.net/index.php/2009/04/isbigendianess/</link>
		<comments>http://www.dutor.net/index.php/2009/04/isbigendianess/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 03:35:32 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Cpp]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=254</guid>
		<description><![CDATA[<strong>运行期(runtime)判断</strong>
下面的程序可以在运行期判断 endianess:
<pre lang="cpp" >
int IsBigEndian (void)
{
        static const int v =1;
        return *(char*)&#038;v?0:1;
}
</pre>]]></description>
			<content:encoded><![CDATA[<p><strong>运行期(runtime)判断</strong><br />
下面的程序可以在运行期判断 endianess:</p>

<div class="wp_codebox"><table><tr id="p25461"><td class="code" id="p254code61"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> IsBigEndian <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> v <span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span><span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">&amp;</span>v<span style="color: #008080;">?</span><span style="color: #0000dd;">0</span><span style="color: #008080;">:</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p><strong>编译期(compile-time)判断</strong></p>

<div class="wp_codebox"><table><tr id="p25462"><td class="code" id="p254code62"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;endian.h&gt;</span>
<span style="color: #339900;">#if BYTE_ORDER == LITTLE_ENDIAN</span>
<span style="color: #339900;">#if BYTE_ORDER == BIG_ENDIAN</span>
<span style="color: #339900;">#if BYTE_ORDER == PDP_ENDIAN</span></pre></td></tr></table></div>

<p>[warning]This is <em>original</em> article, you could copy it freely with my site links!<br />此日志为dutor原创，您可以自由转载，添加原文链接我将万分感激！[/warning]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/04/isbigendianess/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>An overview of C++</title>
		<link>http://www.dutor.net/index.php/2009/04/an-overview-of-c/</link>
		<comments>http://www.dutor.net/index.php/2009/04/an-overview-of-c/#comments</comments>
		<pubDate>Sat, 25 Apr 2009 01:15:37 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=204</guid>
		<description><![CDATA[<strong>Introduction</strong>


<blockquote>A good way to get into an argument with a computer programmer is to attempt to explain why the language they are using is not as good as the one you are using. Most of the programmers I know are positively religious over their Operating System (see my other article), their development language and finally their text editor.</blockquote>]]></description>
			<content:encoded><![CDATA[<p><strong>Introduction</strong></p>
<blockquote><p>A good way to get into an argument with a computer programmer is to attempt to explain why the language they are using is not as good as the one you are using. Most of the programmers I know are positively religious over their Operating System (see my other article), their development language and finally their text editor.</p></blockquote>
<blockquote><p>As you might have inferred by the title, I feel that C++ is the superior computer programming language. I will begin by qualifying that statement somewhat. I learned to program using Pascal and I still feel that it is a good language for learning computer programming. Pascal is type safe, has a very limited number of keywords and encourages good programming principles. The BASIC language in the form of Visual Basic on the other hand is an ideal language for quickly putting together a project, and for taking advantage of data base access and other advanced programming tools such as Microsoft&#8217;s Component Object Model (COM).</p></blockquote>
<blockquote><p>Why is it then that modern operating systems and very large applications are written in C++? Visual Basic and Pascal (in the form of Delphi) barely resemble the ANSI definition of these languages. Each of these languages are proprietary and lock you in to a particular vendor. This does not particularly bother me, since I program exclusively for the Windows environment and use Microsoft&#8217;s Visual C++ as my development environment. There are other features of C++ that are attractive when doing medium to large scale development:</p></blockquote>
<ul>
<li>Operator overloading (also in Delphi)</li>
<li>Exceptions (also in Delphi and Java) </li>
<li>Templates </li>
</ul>
<blockquote><p>These are the primary features of C++ that set it apart from its peers. I am not going to mention Object Oriented Programming (OOP) here because Java, VB and Delphi support OOP in some form or fashion. I would place OOP above the other three bullets if I were including it in this discussion.</p></blockquote>
<p><strong>Operator Overloading</strong></p>
<blockquote><p>I am sure that many of my C++ peers would disagree with me about the relative importance of the three features that I have selected. Operator overloading is essential to making a library of code &#8220;fool proof&#8221;. First, let&#8217;s look at a typical example of operator overloading:</p></blockquote>

<div class="wp_codebox"><table><tr id="p20463"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
</pre></td><td class="code" id="p204code63"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">class</span> CVeryLong 
  <span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
      <span style="color: #666666;">// default contructor inits member variables to zero</span>
      CVeryLong<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span> m_lHigh <span style="color: #000080;">=</span> m_lLow <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span> 
      <span style="color: #666666;">// initialization constructor sets member variables to a value</span>
      CVeryLong<span style="color: #008000;">&#40;</span> <span style="color: #0000ff;">long</span> lHigh, <span style="color: #0000ff;">long</span> lLow <span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span> m_lHigh <span style="color: #000080;">=</span> lHigh<span style="color: #008080;">;</span> m_lLow <span style="color: #000080;">=</span> lLow<span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span> 
      <span style="color: #0000ff;">virtual</span> ~CVeryLong<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// destructor</span>
      <span style="color: #0000ff;">void</span> SetHighValue<span style="color: #008000;">&#40;</span> <span style="color: #0000ff;">long</span> lValue <span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span> m_lHigh <span style="color: #000080;">=</span> lValue<span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
      <span style="color: #0000ff;">long</span> GetHighValue<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span> <span style="color: #0000ff;">return</span> m_lHigh<span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
      <span style="color: #0000ff;">void</span> SetLowValue<span style="color: #008000;">&#40;</span> <span style="color: #0000ff;">long</span> lValue <span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span> m_lLow <span style="color: #000080;">=</span> lValue<span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
      <span style="color: #0000ff;">long</span> GetLowValue<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span> <span style="color: #0000ff;">return</span> m_lLow<span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
      BOOL operator <span style="color: #000080;">&lt;</span> <span style="color: #008000;">&#40;</span> CVeryLong<span style="color: #000040;">&amp;</span> refValue <span style="color: #008000;">&#41;</span>    <span style="color: #666666;">// less than operator</span>
      <span style="color: #008000;">&#123;</span>
          <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span> m_lHigh <span style="color: #000080;">&lt;</span> refValue.<span style="color: #007788;">GetHighValue</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> TRUE<span style="color: #008080;">;</span>
          <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span> m_lHigh <span style="color: #000080;">&gt;</span> refValue.<span style="color: #007788;">GetHighValue</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> FALSE<span style="color: #008080;">;</span>
          <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span> m_lLow <span style="color: #000080;">&lt;</span> refValue.<span style="color: #007788;">GetLowValue</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> TRUE<span style="color: #008080;">;</span>
          <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">return</span> FALSE<span style="color: #008080;">;</span> <span style="color: #666666;">// &gt;=</span>
      <span style="color: #008000;">&#125;</span>
      BOOL operator <span style="color: #000080;">&gt;</span> <span style="color: #008000;">&#40;</span> CVeryLong<span style="color: #000040;">&amp;</span> refValue <span style="color: #008000;">&#41;</span>    <span style="color: #666666;">// greater than operator</span>
      <span style="color: #008000;">&#123;</span>
          <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span> m_lHigh <span style="color: #000080;">&gt;</span> refValue.<span style="color: #007788;">GetHighValue</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> TRUE<span style="color: #008080;">;</span>
          <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span> m_lHigh <span style="color: #000080;">&lt;</span> refValue.<span style="color: #007788;">GetHighValue</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> FALSE<span style="color: #008080;">;</span>
          <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span> m_lLow <span style="color: #000080;">&gt;</span> refValue.<span style="color: #007788;">GetLowValue</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> TRUE<span style="color: #008080;">;</span>
          <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">return</span> FALSE<span style="color: #008080;">;</span> <span style="color: #666666;">// &lt;=</span>
      <span style="color: #008000;">&#125;</span>
      BOOL operator <span style="color: #000080;">==</span> <span style="color: #008000;">&#40;</span> CVeryLong<span style="color: #000040;">&amp;</span> refValue <span style="color: #008000;">&#41;</span> <span style="color: #666666;">// equivalence operator</span>
      <span style="color: #008000;">&#123;</span>
          <span style="color: #0000ff;">return</span> m_lHigh <span style="color: #000080;">==</span> refValue.<span style="color: #007788;">GetHighValue</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> 
                   <span style="color: #000040;">&amp;&amp;</span> m_lLow <span style="color: #000080;">==</span> refValue.<span style="color: #007788;">GetLowValue</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #008000;">&#125;</span>
&nbsp;
  <span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
      <span style="color: #0000ff;">long</span> m_lLow<span style="color: #008080;">;</span>
      <span style="color: #0000ff;">long</span> m_lHigh<span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<blockquote><p>The CVeryLong class keeps two private long variables to represent a single 64 bit integer. In this class, we are overloading the less than (<), greater than (>) and equivalence (==) operators to allow comparison of our new 64 bit integer class. This class is obviously not complete since I have not overloaded other key operators such as the arithmetic operators. Here is some sample code using our new class:</p></blockquote>

<div class="wp_codebox"><table><tr id="p20464"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre></td><td class="code" id="p204code64"><pre class="cpp" style="font-family:monospace;"><span style="color: #008000;">&#123;</span>
   CString csText<span style="color: #008080;">;</span>
   CVeryLong vl1<span style="color: #008000;">&#40;</span> <span style="color: #0000dd;">1</span>, <span style="color: #0000dd;">2</span> <span style="color: #008000;">&#41;</span>, vl2<span style="color: #008000;">&#40;</span> <span style="color: #0000dd;">1</span>, <span style="color: #0000dd;">3</span> <span style="color: #008000;">&#41;</span>, vl3<span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;vl1 is (1, 2)&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;vl2 is (1, 3)&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;vl3 is (1, 2)&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
   csText <span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;vl1 &lt; vl2 is &quot;</span><span style="color: #008080;">;</span>
   csText <span style="color: #000040;">+</span><span style="color: #000080;">=</span> vl1 <span style="color: #000080;">&lt;</span> vl2 <span style="color: #008080;">?</span> <span style="color: #FF0000;">&quot;true&quot;</span> <span style="color: #008080;">:</span> <span style="color: #FF0000;">&quot;false&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span>LPCTSTR<span style="color: #008000;">&#41;</span>csText <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
   csText <span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;vl1 &gt; vl2 is &quot;</span><span style="color: #008080;">;</span>
   csText <span style="color: #000040;">+</span><span style="color: #000080;">=</span> vl1 <span style="color: #000080;">&gt;</span> vl2 <span style="color: #008080;">?</span> <span style="color: #FF0000;">&quot;true&quot;</span> <span style="color: #008080;">:</span> <span style="color: #FF0000;">&quot;false&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span>LPCTSTR<span style="color: #008000;">&#41;</span>csText <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
   csText <span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;vl1 = = vl2 is &quot;</span><span style="color: #008080;">;</span>
   csText <span style="color: #000040;">+</span><span style="color: #000080;">=</span> vl1 <span style="color: #000080;">==</span> vl2 <span style="color: #008080;">?</span> <span style="color: #FF0000;">&quot;true&quot;</span> <span style="color: #008080;">:</span> <span style="color: #FF0000;">&quot;false&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span>LPCTSTR<span style="color: #008000;">&#41;</span>csText <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
   csText <span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;vl1 &lt; vl3 is &quot;</span><span style="color: #008080;">;</span>
   csText <span style="color: #000040;">+</span><span style="color: #000080;">=</span> vl1 <span style="color: #000080;">&lt;</span> vl3 <span style="color: #008080;">?</span> <span style="color: #FF0000;">&quot;true&quot;</span> <span style="color: #008080;">:</span> <span style="color: #FF0000;">&quot;false&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span>LPCTSTR<span style="color: #008000;">&#41;</span>csText <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
   csText <span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;vl1 &gt; vl3 is &quot;</span><span style="color: #008080;">;</span>
   csText <span style="color: #000040;">+</span><span style="color: #000080;">=</span> vl1 <span style="color: #000080;">&gt;</span> vl3 <span style="color: #008080;">?</span> <span style="color: #FF0000;">&quot;true&quot;</span> <span style="color: #008080;">:</span> <span style="color: #FF0000;">&quot;false&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span>LPCTSTR<span style="color: #008000;">&#41;</span>csText <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
   csText <span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;vl1 = = vl3 is &quot;</span><span style="color: #008080;">;</span>
   csText <span style="color: #000040;">+</span><span style="color: #000080;">=</span> vl1 <span style="color: #000080;">==</span> vl3 <span style="color: #008080;">?</span> <span style="color: #FF0000;">&quot;true&quot;</span> <span style="color: #008080;">:</span> <span style="color: #FF0000;">&quot;false&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span>LPCTSTR<span style="color: #008000;">&#41;</span>csText <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<blockquote><p>Running the program containing the above code, generates the following output:</p></blockquote>
<blockquote><p>       vl1 is (1, 2)<br />
       vl2 is (1, 3)<br />
       vl3 is (1, 2)<br />
       vl1 < vl2 is true<br />
       vl1 > vl2 is false<br />
       vl1 == vl2 is false<br />
       vl1 < vl3 is false<br />
       vl1 > vl3 is false<br />
       vl1 == vl3</p></blockquote>
<blockquote><p>is trueAt this point, we have told the compiler what to do when it sees the >, < or == operators used with our class. We could have just as easily defined GreaterThan, LessThan and EqualTo member functions to do the same thing - and in other languages, this is exactly what you would have to do:</p></blockquote>
<blockquote><p>vl1 == vl3</p></blockquote>
<blockquote><p>would be equivalent to vl1.EqualTo( vl3 )So we have made the notation more concise and consistent with the intrinsic data types, but when we began this discussion, I stated that operator overloading would make the code &#8220;fool proof&#8221;. Notice that in the middle of the sample usage code:</p></blockquote>
<blockquote><p>vl3 = vl1;   // assign vl1 to vl3 and do the comparisons again</p></blockquote>
<blockquote><p>we did not overload the assignment operator, so C++ behaves like most languages when presented with this statement, and simply copies the member variables from one object to the other. What if our class were going to support n-level precision so that at compile time, we do not know how many longs to allocate? We would have to dynamically allocate the variables in the constructor and free them in the destructor. Our member variables might look like this:</p></blockquote>

<div class="wp_codebox"><table><tr id="p20465"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p204code65"><pre class="cpp" style="font-family:monospace;"> <span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
    <span style="color: #0000ff;">short</span> m_nValues<span style="color: #008080;">;</span> <span style="color: #666666;">// number of values allocated</span>
    <span style="color: #0000ff;">long</span><span style="color: #000040;">*</span> m_pValues<span style="color: #008080;">;</span> <span style="color: #666666;">// array of values</span></pre></td></tr></table></div>

<blockquote><p>The default assignment operator will copy the member variables just as it did before, only now you have two pointers pointing to the same block of allocated memory. When the destructor for the first object runs, it will free the memory block with no problems, but when the second object&#8217;s destructor runs, it tries to free the same block of memory &#8211; bug and crash. Even though you can write a Copy function to do the right thing, you cannot keep some unsuspecting programmer from coding the assignment that &#8220;works most of the time&#8221;. Visual Basic is still &#8220;fool proof&#8221; at this point because it does not allow dynamic memory allocation, but Pascal (not Delphi) will let you crash and burn at this point.</p></blockquote>
<blockquote><p>In C++, the assignment operator would be written as follows:</p></blockquote>

<div class="wp_codebox"><table><tr id="p20466"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code" id="p204code66"><pre class="cpp" style="font-family:monospace;"> CVeryVeryLong operator <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span> CVeryVeryLong<span style="color: #000040;">&amp;</span> refValue <span style="color: #008000;">&#41;</span> <span style="color: #666666;">// assignment operator</span>
<span style="color: #008000;">&#123;</span>
   <span style="color: #0000dd;">delete</span> <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> m_pValues<span style="color: #008080;">;</span> <span style="color: #666666;">// free previous values</span>
   m_nValues <span style="color: #000080;">=</span> refValue.<span style="color: #007788;">GetNumberOfValues</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// needs to be defined</span>
   m_pValues <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> <span style="color: #0000ff;">long</span><span style="color: #008000;">&#91;</span> m_nValues <span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// allocate new values</span>
&nbsp;
   <span style="color: #666666;">// GetBuffer() in the following line needs to be defined</span>
   <span style="color: #666666;">// copy the array contents</span>
   <span style="color: #0000dd;">memcpy</span><span style="color: #008000;">&#40;</span> m_pValue, refValue.<span style="color: #007788;">GetBuffer</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">long</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">*</span> m_nValues <span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">return</span> <span style="color: #000040;">*</span><span style="color: #0000dd;">this</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<blockquote><p>The conclusion here is that a language should either cripple itself as is the case with Java or VB (no dynamic memory allocation), or provide the programmer with a way of guaranteeing that users of your code cannot use it improperly.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/04/an-overview-of-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

