<?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>内蒙古工业大学_学习网</title>
	<atom:link href="http://www.ddeaw.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ddeaw.com</link>
	<description>塑造彪悍人生</description>
	<lastBuildDate>Thu, 01 Dec 2011 11:51:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>《每天懂一点好玩心理学》：实用，好读</title>
		<link>http://www.ddeaw.com/2011491.html</link>
		<comments>http://www.ddeaw.com/2011491.html#comments</comments>
		<pubDate>Thu, 01 Dec 2011 11:51:46 +0000</pubDate>
		<dc:creator>学习网</dc:creator>
				<category><![CDATA[五味参杂]]></category>
		<category><![CDATA[读书]]></category>

		<guid isPermaLink="false">http://www.ddeaw.com/?p=491</guid>
		<description><![CDATA[作者: 原田玲仁 副标题: 给普通人看的心理学 isbn: 7561348843 页数: 208 译者: 郭勇 定价: 28 出版社: 陕西师范大学出版社 装帧: 平装 出版年: 2009-12-01 又名: a little psy everyday 书名: 每天懂一点好玩心理学 今天阅读的第三本书（有0.25本忽略不计了）。 大概一个小时就读完了，因为非常简单、易懂，写得也很生动，而且，不少内容以前是明白的，有这个基础，再逐字逐句地读是没必要的。右侧的图也是一扫而过，所以事实上，202页书，是当100页读的。 但这验证了一个道理：读书越多，越快。因为读的书越多，越会明白，相当部分内容是重复的，当你明白了论点，而且看到论据有的是重复的，就没必要一定要认真地看完，而是略过即可，眼睛一扫，明白大意，足矣。 我之前曾经看过作者的另一本书，《每天懂一点色彩心理学》，同系列的，写的类似的好玩，一本好书，应是让人读起来轻松，又能够学到东西，这两本书都符合这个要求。 我同时也注意到延伸阅读里有推荐作者的《每天懂一点创意心理学》，对这本书很感兴趣，可惜图书馆现在不提供预借，所以先Mark了。 心理学是必须要懂的学科之一，因为人是群体动物，在与人相处的时候，懂点心理学非常有益，即使不为与人相处，人也需要与自己相处，那么，懂得 自己的心理，也是非常必要的。现代人由于压力太大，常有精神疾患，如果能够学会做自己的医生，对自己来说是桩功德，若能兼济他人，则更是功德无量。 文章来源：逍遥游]]></description>
			<content:encoded><![CDATA[<p>作者: 原田玲仁<br />
副标题: 给普通人看的心理学<br />
isbn: 7561348843<br />
页数: 208<br />
译者: 郭勇<br />
定价: 28<br />
出版社: 陕西师范大学出版社<br />
装帧: 平装<br />
出版年: 2009-12-01<br />
又名: a little psy everyday<br />
书名: 每天懂一点好玩心理学</p>
<p>今天阅读的第三本书（有0.25本忽略不计了）。</p>
<p>大概一个小时就读完了，因为非常简单、易懂，写得也很生动，而且，不少内容以前是明白的，有这个基础，再逐字逐句地读是没必要的。右侧的图也是一扫而过，所以事实上，202页书，是当100页读的。</p>
<p>但这验证了一个道理：读书越多，越快。因为读的书越多，越会明白，相当部分内容是重复的，当你明白了论点，而且看到论据有的是重复的，就没必要一定要认真地看完，而是略过即可，眼睛一扫，明白大意，足矣。</p>
<p>我之前曾经看过作者的另一本书，《每天懂一点色彩心理学》，同系列的，写的类似的好玩，一本好书，应是让人读起来轻松，又能够学到东西，这两本书都符合这个要求。</p>
<p>我同时也注意到延伸阅读里有推荐作者的《每天懂一点创意心理学》，对这本书很感兴趣，可惜图书馆现在不提供预借，所以先Mark了。</p>
<p>心理学是必须要懂的学科之一，因为人是群体动物，在与人相处的时候，懂点心理学非常有益，即使不为与人相处，人也需要与自己相处，那么，懂得 自己的心理，也是非常必要的。现代人由于压力太大，常有精神疾患，如果能够学会做自己的医生，对自己来说是桩功德，若能兼济他人，则更是功德无量。</p>
<p>文章来源：逍遥游</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ddeaw.com/2011491.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>游记的写作技巧</title>
		<link>http://www.ddeaw.com/2011488.html</link>
		<comments>http://www.ddeaw.com/2011488.html#comments</comments>
		<pubDate>Thu, 01 Dec 2011 11:48:12 +0000</pubDate>
		<dc:creator>学习网</dc:creator>
				<category><![CDATA[五味参杂]]></category>

		<guid isPermaLink="false">http://www.ddeaw.com/?p=488</guid>
		<description><![CDATA[写游记，不要当作任务，而要养成习惯，游记有益于过程中细致观察，如果不写游记，可能过程中的很多细节会被忽略，当然，不是每个人都愿意如此，随自己喜欢就好了，本文只供喜欢写和愿意写的人参考。 1、过程中注意记录。最好随身带笔和纸，因为数码工具好是好，但比较慢，比如笔记本要启动，需要一点时间，而纸是随时可以拿出来的，当然笔要准备好，不出墨就惨了，这次在日本丰田，因为天冷，结果笔出水不太顺畅，影响了记录，只好把笔芯取出来放在手里暖，才好一些; 2、记录不用太详细。只要线索就够了;要多拍照，拍照不是只拍风景，照片也可以当线索记;照片最好是用手机、touch等，如果能够上网、定位最佳，因为可以按地点进行区分，这也是记录的一种方式; 3、要及时总结。不要拖得太久，太久以后记忆不是那么鲜明，需要花很多时间来回忆。最好是尽快完成。 4、写之前的准备。最好是先看照片或者带回的相关资料，在脑子里勾勒出记录的大纲，要么按顺序，要么按地点，在写之前，通过看照片等引发记忆，然后一气呵成。 5、全部写完文字后再加照片。如果边写边加照片，就会比较慢，我一般是先写文字，因为事先看过了照片，所以知道在哪些地方应该加照片，文字和照片呼应，等到全部写完，把照片一次性加进去。 6、游记每篇不要写得太长。分散开主题，短篇、多篇，这样比较不会造成读者的负担，一定要图文并茂。不要只有文字没有图，或者反之。 7、制作合集。在全部写完以后，一定要做一个合集，一方面是为了自己归整资料的方便，另一方面也方便读者阅读。]]></description>
			<content:encoded><![CDATA[<p>写游记，不要当作任务，而要养成习惯，游记有益于过程中细致观察，如果不写游记，可能过程中的很多细节会被忽略，当然，不是每个人都愿意如此，随自己喜欢就好了，本文只供喜欢写和愿意写的人参考。</p>
<p>1、过程中注意记录。最好随身带笔和纸，因为数码工具好是好，但比较慢，比如笔记本要启动，需要一点时间，而纸是随时可以拿出来的，当然笔要准备好，不出墨就惨了，这次在日本丰田，因为天冷，结果笔出水不太顺畅，影响了记录，只好把笔芯取出来放在手里暖，才好一些;</p>
<p>2、记录不用太详细。只要线索就够了;要多拍照，拍照不是只拍风景，照片也可以当线索记;照片最好是用手机、touch等，如果能够上网、定位最佳，因为可以按地点进行区分，这也是记录的一种方式;</p>
<p>3、要及时总结。不要拖得太久，太久以后记忆不是那么鲜明，需要花很多时间来回忆。最好是尽快完成。</p>
<p>4、写之前的准备。最好是先看照片或者带回的相关资料，在脑子里勾勒出记录的大纲，要么按顺序，要么按地点，在写之前，通过看照片等引发记忆，然后一气呵成。</p>
<p>5、全部写完文字后再加照片。如果边写边加照片，就会比较慢，我一般是先写文字，因为事先看过了照片，所以知道在哪些地方应该加照片，文字和照片呼应，等到全部写完，把照片一次性加进去。</p>
<p>6、游记每篇不要写得太长。分散开主题，短篇、多篇，这样比较不会造成读者的负担，一定要图文并茂。不要只有文字没有图，或者反之。</p>
<p>7、制作合集。在全部写完以后，一定要做一个合集，一方面是为了自己归整资料的方便，另一方面也方便读者阅读。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ddeaw.com/2011488.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>二月暮光</title>
		<link>http://www.ddeaw.com/2011484.html</link>
		<comments>http://www.ddeaw.com/2011484.html#comments</comments>
		<pubDate>Thu, 01 Dec 2011 11:43:33 +0000</pubDate>
		<dc:creator>学习网</dc:creator>
				<category><![CDATA[英语沙龙]]></category>
		<category><![CDATA[english]]></category>

		<guid isPermaLink="false">http://www.ddeaw.com/?p=484</guid>
		<description><![CDATA[中文标题:二月暮光   原文标题:February Twilight I stood beside a hill Smooth with new-laid snow, A single star looked out From the cold evening glow.  There was no other creature That saw what I could see-- I stood and watched the evening star As long as it watched me.                             (by Sara Teasdale) 我伫立丘旁， 茸雪覆盖光滑如卵， 孤星眺望， 在冰冷暮辉中闪光。 [...]]]></description>
			<content:encoded><![CDATA[<p>中文标题:二月暮光</p>
<div> </div>
<p>原文标题:February Twilight</p>
<div>
<div><span style="font-size: small;">I stood beside a hill</span></div>
<div><span style="font-size: small;">Smooth with new-laid snow,</span></div>
<div><span style="font-size: small;">A single star looked out</span></div>
<div><span style="font-size: small;">From the cold evening glow. </span></div>
<div><span style="font-size: small;">There was no other creature</span></div>
<div><span style="font-size: small;">That saw what I could see--</span></div>
<div><span style="font-size: small;">I stood and watched the evening star</span></div>
<div><span style="font-size: small;">As long as it watched me. </span></div>
<div><span style="font-size: small;">                           (by</span><span style="color: #000000; font-size: small;"> Sara Teasdale</span><span style="color: #0033cc; font-size: small;">)</span></div>
<div><span style="font-size: small;"><br />
</span></div>
<div><span style="color: #d6006d; font-size: small;">我伫立丘旁，</span></div>
<div><span style="color: #d6006d; font-size: small;">茸雪覆盖光滑如卵，</span></div>
<div><span style="color: #d6006d; font-size: small;">孤星眺望，</span></div>
<div><span style="color: #d6006d; font-size: small;">在冰冷暮辉中闪光。</span></div>
<div><span style="color: #d6006d; font-size: small;">四下空寂，</span></div>
<div><span style="color: #d6006d; font-size: small;">我恍然意识到——</span></div>
<div><span style="color: #d6006d; font-size: small;">伫立遥望的暮夜之星，</span></div>
<div><span style="color: #d6006d; font-size: small;">一样在注目于我。</span></div>
</div>
<div> </div>
<div> </div>
]]></content:encoded>
			<wfw:commentRss>http://www.ddeaw.com/2011484.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>伊朗学生冲击英国使馆</title>
		<link>http://www.ddeaw.com/2011479.html</link>
		<comments>http://www.ddeaw.com/2011479.html#comments</comments>
		<pubDate>Thu, 01 Dec 2011 11:41:35 +0000</pubDate>
		<dc:creator>学习网</dc:creator>
				<category><![CDATA[英语沙龙]]></category>
		<category><![CDATA[english]]></category>

		<guid isPermaLink="false">http://www.ddeaw.com/?p=479</guid>
		<description><![CDATA[Iranian students storm British Embassy &#160; 伊朗学生冲击英国使馆 &#160; &#160; TEHRAN — Student hard-liners stormed the British Embassy on Tuesday to protest tough new sanctions against Iran, replacing the Union Jack with the flag of the Islamic republic and chanting “Death to England” as they hurled satellite dishes from the roof of a security building to [...]]]></description>
			<content:encoded><![CDATA[<div><span style="font-size: small;">Iranian students storm British Embassy</span></div>
<p>&nbsp;</p>
<div>伊朗学生冲击英国使馆</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div>
<div><span style="font-size: small;">TEHRAN — Student hard-liners stormed the British Embassy on Tuesday to protest tough new sanctions against Iran, replacing the Union Jack with the flag of the Islamic republic and chanting “Death to England” as they hurled satellite dishes from the roof of a security building to the ground below.</span></div>
<div><span style="font-size: small;"><br />
德黑兰——学生强硬分子于周二冲击英国使馆以抗议对伊朗施加的新一轮严厉制裁。他们用伊朗国旗取代米字旗，高喊＂英格兰灭亡＂，并将卫星锅从保安大楼顶抛下。</span></div>
<div><span style="font-size: small;"><br />
</span></div>
<div><span style="font-size: small;">Student representatives of the paramilitary Baseej organization set fires on the grounds of the compound and scattered papers that they found, waving banners emblazoned with Islamic slogans.</span></div>
<div><span style="font-size: small;"><br />
民兵组织Baseej的学生代表在使馆院内纵火，将搜获的文件四处抛撒，并挥舞写有伊 斯 兰标语的大旗。</span></div>
<div><span style="font-size: small;"><br />
</span></div>
<div><span style="font-size: small;">There was no indication as to whether any British diplomats or security were inside the embassy.</span></div>
<div><span style="font-size: small;"><br />
尚不清楚是否有英国外交官及保安滞留于馆内。</span></div>
<div><span style="font-size: small;"><br />
</span></div>
<div><span style="font-size: small;">Student paramilitary leaders had called for a demonstration outside the embassy to commemorate the 2010 assassination of Majid Shahriari, a prominent nuclear scientist killed in a car bombing one year ago. Iran’s government blamed the United States and Israel for the killing, but those countries have no embassies in Tehran.</span></div>
<div><span style="font-size: small;"><br />
学生民兵领袖此前召集大众在使馆外示 威，以纪念2010年Majid Shahriari遇刺——杰出核科学家，于去年被汽车炸弹杀害。伊朗政府指责美国和以色列乃幕后黑手，但二国在伊朗没有大使馆。</span></div>
<div><span style="font-size: small;"><br />
</span></div>
<div><span style="font-size: small;">The demonstration also focused on Britain’s decision last week to cut off all financial ties between Iranian and British banks, marking the first time a British government has severed all links to another country’s banking system. The United States also imposed new sanctions on Iran, although it stopped short of imposing sanctions directly on the Central Bank of Iran, a move advocated by some lawmakers.</span></div>
<div><span style="font-size: small;"><br />
这场示 威还针对英国上周作出的关于切断两国间所有银行往来的决定，这是英国首次与其它国家的银行系统断绝一切往来。美国也对伊朗实施了新制裁，尽管有议员提议，但美国未对伊朗央行直接进行制裁。</span></div>
<div><span style="font-size: small;"><br />
</span></div>
<div><span style="font-size: small;">The sanctions are intended to squeeze Iran economically, after new allegations of secret efforts by Tehran to acquire technology to develop nuclear weapons.</span></div>
<div><span style="font-size: small;"><br />
在对伊朗秘密寻求核武研制技术作出新的指控之后，这些制裁旨在向伊朗经济施压。</span></div>
<div><span style="font-size: small;"><br />
</span></div>
<div><span style="font-size: small;">When the students arrived at the embassy, there was no scaffolding or barriers of the type erected by Iranian security during previous demonstrations as a way of keeping the protesters out of the compound.</span></div>
<div><span style="font-size: small;"><br />
当学生们抵达使馆时，伊朗安全部门并未如以往一样设置栏杆或路障，以将群众控制在馆区之外。</span></div>
<div><span style="font-size: small;"><br />
</span></div>
<div><span style="font-size: small;">Riot police, who normally would have been deployed to keep order at the protest, were absent as well. In their place were standard Iranian police forces, equipped with shields.</span></div>
<div><span style="font-size: small;"><br />
平时用来维持示 威秩序的防暴警察也不见踪影，只有一些持盾的普通警察。</span></div>
<div><span style="font-size: small;"><br />
</span></div>
<div><span style="font-size: small;">They did not move to stop the students as they rushed into the embassy compound, or to prevent them from lowering the flag, destroying the satellite dishes or setting fires.</span></div>
<div><span style="font-size: small;"><br />
当学生们冲入使馆大院时，警察并未阻止，对降旗、捣毁卫星锅、纵火等行为皆未加阻拦。</span></div>
<div><span style="font-size: small;"><br />
</span></div>
<div><span style="font-size: small;">But after about an hour, police moved in, removing the students from the compound and telling them to disperse.</span></div>
<div><span style="font-size: small;"><br />
约一小时后，警察才予以干预，将学生们从馆院内驱离，告之退散。</span></div>
</div>
<div> </div>
<div><span style="font-size: x-small;">文章来源：爬山虎</span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.ddeaw.com/2011479.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C语言指针使用经验总结之悬垂指针</title>
		<link>http://www.ddeaw.com/2011477.html</link>
		<comments>http://www.ddeaw.com/2011477.html#comments</comments>
		<pubDate>Tue, 29 Nov 2011 12:20:14 +0000</pubDate>
		<dc:creator>学习网</dc:creator>
				<category><![CDATA[玩转软件]]></category>

		<guid isPermaLink="false">http://www.ddeaw.com/?p=477</guid>
		<description><![CDATA[　如果将作用域A的变量地址赋给在作用域B的变量指针。当A中相应变量的生存周期结束后，会使B的指针出现“悬垂指针”的现象（悬垂指针指向曾经存放对象的内存，但该对象已经不再存在了。悬垂指针往往导致程序错误，而且很难检测出来。)如下代码： 　　#include&#60;iostream&#62; 　　#include &#60;windows.h&#62; 　　using namespace std; 　　int *p=NULL; 　　void fun() 　　{ 　　int i=10; 　　p=&#38;i; 　　} 　　void main() 　　{ 　　fun(); 　　cout&#60;&#60;"*p= "&#60;&#60;*p&#60;&#60;endl; 　　Sleep(1000); 　　cout&#60;&#60;“一秒钟后，fun()中的i变量的存储空间被释放,p所指对象的值为:"&#60;&#60;endl&#60;&#60;"*p= "&#60;&#60;*p&#60;&#60;endl; 　　} 　　输出为： 　　*p= 10 　　一秒钟后，fun()中的i变量的存储空间被释放,p所指对象的值为: 　　*p= 1245056 　　Press any key to continue 　　可见，fun()运行完一秒钟后，p成为悬垂指针。]]></description>
			<content:encoded><![CDATA[<p>　如果将作用域A的变量地址赋给在作用域B的变量指针。当A中相应变量的生存周期结束后，会使B的指针出现“悬垂指针”的现象（悬垂指针指向曾经存放对象的内存，但该对象已经不再存在了。悬垂指针往往导致程序错误，而且很难检测出来。)如下代码：</p>
<p>　　#include&lt;iostream&gt;</p>
<p>　　#include &lt;windows.h&gt;</p>
<p>　　using namespace std;</p>
<p>　　int *p=NULL;</p>
<p>　　void fun()</p>
<p>　　{</p>
<p>　　int i=10;</p>
<p>　　p=&amp;i;</p>
<p>　　}</p>
<p>　　void main()</p>
<p>　　{</p>
<p>　　fun();</p>
<p>　　cout&lt;&lt;"*p= "&lt;&lt;*p&lt;&lt;endl;</p>
<p>　　Sleep(1000);</p>
<p>　　cout&lt;&lt;“一秒钟后，fun()中的i变量的存储空间被释放,p所指对象的值为:"&lt;&lt;endl&lt;&lt;"*p= "&lt;&lt;*p&lt;&lt;endl;</p>
<p>　　}</p>
<p>　　输出为：</p>
<p>　　*p= 10</p>
<p>　　一秒钟后，fun()中的i变量的存储空间被释放,p所指对象的值为:</p>
<p>　　*p= 1245056</p>
<p>　　Press any key to continue</p>
<p>　　可见，fun()运行完一秒钟后，p成为悬垂指针。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ddeaw.com/2011477.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C语言的const关键字与指针搭配使用</title>
		<link>http://www.ddeaw.com/2011475.html</link>
		<comments>http://www.ddeaw.com/2011475.html#comments</comments>
		<pubDate>Tue, 29 Nov 2011 12:19:41 +0000</pubDate>
		<dc:creator>学习网</dc:creator>
				<category><![CDATA[玩转软件]]></category>

		<guid isPermaLink="false">http://www.ddeaw.com/?p=475</guid>
		<description><![CDATA[　C语言的const关键字与指针搭配使用，const是C语言中保留的一个关键字，它用来限定一个变量是只读的，即不可变的。程序中使用const可以在一定程度上提高程序的健壮性，但是程序中使用过多的const，可能在对代码的阅读时增加一定的难度。 　　(1)用const修饰一般变量 　　注意在C语言中，用const修饰的变量必须在声明时进行初始化(用来修饰函数的形参除外); 　　如: 　　const int n; 这种声明方式是错误的 　　const int n=5; 正确 　　void fun(const int n); 正确 　　const char a; 错误 　　char * const p; 错误 　　const char *p;正确(注意这种为什么是正确的),因为这里const是修饰p指向的变量,而不是指针变量p本身 　　一旦一个变量被const修饰后，在程序中除初始化外对这个变量进行的赋值都是错误的。 　　如: 　　const int n=5; 　　n=3; 错误 　　(2)const与指针搭配使用 　　首先必须弄清楚两个基础概念:指针常量和常量指针 　　指针常量:即指针本身的值是不可改变的，而指针指向的变量的值是可以改变的; 　　常量指针:即指针指向的变量的值是不可改变的，而指针本身的值是可以改变的; 　　可以这样去理解:因为指针本身也是一个变量，只不过指针存放的是地址而已，而一旦指针变成了常量，即指针本身的值是不可变的，此时指针只能指向固定的存储单元;指针一般会指向一个变量，如果该变量成为一个常量，那么该变量的值就不能被修改，即常量指针，指针指向的是一个不可变的变量。 　　如: 　　1 int a=3;2 const int *p=&#38;a;3 int const *p1=&#38;a;4 *p=4;5 a=4; 第2行和第3行是等价的; 　　第四行是错误的，因为用const限定p指向的变量的值是不可修改的，即不可通过指针p去修改变量a的值; [...]]]></description>
			<content:encoded><![CDATA[<p>　C语言的const关键字与指针搭配使用，const是C语言中保留的一个关键字，它用来限定一个变量是只读的，即不可变的。程序中使用const可以在一定程度上提高程序的健壮性，但是程序中使用过多的const，可能在对代码的阅读时增加一定的难度。<br />
　　(1)用const修饰一般变量<br />
　　注意在C语言中，用const修饰的变量必须在声明时进行初始化(用来修饰函数的形参除外);<br />
　　如:<br />
　　const int n; 这种声明方式是错误的<br />
　　const int n=5; 正确<br />
　　void fun(const int n); 正确<br />
　　const char a; 错误<br />
　　char * const p; 错误<br />
　　const char *p;正确(注意这种为什么是正确的),因为这里const是修饰p指向的变量,而不是指针变量p本身<br />
　　一旦一个变量被const修饰后，在程序中除初始化外对这个变量进行的赋值都是错误的。<br />
　　如:<br />
　　const int n=5;<br />
　　n=3; 错误<br />
　　(2)const与指针搭配使用<br />
　　首先必须弄清楚两个基础概念:指针常量和常量指针<br />
　　指针常量:即指针本身的值是不可改变的，而指针指向的变量的值是可以改变的;<br />
　　常量指针:即指针指向的变量的值是不可改变的，而指针本身的值是可以改变的;<br />
　　可以这样去理解:因为指针本身也是一个变量，只不过指针存放的是地址而已，而一旦指针变成了常量，即指针本身的值是不可变的，此时指针只能指向固定的存储单元;指针一般会指向一个变量，如果该变量成为一个常量，那么该变量的值就不能被修改，即常量指针，指针指向的是一个不可变的变量。<br />
　　如:<br />
　　1 int a=3;2 const int *p=&amp;a;3 int const *p1=&amp;a;4 *p=4;5 a=4; 第2行和第3行是等价的;<br />
　　第四行是错误的，因为用const限定p指向的变量的值是不可修改的，即不可通过指针p去修改变量a的值;<br />
　　第五行是正确的，因为a本身没用const进行修饰，即a本身的值是可以修改的.<br />
　　1 int a=1; 2 int b=2; 3 const int *p; 4 int const *p1; 5 int * const p2; 6 int * const p3=&amp;b 7 p=&amp;a; 8 p1=&amp;a; 9 p2=&amp;b;10 p3=&amp;a; 第3、4、7、8行是正确的;<br />
　　第5行是错误的，第6行是正确的，第10行是错误的，因为const在'*'后面，表示是来修饰指针变量本身，因此在声明时必须进行初始化，并且在后面不能再指向其它的变量.<br />
　　#include&lt;stdio.h&gt;int main(void){ const int a=3; int *pa=&amp;a; *pa=4; printf("%d\n",*pa); printf("%d\n",a); return 0;}编译结果:e:\c++\test\test.c(6) : warning C4090: 'initializing' : different 'const' qualifiers输出结果是: 4<br />
　　4<br />
　　从这里可以看出a的值被修改了,在C语言中用const去修饰整形变量a，即a的值是不可变的，不能显示地通过赋值语句去改变a的值，<br />
　　但是不代表在程序中不能通过其它方法来修改这个值。<br />
　　总结:(1)在C语言中用const去修饰一个变量，表示这个变量是只读的，不可通过显式的调用a去修改a的值，并且此时a仍然是一个变 量，不能等同于常量;<br />
　　(2)要注意const在声明变量时所处的位置，位置不同，在意义上可能会有很大的不同。<br />
　　如果const在'*'左边，则表示指针指向的变量的值不可变;<br />
　　如果const在'*'右边，则表示指针的值是不可变的;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ddeaw.com/2011475.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C语言右左法则&#8212;-复杂指针解析</title>
		<link>http://www.ddeaw.com/2011471.html</link>
		<comments>http://www.ddeaw.com/2011471.html#comments</comments>
		<pubDate>Tue, 29 Nov 2011 12:13:28 +0000</pubDate>
		<dc:creator>学习网</dc:creator>
				<category><![CDATA[玩转软件]]></category>
		<category><![CDATA[C语言]]></category>

		<guid isPermaLink="false">http://www.ddeaw.com/?p=471</guid>
		<description><![CDATA[　因为C语言所有复杂的指针声明，都是由各种声明嵌套构成的。如何解读复杂指针声明呢？右左法则是一个既着名又常用的方法。不过，右左法 　　则其实并不是C标准里面的内容，它是从C标准的声明规定中归纳出来的方法。C标准的声明规则，是用来解决如何创建声明的，而右左法则是用 　　来解决如何辩识一个声明的，两者可以说是相反的。右左法则的英文原文是这样说的： 　　The right－left rule: Start reading the declaration from the innermost parentheses, go right, and then go left. When you 　　encounter parentheses, the direction should be reversed. Once everything in the parentheses has been 　　parsed, jump out of it. Continue till the whole declaration has been parsed. 　　这段英文的翻译如下： 　　右左法则：首先从最里面的圆括号看起，然后往右看，再往左看。每当遇到圆括号时，就应该掉转阅读方向。一旦解析完圆括号里面所有的东西，就跳出圆括号。重复这个过程直到整个声明解析完毕。 　　笔者要对这个法则进行一个小小的修正，应该是从未定义的标识符开始阅读，而不是从括号读起，之所以是未定义的标识符，是因为一个声明里面可能有多个标识符，但未定义的标识符只会有一个。 　　现在通过一些例子来讨论右左法则的应用，先从最简单的开始，逐步加深： 　　int (*func)(int [...]]]></description>
			<content:encoded><![CDATA[<p>　因为C语言所有复杂的指针声明，都是由各种声明嵌套构成的。如何解读复杂指针声明呢？右左法则是一个既着名又常用的方法。不过，右左法</p>
<p>　　则其实并不是C标准里面的内容，它是从C标准的声明规定中归纳出来的方法。C标准的声明规则，是用来解决如何创建声明的，而右左法则是用</p>
<p>　　来解决如何辩识一个声明的，两者可以说是相反的。右左法则的英文原文是这样说的：</p>
<p>　　The right－left rule: Start reading the declaration from the innermost parentheses, go right, and then go left. When you</p>
<p>　　encounter parentheses, the direction should be reversed. Once everything in the parentheses has been</p>
<p>　　parsed, jump out of it. Continue till the whole declaration has been parsed.</p>
<p>　　这段英文的翻译如下：</p>
<p>　　右左法则：首先从最里面的圆括号看起，然后往右看，再往左看。每当遇到圆括号时，就应该掉转阅读方向。一旦解析完圆括号里面所有的东西，就跳出圆括号。重复这个过程直到整个声明解析完毕。</p>
<p>　　笔者要对这个法则进行一个小小的修正，应该是从未定义的标识符开始阅读，而不是从括号读起，之所以是未定义的标识符，是因为一个声明里面可能有多个标识符，但未定义的标识符只会有一个。</p>
<p>　　现在通过一些例子来讨论右左法则的应用，先从最简单的开始，逐步加深：</p>
<p>　　int (*func)(int *p);</p>
<p>　　首先找到那个未定义的标识符，就是func，它的外面有一对圆括号，而且左边是一个*号，这说明func是一个指针，然后跳出这个圆括号，先看</p>
<p>　　右边，也是一个圆括号，这说明(*func)是一个函数，而func是一个指向这类函数的指针，就是一个函数指针，这类函数具有int*类型的形参，返回值类型是 int。</p>
<p>　　int (*func)(int *p, int (*f)(int*));</p>
<p>　　func被一对括号包含，且左边有一个*号，说明func是一个指针，跳出括号，右边也有个括号，那么func是一个指向函数的指针，这类函数具有int *和int (*)(int*)这样的形参，返回值为int类型。再来看一看func的形参int (*f)(int*)，类似前面的解释，f也是一个函数指针，指向的函数具有int*类型的形参，返回值为int。</p>
<p>　　int (*func[5])(int *p);</p>
<p>　　func右边是一个[]运算符，说明func是一个具有5个元素的数组，func的左边有一个*，说明func的元素是指针，要注意这里的*不是修饰 func的，而是修饰func[5]的，原因是[]运算符优先级比*高，func先跟[]结合，因此*修饰的是func[5]。跳出这个括号，看右边，也是一对圆括号，说明func数组的元素是函数类型的指针，它所指向的函数具有int*类型的形参，返回值类型为int。</p>
<p>　　int (*(*func)[5])(int *p);</p>
<p>　　func被一个圆括号包含，左边又有一个*，那么func是一个指针，跳出括号，右边是一个[]运算符号，说明func是一个指向数组的指针，现在往左看，左边有一个*号，说明这个数组的元素是指针，再跳出括号，右边又有一个括号，说明这个数组的元素是指向函数的指针。总结一下，就是：func是一个指向数组的指针，这个数组的元素是函数指针，这些指针指向具有int*形参，返回值为int类型的函数。</p>
<p>　　int (*(*func)(int *p))[5];</p>
<p>　　func是一个函数指针，这类函数具有int*类型的形参，返回值是指向数组的指针，所指向的数组的元素是具有5个int元素的数组。</p>
<p>　　要注意有些复杂指针声明是非法的，例如：</p>
<p>　　int func(void) [5];</p>
<p>　　func是一个返回值为具有5个int元素的数组的函数。但C语言的函数返回值不能为数组，这是因为如果允许函数返回值为数组，那么接收这个数组的内容的东西，也必须是一个数组，但C语言的数组名是一个右值，它不能作为左值来接收另一个数组，因此函数返回值不能为数组。</p>
<p>　　int func[5](void);</p>
<p>　　func是一个具有5个元素的数组，这个数组的元素都是函数。这也是非法的，因为数组的元素除了类型必须一样外，每个元素所占用的内存空间也必须相同，显然函数是无法达到这个要求的，即使函数的类型一样，但函数所占用的空间通常是不相同的。</p>
<p>　　作为练习，下面列几个复杂指针声明给读者自己来解析。</p>
<p>　　int (*(*func)[5][6])[7][8];</p>
<p>　　int (*(*(*func)(int *))[5])(int *);</p>
<p>　　int (*(*func[7][8][9])(int*))[5];</p>
<p>　　实际当中，需要声明一个复杂指针时，如果把整个声明写成上面所示的形式，对程序可读性是一大损害。应该用typedef来对声明逐层</p>
<p>　　分解，增强可读性，例如对于声明：</p>
<p>　　int (*(*func)(int *p))[5];</p>
<p>　　可以这样分解：</p>
<p>　　typedef  int (*PARA)[5];</p>
<p>　　typedef PARA (*func)(int *);</p>
<p>　　这样就容易看得多了。</p>
<p>　　答案，同时给出用typedef的分解方法：</p>
<p>　　int (*(*func)[5][6])[7][8];</p>
<p>　　func是一个指向数组的指针，这类数组的元素是一个具有5X6个int元素的二维数组，而这个二维数组的元素又是一个二维数组。</p>
<p>　　typedef int (*PARA)[7][8];</p>
<p>　　typedef PARA (*func)[5][6];</p>
<p>　　int (*(*(*func)(int *))[5])(int *);</p>
<p>　　func是一个函数指针，这类函数的返回值是一个指向数组的指针，所指向数组的元素也是函数指针，指向的函数具有int*形参，返回值为int。</p>
<p>　　typedef int (*PARA1)(int*);</p>
<p>　　typedef PARA1 (*PARA2)[5];</p>
<p>　　typedef PARA2 (*func)(int*);</p>
<p>　　int (*(*func[7][8][9])(int*))[5];</p>
<p>　　func是一个数组，这个数组的元素是函数指针，这类函数具有int*的形参，返回值是指向数组的指针，所指向的数组的元素是具有5个int元素</p>
<p>　　的数组。</p>
<p>　　typedef int (*PARA1)[5];</p>
<p>　　typedef PARA1 (*PARA2)(int*);</p>
<p>　　typedef PARA2 func[7][8][9];</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ddeaw.com/2011471.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C语言文件操作函数总结</title>
		<link>http://www.ddeaw.com/2011469.html</link>
		<comments>http://www.ddeaw.com/2011469.html#comments</comments>
		<pubDate>Tue, 29 Nov 2011 12:12:14 +0000</pubDate>
		<dc:creator>学习网</dc:creator>
				<category><![CDATA[玩转软件]]></category>
		<category><![CDATA[C语言]]></category>

		<guid isPermaLink="false">http://www.ddeaw.com/?p=469</guid>
		<description><![CDATA[　clearerr（清除文件流的错误旗标） 　　相关函数 feof 　　表头文件 #include&#60;stdio.h&#62; 　　定义函数 void clearerr(FILE * stream); 　　函数说明 clearerr（）清除参数stream指定的文件流所使用的错误旗标。 　　返回值 　　fclose（关闭文件） 　　相关函数 close，fflush，fopen，setbuf 　　表头文件 #include&#60;stdio.h&#62; 　　定义函数 int fclose(FILE * stream); 　　函数说明 fclose()用来关闭先前fopen()打开的文件。此动作会让缓冲区内的数据写入文件中，并释放系统所提供的文件资源。 　　返回值 若关文件动作成功则返回0，有错误发生时则返回EOF并把错误代码存到errno。 　　错误代码 EBADF表示参数stream非已打开的文件。 　　范例 请参考fopen（）。 　　fdopen（将文件描述词转为文件指针） 　　相关函数 fopen，open，fclose 　　表头文件 #include&#60;stdio.h&#62; 　　定义函数 FILE * fdopen(int fildes,const char * mode); 　　函数说明 fdopen()会将参数fildes 的文件描述词，转换为对应的文件指针后返回。参数mode 字符串则代表着文件指针的流形态，此形态必须和原先文件描述词读写模式相同。关于mode 字符串格式请参考fopen()。 　　返回值 转换成功时返回指向该流的文件指针。失败则返回NULL，并把错误代码存在errno中。 　　范例 　　#include&#60;stdio.h&#62; 　　main() 　　{ [...]]]></description>
			<content:encoded><![CDATA[<p>　clearerr（清除文件流的错误旗标）<br />
　　相关函数 feof<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 void clearerr(FILE * stream);<br />
　　函数说明 clearerr（）清除参数stream指定的文件流所使用的错误旗标。<br />
　　返回值<br />
　　fclose（关闭文件）<br />
　　相关函数 close，fflush，fopen，setbuf<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 int fclose(FILE * stream);<br />
　　函数说明 fclose()用来关闭先前fopen()打开的文件。此动作会让缓冲区内的数据写入文件中，并释放系统所提供的文件资源。<br />
　　返回值 若关文件动作成功则返回0，有错误发生时则返回EOF并把错误代码存到errno。<br />
　　错误代码 EBADF表示参数stream非已打开的文件。<br />
　　范例 请参考fopen（）。<br />
　　fdopen（将文件描述词转为文件指针）<br />
　　相关函数 fopen，open，fclose<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 FILE * fdopen(int fildes,const char * mode);<br />
　　函数说明 fdopen()会将参数fildes 的文件描述词，转换为对应的文件指针后返回。参数mode 字符串则代表着文件指针的流形态，此形态必须和原先文件描述词读写模式相同。关于mode 字符串格式请参考fopen()。<br />
　　返回值 转换成功时返回指向该流的文件指针。失败则返回NULL，并把错误代码存在errno中。</p>
<p>　　范例<br />
　　#include&lt;stdio.h&gt;<br />
　　main()<br />
　　{<br />
　　FILE * fp =fdopen(0,”w+”);<br />
　　fprintf(fp,”%s ”,”hello!”);<br />
　　fclose(fp);<br />
　　}<br />
　　执行 hello!<br />
　　feof（检查文件流是否读到了文件尾）<br />
　　相关函数 fopen，fgetc，fgets，fread<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 int feof(FILE * stream);<br />
　　函数说明 feof()用来侦测是否读取到了文件尾，尾数stream为fopen（）所返回之文件指针。如果已到文件尾则返回非零值，其他情况返回0。<br />
　　返回值 返回非零值代表已到达文件尾。<br />
　　fflush（更新缓冲区）<br />
　　相关函数 write，fopen，fclose，setbuf<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 int fflush(FILE* stream);<br />
　　函数说明 fflush()会强迫将缓冲区内的数据写回参数stream指定的文件中。如果参数stream为NULL，fflush()会将所有打开的文件数据更新。<br />
　　返回值 成功返回0，失败返回EOF，错误代码存于errno中。<br />
　　错误代码 EBADF 参数stream 指定的文件未被打开，或打开状态为只读。其它错误代码参考write（）。<br />
　　fgetc（由文件中读取一个字符）<br />
　　相关函数 open，fread，fscanf，getc<br />
　　表头文件 include&lt;stdio.h&gt;<br />
　　定义函数 nt fgetc(FILE * stream);<br />
　　函数说明 fgetc()从参数stream所指的文件中读取一个字符。若读到文件尾而无数据时便返回EOF。<br />
　　返回值 getc()会返回读取到的字符，若返回EOF则表示到了文件尾。</p>
<p>　　范例<br />
　　#include&lt;stdio.h&gt;<br />
　　main()<br />
　　{<br />
　　FILE *fp;<br />
　　int c;<br />
　　fp=fopen(“exist”,”r”);<br />
　　while((c=fgetc(fp))!=EOF)<br />
　　printf(“%c”,c);<br />
　　fclose(fp);<br />
　　}<br />
　　fgets（由文件中读取一字符串）<br />
　　相关函数 open，fread，fscanf，getc<br />
　　表头文件 include&lt;stdio.h&gt;<br />
　　定义函数 har * fgets(char * s,int size,FILE * stream);<br />
　　函数说明 fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间，直到出现换行字符、读到文件尾或是已读了size-1个字符为止，最后会加上NULL作为字符串结束。<br />
　　返回值 gets()若成功则返回s指针，返回NULL则表示有错误发生。<br />
　　范例<br />
　　#include&lt;stdio.h&gt;<br />
　　main()<br />
　　{<br />
　　char s[80];<br />
　　fputs(fgets(s,80,stdin),stdout);<br />
　　}<br />
　　执行 this is a test /*输入*/<br />
　　this is a test /*输出*/<br />
　　fileno（返回文件流所使用的文件描述词）<br />
　　相关函数 open，fopen<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 int fileno(FILE * stream);<br />
　　函数说明 fileno()用来取得参数stream指定的文件流所使用的文件描述词。<br />
　　返回值 返回文件描述词。</p>
<p>　　范例<br />
　　#include&lt;stdio.h&gt;<br />
　　main()<br />
　　{<br />
　　FILE * fp;<br />
　　int fd;<br />
　　fp=fopen(“/etc/passwd”,”r”);<br />
　　fd=fileno(fp);<br />
　　printf(“fd=%d ”,fd);<br />
　　fclose(fp);<br />
　　}<br />
　　执行 fd=3<br />
　　fopen（打开文件）<br />
　　相关函数 open，fclose<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 FILE * fopen(const char * path,const char * mode);<br />
　　函数说明 参数path字符串包含欲打开的文件路径及文件名，参数mode字符串则代表着流形态。<br />
　　mode有下列几种形态字符串:<br />
　　r 打开只读文件，该文件必须存在。<br />
　　r+ 打开可读写的文件，该文件必须存在。<br />
　　w 打开只写文件，若文件存在则文件长度清为0，即该文件内容会消失。若文件不存在则建立该文件。<br />
　　w+ 打开可读写文件，若文件存在则文件长度清为零，即该文件内容会消失。若文件不存在则建立该文件。<br />
　　a 以附加的方式打开只写文件。若文件不存在，则会建立该文件，如果文件存在，写入的数据会被加到文件尾，即文件原先的内容会被保留。<br />
　　a+ 以附加方式打开可读写的文件。若文件不存在，则会建立该文件，如果文件存在，写入的数据会被加到文件尾后，即文件原先的内容会被保留。<br />
　　上述的形态字符串都可以再加一个b字符，如rb、w+b或ab＋等组合，加入b 字符用来告诉函数库打开的文件为二进制文件，而非纯文字文件。不过在POSIX系统，包含Linux都会忽略该字符。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限，此文件权限也会参考umask值。<br />
　　返回值 文件顺利打开后，指向该流的文件指针就会被返回。若果文件打开失败则返回NULL，并把错误代码存在errno 中。<br />
　　附加说明 一般而言，开文件后会作一些文件读取或写入的动作，若开文件失败，接下来的读写动作也无法顺利进行，所以在fopen()后请作错误判断及处理。</p>
<p>　　范例<br />
　　#include&lt;stdio.h&gt;<br />
　　main()<br />
　　{<br />
　　FILE * fp;<br />
　　fp=fopen(“noexist”,”a+”);<br />
　　if(fp= =NULL) return;<br />
　　fclose(fp);<br />
　　}<br />
　　fputc（将一指定字符写入文件流中）<br />
　　相关函数 fopen，fwrite，fscanf，putc<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 int fputc(int c,FILE * stream);<br />
　　函数说明 fputc 会将参数c 转为unsigned char 后写入参数stream 指定的文件中。<br />
　　返回值 fputc()会返回写入成功的字符，即参数c。若返回EOF则代表写入失败。<br />
　　范例<br />
　　#include&lt;stdio.h&gt;<br />
　　main()<br />
　　{<br />
　　FILE * fp;<br />
　　char a[26]=”abcdefghijklmnopqrstuvwxyz”;<br />
　　int i;<br />
　　fp= fopen(“noexist”,”w”);<br />
　　for(i=0;i&lt;26;i++)<br />
　　fputc(a,fp);<br />
　　fclose(fp);<br />
　　}<br />
　　fputs（将一指定的字符串写入文件内）<br />
　　相关函数 fopen，fwrite，fscanf，fputc，putc<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 int fputs(const char * s,FILE * stream);<br />
　　函数说明 fputs()用来将参数s所指的字符串写入到参数stream所指的文件内。<br />
　　返回值 若成功则返回写出的字符个数，返回EOF则表示有错误发生。<br />
　　范例 请参考fgets（）。<br />
　　fread（从文件流读取数据）<br />
　　相关函数 fopen，fwrite，fseek，fscanf<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);<br />
　　函数说明 fread()用来从文件流中读取数据。参数stream为已打开的文件指针，参数ptr 指向欲存放读取进来的数据空间，读取的字符数以参数size*nmemb来决定。Fread()会返回实际读取到的nmemb数目，如果此值比参数nmemb 来得小，则代表可能读到了文件尾或有错误发生，这时必须用feof()或ferror()来决定发生什么情况。<br />
　　返回值 返回实际读取到的nmemb数目。</p>
<p>　　附加说明<br />
　　范例<br />
　　#include&lt;stdio.h&gt;<br />
　　#define nmemb 3<br />
　　struct test<br />
　　{<br />
　　char name[20];<br />
　　int size;<br />
　　}s[nmemb];<br />
　　int main(){<br />
　　FILE * stream;<br />
　　int i;<br />
　　stream = fopen(“/tmp/fwrite”,”r”);<br />
　　fread(s,sizeof(struct test),nmemb,stream);<br />
　　fclose(stream);<br />
　　for(i=0;i&lt;nmemb;i++)<br />
　　printf(“name[%d]=%-20s:size[%d]=%d ”,i,s.name,i,s.size);<br />
　　}<br />
　　执行<br />
　　name[0]=Linux! size[0]=6<br />
　　name[1]=FreeBSD! size[1]=8<br />
　　name[2]=Windows2000 size[2]=11<br />
　　freopen（打开文件）<br />
　　相关函数 fopen，fclose<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 FILE * freopen(const char * pathconst char * mode,FILE * stream);<br />
　　函数说明 参数path字符串包含欲打开的文件路径及文件名，参数mode请参考fopen()说明。参数stream为已打开的文件指针。Freopen()会将原stream所打开的文件流关闭，然后打开参数path的文件。<br />
　　返回值 文件顺利打开后，指向该流的文件指针就会被返回。如果文件打开失败则返回NULL，并把错误代码存在errno 中。</p>
<p>　　范例<br />
　　#include&lt;stdio.h&gt;<br />
　　main()<br />
　　{<br />
　　FILE * fp;<br />
　　fp=fopen(“/etc/passwd”,”r”);<br />
　　fp=freopen(“/etc/group”,”r”,fp);<br />
　　fclose(fp);<br />
　　}<br />
　　fseek（移动文件流的读写位置）<br />
　　相关函数 rewind，ftell，fgetpos，fsetpos，lseek<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 int fseek(FILE * stream,long offset,int whence);<br />
　　函数说明 fseek()用来移动文件流的读写位置。参数stream为已打开的文件指针，参数offset为根据参数whence来移动读写位置的位移数。<br />
　　参数 whence为下列其中一种:<br />
　　SEEK_SET从距文件开头offset位移量为新的读写位置。SEEK_CUR 以目前的读写位置往后增加offset个位移量。<br />
　　SEEK_END将读写位置指向文件尾后再增加offset个位移量。<br />
　　当whence值为SEEK_CUR 或SEEK_END时，参数offset允许负值的出现。<br />
　　下列是较特别的使用方式:<br />
　　1) 欲将读写位置移动到文件开头时:fseek(FILE *stream,0,SEEK_SET);<br />
　　2) 欲将读写位置移动到文件尾时:fseek(FILE *stream,0,0SEEK_END);<br />
　　返回值 当调用成功时则返回0，若有错误则返回-1，errno会存放错误代码。<br />
　　附加说明 fseek()不像lseek()会返回读写位置，因此必须使用ftell()来取得目前读写的位置。</p>
<p>　　范例<br />
　　#include&lt;stdio.h&gt;<br />
　　main()<br />
　　{<br />
　　FILE * stream;<br />
　　long offset;<br />
　　fpos_t pos;<br />
　　stream=fopen(“/etc/passwd”,”r”);<br />
　　fseek(stream,5,SEEK_SET);<br />
　　printf(“offset=%d ”,ftell(stream));<br />
　　rewind(stream);<br />
　　fgetpos(stream,&amp;pos);<br />
　　printf(“offset=%d ”,pos);<br />
　　pos=10;<br />
　　fsetpos(stream,&amp;pos);<br />
　　printf(“offset = %d ”,ftell(stream));<br />
　　fclose(stream);<br />
　　}<br />
　　执行 offset = 5<br />
　　offset =0<br />
　　offset=10<br />
　　ftell（取得文件流的读取位置）<br />
　　相关函数 fseek，rewind，fgetpos，fsetpos<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 long ftell(FILE * stream);<br />
　　函数说明 ftell()用来取得文件流目前的读写位置。参数stream为已打开的文件指针。<br />
　　返回值 当调用成功时则返回目前的读写位置，若有错误则返回-1，errno会存放错误代码。<br />
　　错误代码 EBADF 参数stream无效或可移动读写位置的文件流。<br />
　　范例 参考fseek()。<br />
　　fwrite（将数据写至文件流）<br />
　　相关函数 fopen，fread，fseek，fscanf<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);<br />
　　函数说明 fwrite()用来将数据写入文件流中。参数stream为已打开的文件指针，参数ptr 指向欲写入的数据地址，总共写入的字符数以参数size*nmemb来决定。Fwrite()会返回实际写入的nmemb数目。<br />
　　返回值 返回实际写入的nmemb数目。</p>
<p>　　范例<br />
　　#include&lt;stdio.h&gt;<br />
　　#define set_s (x,y) {strcoy(s[x].name,y);s[x].size=strlen(y);}<br />
　　#define nmemb 3<br />
　　struct test<br />
　　{<br />
　　char name[20];<br />
　　int size;<br />
　　}s[nmemb];<br />
　　main()<br />
　　{<br />
　　FILE * stream;<br />
　　set_s(0,”Linux!”);<br />
　　set_s(1,”FreeBSD!”);<br />
　　set_s(2,”Windows2000.”);<br />
　　stream=fopen(“/tmp/fwrite”,”w”);<br />
　　fwrite(s,sizeof(struct test),nmemb,stream);<br />
　　fclose(stream);<br />
　　}<br />
　　执行 参考fread（）。<br />
　　getc（由文件中读取一个字符）<br />
　　相关函数 read，fopen，fread，fgetc<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 int getc(FILE * stream);<br />
　　函数说明 getc()用来从参数stream所指的文件中读取一个字符。若读到文件尾而无数据时便返回EOF。虽然getc()与fgetc()作用相同，但getc()为宏定义，非真正的函数调用。<br />
　　返回值 getc()会返回读取到的字符，若返回EOF则表示到了文件尾。<br />
　　范例 参考fgetc()。<br />
　　getchar（由标准输入设备内读进一字符）<br />
　　相关函数 fopen，fread，fscanf，getc<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 int getchar(void);<br />
　　函数说明 getchar()用来从标准输入设备中读取一个字符。然后将该字符从unsigned char转换成int后返回。<br />
　　返回值 getchar()会返回读取到的字符，若返回EOF则表示有错误发生。<br />
　　附加说明 getchar()非真正函数，而是getc(stdin)宏定义。<br />
　　范例<br />
　　#include&lt;stdio.h&gt;<br />
　　main()<br />
　　{<br />
　　FILE * fp;<br />
　　int c,i;<br />
　　for(i=0li&lt;5;i++)<br />
　　{<br />
　　c=getchar();<br />
　　putchar(c);<br />
　　}<br />
　　}<br />
　　执行 1234 /*输入*/<br />
　　1234 /*输出*/<br />
　　gets（由标准输入设备内读进一字符串）<br />
　　相关函数 fopen，fread，fscanf，fgets<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 char * gets(char *s);<br />
　　函数说明 gets()用来从标准设备读入字符并存到参数s所指的内存空间，直到出现换行字符或读到文件尾为止，最后加上NULL作为字符串结束。<br />
　　返回值 gets()若成功则返回s指针，返回NULL则表示有错误发生。<br />
　　附加说明 由于gets()无法知道字符串s的大小，必须遇到换行字符或文件尾才会结束输入，因此容易造成缓冲溢出的安全性问题。建议使用fgets()取代。</p>
<p>　　范例 参考fgets()<br />
　　mktemp（产生唯一的临时文件名）<br />
　　相关函数 tmpfile<br />
　　表头文件 #include&lt;stdlib.h&gt;<br />
　　定义函数 char * mktemp(char * template);<br />
　　函数说明 mktemp()用来产生唯一的临时文件名。参数template所指的文件名称字符串中最后六个字符必须是XXXXXX。产生后的文件名会借字符串指针返回。<br />
　　返回值 文件顺利打开后，指向该流的文件指针就会被返回。如果文件打开失败则返回NULL，并把错误代码存在errno中。<br />
　　附加说明 参数template所指的文件名称字符串必须声明为数组，如:<br />
　　char template[ ]=”template-XXXXXX”；<br />
　　不可用char * template=”template-XXXXXX”；<br />
　　范例<br />
　　#include&lt;stdlib.h&gt;<br />
　　main()<br />
　　{<br />
　　char template[ ]=”template-XXXXXX”;<br />
　　mktemp(template);<br />
　　printf(“template=%s ”,template);<br />
　　}<br />
　　putc（将一指定字符写入文件中）<br />
　　相关函数 fopen，fwrite，fscanf，fputc<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 int putc(int c,FILE * stream);<br />
　　函数说明 putc()会将参数c转为unsigned char后写入参数stream指定的文件中。虽然putc()与fputc()作用相同，但putc()为宏定义，非真正的函数调用。<br />
　　返回值 putc()会返回写入成功的字符，即参数c。若返回EOF则代表写入失败。　　范例 参考fputc（）。<br />
　　putchar（将指定的字符写到标准输出设备）<br />
　　相关函数 fopen，fwrite，fscanf，fputc<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 int putchar (int c);<br />
　　函数说明 putchar()用来将参数c字符写到标准输出设备。<br />
　　返回值 putchar()会返回输出成功的字符，即参数c。若返回EOF则代表输出失败。<br />
　　附加说明 putchar()非真正函数，而是putc(c，stdout)宏定义。<br />
　　范例 参考getchar()。<br />
　　rewind（重设文件流的读写位置为文件开头）<br />
　　相关函数 fseek，ftell，fgetpos，fsetpos<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 void rewind(FILE * stream);<br />
　　函数说明 rewind()用来把文件流的读写位置移至文件开头。参数stream为已打开的文件指针。此函数相当于调用fseek(stream,0,SEEK_SET)。<br />
　　返回值</p>
<p>　　范例 参考fseek()<br />
　　setbuf（设置文件流的缓冲区）<br />
　　相关函数 setbuffer，setlinebuf，setvbuf<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 void setbuf(FILE * stream,char * buf);<br />
　　函数说明 在打开文件流后，读取内容之前，调用setbuf()可以用来设置文件流的缓冲区。参数stream为指定的文件流，参数buf指向自定的缓冲区起始地址。如果参数buf为NULL指针，则为无缓冲IO。Setbuf()相当于调用:setvbuf(stream,buf,buf?_IOFBF:_IONBF,BUFSIZ)<br />
　　返回值<br />
　　setbuffer（设置文件流的缓冲区）<br />
　　相关函数 setlinebuf，setbuf，setvbuf<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 void setbuffer(FILE * stream,char * buf,size_t size);<br />
　　函数说明 在打开文件流后，读取内容之前，调用setbuffer()可用来设置文件流的缓冲区。<br />
　　参数stream为指定的文件流，参数buf指向自定的缓冲区起始地址，参数size为缓冲区大小。<br />
　　返回值<br />
　　setlinebuf（设置文件流为线性缓冲区）<br />
　　相关函数 setbuffer，setbuf，setvbuf<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 void setlinebuf(FILE * stream);<br />
　　函数说明 setlinebuf()用来设置文件流以换行为依据的无缓冲IO。相当于调用:setvbuf(stream,(char * )NULL,_IOLBF,0);请参考setvbuf()。<br />
　　返回值<br />
　　setvbuf（设置文件流的缓冲区）<br />
　　相关函数 setbuffer，setlinebuf，setbuf<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 int setvbuf(FILE * stream,char * buf,int mode,size_t size);<br />
　　函数说明 在打开文件流后，读取内容之前，调用setvbuf()可以用来设置文件流的缓冲区。参数stream为指定的文件流，参数buf指向自定的缓冲区起始地址，参数size为缓冲区大小，参数mode有下列几种<br />
　　_IONBF 无缓冲IO<br />
　　_IOLBF 以换行为依据的无缓冲IO<br />
　　_IOFBF 完全无缓冲IO。如果参数buf为NULL指针，则为无缓冲IO。<br />
　　返回值<br />
　　ungetc（将指定字符写回文件流中）<br />
　　相关函数 fputc，getchar，getc<br />
　　表头文件 #include&lt;stdio.h&gt;<br />
　　定义函数 int ungetc(int c,FILE * stream);<br />
　　函数说明 ungetc()将参数c字符写回参数stream所指定的文件流。这个写回的字符会由下一个读取文件流的函数取得。<br />
　　返回值 成功则返回c 字符，若有错误则返回EOF。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ddeaw.com/2011469.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C语言浮点数的二进制表示</title>
		<link>http://www.ddeaw.com/2011466.html</link>
		<comments>http://www.ddeaw.com/2011466.html#comments</comments>
		<pubDate>Tue, 29 Nov 2011 12:10:37 +0000</pubDate>
		<dc:creator>学习网</dc:creator>
				<category><![CDATA[玩转软件]]></category>
		<category><![CDATA[C语言]]></category>

		<guid isPermaLink="false">http://www.ddeaw.com/?p=466</guid>
		<description><![CDATA[　　1. 　　前几天，我在读一本C语言教材，有一道例题： 　　#include &#60;stdio.h&#62; 　　void main(void){ 　　int num=9; /* num是整型变量，设为9 */ 　　float* pFloat=&#38;num; /* pFloat表示num的内存地址，但是设为浮点数 */ 　　printf("num的值为：%d\n",num); /* 显示num的整型值 */ 　　printf("*pFloat的值为：%f\n",*pFloat); /* 显示num的浮点值 */ 　　*pFloat=9.0; /* 将num的值改为浮点数 */ 　　printf("num的值为：%d\n",num); /* 显示num的整型值 */ 　　printf("*pFloat的值为：%f\n",*pFloat); /* 显示num的浮点值 */ 　　} 　　运行结果如下： 　　num的值为：9 　　*pFloat的值为：0.000000 　　num的值为：1091567616 　　*pFloat的值为：9.000000 　　我很惊讶，num和*pFloat在内存中明明是同一个数，为什么浮点数和整数的解读结果会差别这么大？ 　　要理解这个结果，一定要搞懂浮点数在计算机内部的表示方法。我读了一些资料，下面就是我的笔记。 　　2. 　　在讨论浮点数之前，先看一下整数在计算机内部是怎样表示的。 　　int num=9; 　　上面这条命令，声明了一个整数变量，类型为int，值为9（二进制写法为1001）。普通的32位计算机，用4个字节表示int变量，所以9就被保存为00000000 00000000 00000000 00001001，写成16进制就是0x00000009。 　　那么，我们的问题就简化成：为什么0x00000009还原成浮点数，就成了0.000000？ 　　3. 　　根据国际标准IEEE [...]]]></description>
			<content:encoded><![CDATA[<p>　　1.<br />
　　前几天，我在读一本C语言教材，有一道例题：<br />
　　#include &lt;stdio.h&gt;<br />
　　void main(void){<br />
　　int num=9; /* num是整型变量，设为9 */<br />
　　float* pFloat=&amp;num; /* pFloat表示num的内存地址，但是设为浮点数 */<br />
　　printf("num的值为：%d\n",num); /* 显示num的整型值 */<br />
　　printf("*pFloat的值为：%f\n",*pFloat); /* 显示num的浮点值 */<br />
　　*pFloat=9.0; /* 将num的值改为浮点数 */<br />
　　printf("num的值为：%d\n",num); /* 显示num的整型值 */<br />
　　printf("*pFloat的值为：%f\n",*pFloat); /* 显示num的浮点值 */<br />
　　}<br />
　　运行结果如下：<br />
　　num的值为：9<br />
　　*pFloat的值为：0.000000<br />
　　num的值为：1091567616<br />
　　*pFloat的值为：9.000000<br />
　　我很惊讶，num和*pFloat在内存中明明是同一个数，为什么浮点数和整数的解读结果会差别这么大？<br />
　　要理解这个结果，一定要搞懂浮点数在计算机内部的表示方法。我读了一些资料，下面就是我的笔记。<br />
　　2.<br />
　　在讨论浮点数之前，先看一下整数在计算机内部是怎样表示的。<br />
　　int num=9;<br />
　　上面这条命令，声明了一个整数变量，类型为int，值为9（二进制写法为1001）。普通的32位计算机，用4个字节表示int变量，所以9就被保存为00000000 00000000 00000000 00001001，写成16进制就是0x00000009。<br />
　　那么，我们的问题就简化成：为什么0x00000009还原成浮点数，就成了0.000000？<br />
　　3.<br />
　　根据国际标准IEEE 754，任意一个二进制浮点数V可以表示成下面的形式：<br />
　　V = (-1)^s×M×2^E<br />
　　（1）(-1)^s表示符号位，当s=0，V为正数；当s=1，V为负数。<br />
　　（2）M表示有效数字，大于等于1，小于2。<br />
　　（3）2^E表示指数位。<br />
　　举例来说，十进制的5.0，写成二进制是101.0，相当于1.01×2^2。那么，按照上面V的格式，可以得出s=0，M=1.01，E=2。<br />
　　十进制的-5.0，写成二进制是-101.0，相当于-1.01×2^2。那么，s=1，M=1.01，E=2。<br />
　　IEEE 754规定，对于32位的浮点数，最高的1位是符号位s，接着的8位是指数E，剩下的23位为有效数字M。</p>
<p><img src="http://img.duote.com/zixunImg/local/2011/06/24/1308887202628.jpg" alt="浮点数的二进制表示" width="506" height="100" border="0" /> <br />
　　对于64位的浮点数，最高的1位是符号位S，接着的11位是指数E，剩下的52位为有效数字M。</p>
<p><img src="http://img.duote.com/zixunImg/local/2011/06/24/13088872027535.jpg" alt="浮点数的二进制表示" width="500" height="100" border="0" /> </p>
<p>　　5.<br />
　　IEEE 754对有效数字M和指数E，还有一些特别规定。<br />
　　前面说过，1≤M&lt;2，也就是说，M可以写成1.xxxxxx的形式，其中xxxxxx表示小数部分。IEEE 754规定，在计算机内部保存M时，默认这个数的第一位总是1，因此可以被舍去，只保存后面的xxxxxx部分。比如保存1.01的时候，只保存01，等到读取的时候，再把第一位的1加上去。这样做的目的，是节省1位有效数字。以32位浮点数为例，留给M只有23位，将第一位的1舍去以后，等于可以保存24位有效数字。<br />
　　至于指数E，情况就比较复杂。<br />
　　首先，E为一个无符号整数（unsigned int）。这意味着，如果E为8位，它的取值范围为0~255；如果E为11位，它的取值范围为0~2047。但是，我们知道，科学计数法中的E是可以出现负数的，所以IEEE 754规定，E的真实值必须再减去一个中间数，对于8位的E，这个中间数是127；对于11位的E，这个中间数是1023。<br />
　　比如，2^10的E是10，所以保存成32位浮点数时，必须保存成10+127=137，即10001001。<br />
　　然后，指数E还可以再分成三种情况：<br />
　　（1）E不全为0或不全为1。这时，浮点数就采用上面的规则表示，即指数E的计算值减去127（或1023），得到真实值，再将有效数字M前加上第一位的1。<br />
　　（2）E全为0。这时，浮点数的指数E等于1-127（或者1-1023），有效数字M不再加上第一位的1，而是还原为0.xxxxxx的小数。这样做是为了表示±0，以及接近于0的很小的数字。<br />
　　（3）E全为1。这时，如果有效数字M全为0，表示±无穷大（正负取决于符号位s）；如果有效数字M不全为0，表示这个数不是一个数（NaN）。<br />
　　6.<br />
　　好了，关于浮点数的表示规则，就说到这里。<br />
　　下面，让我们回到一开始的问题：为什么0x00000009还原成浮点数，就成了0.000000？<br />
　　首先，将0x00000009拆分，得到第一位符号位s=0，后面8位的指数E=00000000，最后23位的有效数字M=000 0000 0000 0000 0000 1001。<br />
　　由于指数E全为0，所以符合上一节的第二种情况。因此，浮点数V就写成：<br />
　　V=(-1)^0×0.00000000000000000001001×2^(-126)=1.001×2^(-146)<br />
　　显然，V是一个很小的接近于0的正数，所以用十进制小数表示就是0.000000。<br />
　　7.<br />
　　再看例题的第二部分。<br />
　　请问浮点数9.0，如何用二进制表示？还原成十进制又是多少？<br />
　　首先，浮点数9.0等于二进制的1001.0，即1.001×2^3。<br />
　　那么，第一位的符号位s=0，有效数字M等于001后面再加20个0，凑满23位，指数E等于3+127=130，即10000010。<br />
　　所以，写成二进制形式，应该是s+E+M，即0 10000010 001 0000 0000 0000 0000 0000。这个32位的二进制数，还原成十进制，正是1091567616。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ddeaw.com/2011466.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>中国近代史上的“黄金时代”</title>
		<link>http://www.ddeaw.com/2011462.html</link>
		<comments>http://www.ddeaw.com/2011462.html#comments</comments>
		<pubDate>Mon, 28 Nov 2011 12:15:27 +0000</pubDate>
		<dc:creator>学习网</dc:creator>
				<category><![CDATA[五味参杂]]></category>

		<guid isPermaLink="false">http://www.ddeaw.com/?p=462</guid>
		<description><![CDATA[　前些天是五四，几乎没有人怀念这个节日，今天翻看了一下牛博网，发现杨支柱写了一篇纪念文章《想起“五四”不能不怀念北洋军阀政府》。这篇文章提出了一个惊人的观点“北洋军阀政府是中国历史上最好的政府之一”。 　　杨支柱主要讨论的是政治方面的论据来说明这个结论的，其实从经济上讲也是有一些根据的，在我大学的历史教材中称1912年之后的十年为中国民族工业的“黄金时代”，我当年第一次看到这个观点也非常惊讶，因为我在接触这本教材前，从中学和小学里根本就不知道这个时代的经济发展竟然会是这么惊人，说到的都是社会无比黑暗，农民的破产造成萧条等等。而大学的教材却将以前的教材里说的话都推翻了，这使得我明白了一个道理：如果说教科书可以骗人的话，大学教材中骗人最少，小学教材则最多。不过虽然大学骗人少，但骗人却最有欺骗性，小学教材的骗人却可以一眼就识破。 　　在这本《中国革命史教程》中的“中国资本主义经济的新发展和新文化运动的兴起”一节中，绘声绘色地描述了这段时间中国经济发展的惊人速度，这里我摘录一些数据：“据统计，1912年到1919年，建成厂矿470余个，加上原有企业的扩建，新增资本达1.3亿元以上，8年的增长额相当于以前的50年......1913年全国面粉53家，资本862万元，1919年增至123家，资本1500万元，1918年中国免费由入超变为出超...煤产量1913年为1337万吨，1919年则达到2005万吨，增长49%，钨矿的开采居世界第二。” 　　在这些描述中，我看到了一个怎样的中国啊，那时的中国的确很穷，但确是一个充满了希望和未来的新兴国家，一切都有可能，一切都是全新的。而当时的统治者北洋军阀，也许并不是以前媒体妖魔化的那样独裁和腐败，至少那时候个人居然可以创办和发行杂志甚至组建政党，工人可以罢工，学生可以游行，这些都是现代人做梦也做不到的事情，因此北洋军阀不应该算最坏的政府。 　　仔细想想，北洋军阀其实因为很多原因被迫不敢乱来，杨支柱分析的也有道理，一个小的政府，并且有很多外部竞争者，那么他想去变坏都不容易。 　　可惜，历史是个任人打扮的小姑娘。现在想了解真实的历史实在是太难了。 文章来源：月光博客]]></description>
			<content:encoded><![CDATA[<p>　前些天是五四，几乎没有人怀念这个节日，今天翻看了一下牛博网，发现杨支柱写了一篇纪念文章《想起“五四”不能不怀念北洋军阀政府》。这篇文章提出了一个惊人的观点“北洋军阀政府是中国历史上最好的政府之一”。</p>
<p>　　杨支柱主要讨论的是政治方面的论据来说明这个结论的，其实从经济上讲也是有一些根据的，在我大学的历史教材中称1912年之后的十年为中国民族工业的“黄金时代”，我当年第一次看到这个观点也非常惊讶，因为我在接触这本教材前，从中学和小学里根本就不知道这个时代的经济发展竟然会是这么惊人，说到的都是社会无比黑暗，农民的破产造成萧条等等。而大学的教材却将以前的教材里说的话都推翻了，这使得我明白了一个道理：如果说教科书可以骗人的话，大学教材中骗人最少，小学教材则最多。不过虽然大学骗人少，但骗人却最有欺骗性，小学教材的骗人却可以一眼就识破。</p>
<p>　　在这本《中国革命史教程》中的“中国资本主义经济的新发展和新文化运动的兴起”一节中，绘声绘色地描述了这段时间中国经济发展的惊人速度，这里我摘录一些数据：“据统计，1912年到1919年，建成厂矿470余个，加上原有企业的扩建，新增资本达1.3亿元以上，8年的增长额相当于以前的50年......1913年全国面粉53家，资本862万元，1919年增至123家，资本1500万元，1918年中国免费由入超变为出超...煤产量1913年为1337万吨，1919年则达到2005万吨，增长49%，钨矿的开采居世界第二。”</p>
<p>　　在这些描述中，我看到了一个怎样的中国啊，那时的中国的确很穷，但确是一个充满了希望和未来的新兴国家，一切都有可能，一切都是全新的。而当时的统治者北洋军阀，也许并不是以前媒体妖魔化的那样独裁和腐败，至少那时候个人居然可以创办和发行杂志甚至组建政党，工人可以罢工，学生可以游行，这些都是现代人做梦也做不到的事情，因此北洋军阀不应该算最坏的政府。</p>
<p>　　仔细想想，北洋军阀其实因为很多原因被迫不敢乱来，杨支柱分析的也有道理，一个小的政府，并且有很多外部竞争者，那么他想去变坏都不容易。</p>
<p>　　可惜，历史是个任人打扮的小姑娘。现在想了解真实的历史实在是太难了。</p>
<p>文章来源：月光博客</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ddeaw.com/2011462.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

