﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-冷夜 C++ 小栈-文章分类-C++ 经验与技巧 </title><link>http://www.cppblog.com/paudy/category/31.html</link><description>关于C++的一些经验与心得，还会有一些技术文摘</description><language>zh-cn</language><lastBuildDate>Sat, 28 Aug 2010 03:52:13 GMT</lastBuildDate><pubDate>Sat, 28 Aug 2010 03:52:13 GMT</pubDate><ttl>60</ttl><item><title>有人问学习vc为什么难，我的看法 </title><link>http://www.cppblog.com/paudy/articles/227.html</link><dc:creator>冷夜</dc:creator><author>冷夜</author><pubDate>Mon, 12 Sep 2005 15:36:00 GMT</pubDate><guid>http://www.cppblog.com/paudy/articles/227.html</guid><wfw:comment>http://www.cppblog.com/paudy/comments/227.html</wfw:comment><comments>http://www.cppblog.com/paudy/articles/227.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/paudy/comments/commentRss/227.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/paudy/services/trackbacks/227.html</trackback:ping><description><![CDATA[先要弄清楚 我们说的VC是指什么<BR>vc可能包含的范围有：vs开发环境，MFC库，C++<BR>你要学习VC基本上包含这三方面的内容，当然，真正深入学习还有其他，如COM/COM+，ATL等，但这个已经不是VC本身的东西<BR>为什么学习VC让人觉得难，那时因为刚开始学的时候没有好的导师（或者有经验的“高”人指导）<BR>基本上，如果没有一定的基础直接学VC，那么你会需要花很大力气去熟悉VC开发环境和MFC类库，<BR>学mfc是一项让很多人有挫折感的事情，<BR>所以如果你学的过程中有此感受 请不必气馁，也不要去钻牛角尖<BR>当你可以根据书上的例子编几个小程序，对VC有一个感性的认识之后，你就可以开始兼顾其他的方面了<BR>想要用好VC，需要的并不是只有VC本身的知识，还需要其他一些东西：<BR>1、对纯C++有一定的功力，几本好书如：<BR>&nbsp;&nbsp;&nbsp;&nbsp; 《C++ primer》，《Accelerated C++》是入门就可以看的好书，都有中文版卖，电子书要自己找，更进一步的书诸如《EFFECTIVE C++》,&lt;INSIDE THE C++ OBJECT MODE&gt;，《The C++ Programing Language》，还有泛型编程和STL的书，我不是高手，所以也说的不是很全。不过等你到了一定程度，自己就会了解并会选择自己要读哪些书了
<P>2、要对WINDOWS系统编程有一定了解，这方面主要是指了解WINAPI编程，以及WINDOWS一些底层机制，如消息、线程、进程、线程同步等一些知识，这个方面的经典书籍有《windows 核心编程》，《programming&nbsp; windows》等，还有MSDN是关于WINAPI最权威的帮助。还更多的东西请自己再去找。</P>
<P>3、就是更深地了解VC开发环境和MFC库，这个的好书也很多，不过这方面是我的弱点，知道的书有：《VC++ 技术内幕》，《深入浅出MFC》。再说一下，学vc必然会用到MFC，但是你不一定要精通MFC，有时候有的人只要会用就可以了</P>
<P>4、专业知识，譬如你做数据库方面的开发，那你就要有数据库系统的知识；如果做通信，那你就要了解通信协议。这些专业知识都有一些流行的开发接口，如ADO（数据库），SOCKET(网络通信)。专业知识与VC本身并没有必然联系，这些事你做软件开发所必需的。</P>
<P>以上仅为个人看法，不是定律，不是真理，仅供参考。<BR></P>
<P>（本文是本人以baodi_z的网名原发表在CSDN的个人BLOG，原文发表于 2004年12月24日 4:23 PM ）</P><img src ="http://www.cppblog.com/paudy/aggbug/227.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/paudy/" target="_blank">冷夜</a> 2005-09-12 23:36 <a href="http://www.cppblog.com/paudy/articles/227.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boiz 的C++ 备忘录（三）-- 注意strcpy函数的一个陷阱 </title><link>http://www.cppblog.com/paudy/articles/225.html</link><dc:creator>冷夜</dc:creator><author>冷夜</author><pubDate>Mon, 12 Sep 2005 15:32:00 GMT</pubDate><guid>http://www.cppblog.com/paudy/articles/225.html</guid><wfw:comment>http://www.cppblog.com/paudy/comments/225.html</wfw:comment><comments>http://www.cppblog.com/paudy/articles/225.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/paudy/comments/commentRss/225.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/paudy/services/trackbacks/225.html</trackback:ping><description><![CDATA[<P>在CSDN论坛的VC板块看到有人问如下问题，不禁使我想起以前遇到过一个类是的BUG，因此觉得有必要写下来，以免久了就忘了。</P>
<P>下面先看问题：</P>
<P>////bowex ()///////////////////////////////////////////////////////</P>
<P>char uu[3][2];<BR>CString s;<BR>for(int i=0;i&lt;3;i++)<BR>{<BR>&nbsp; s="我";<BR>&nbsp; strcpy(uu[i],s);<BR>} </P>
<P>运行完以上程序后为何数组uu中的内容是</P>
<P>uu[0] --- &gt; 我我我<BR>uu[1] --- &gt; 我我<BR>uu[2] --- &gt; 我</P>
<P>而不是<BR>uu[0] --- &gt; 我<BR>uu[1] --- &gt; 我<BR>uu[2] --- &gt; 我&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为何？ 奇怪! 多谢</P>
<P>////////////////////////////////////////////////////////////////////</P>
<P>网友“QunKangLi(维护成本与程序员的创造力的平方成正比)”给出解释：</P>
<P>“<STRONG>char uu[3][3];//这样就行了，字符串结束符占一个字符宽度</STRONG>。”</P>
<P>这个解释是很对，不过我还是要强调一下这种情况可能产生的严重后果：</P>
<P>像这种情况让我想起了strcpy函数可能引起非法内存访问，也就是说，<STRONG>如果</STRONG></P>
<P><STRONG>strcpy拷贝的目的地址分配的空间不够，那么strcpy会把空间后面的地址也占用，</STRONG></P>
<P><STRONG>这样就可能使某些数据被意外修改，从而导致程序崩溃或者数据异常</STRONG>。之所以有</P>
<P>这种感受，是因为以前碰到有个程序，就发生这样的错误，就是因为strcpy拷贝的内容</P>
<P>过长从而把数据结构中紧接其后的成员的数据变为0了，结果程序当然出现意外。</P>
<P>假设把上面的for循环用下面的语句代替 那么结果就更加荒唐， 因为会出现乱码。</P>
<P>char uu[3][2];<BR>CString s;</P>
<P>s="我";<BR>strcpy(uu[2],s);<BR>&nbsp;strcpy(uu[1],s);<BR>strcpy(uu[0],s);</P>
<P>&nbsp;大家可以编译一下上面的代码，运行程序 你可以看到uu数组中有乱码。</P>
<P>如果输出的话，应该是这样的，</P>
<P>uu[0] --- &gt; 我<BR>uu[1] --- &gt; （空串）<BR>uu[2] --- &gt; （空串）</P>
<P>是什么原因大家应该一目了然了吧。<BR></P>
<P>（本文是本人以baodi_z的网名原发表在CSDN的个人BLOG，原文发表于 2005年03月21日 6:23 PM ）</P><img src ="http://www.cppblog.com/paudy/aggbug/225.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/paudy/" target="_blank">冷夜</a> 2005-09-12 23:32 <a href="http://www.cppblog.com/paudy/articles/225.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boiz 的 C++ 备忘录（二） </title><link>http://www.cppblog.com/paudy/articles/224.html</link><dc:creator>冷夜</dc:creator><author>冷夜</author><pubDate>Mon, 12 Sep 2005 15:30:00 GMT</pubDate><guid>http://www.cppblog.com/paudy/articles/224.html</guid><wfw:comment>http://www.cppblog.com/paudy/comments/224.html</wfw:comment><comments>http://www.cppblog.com/paudy/articles/224.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/paudy/comments/commentRss/224.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/paudy/services/trackbacks/224.html</trackback:ping><description><![CDATA[<P>1、C++函数参数入栈顺序--从右到左</P>
<P>下面的例子用来验证C++函数参数入栈顺序：</P>
<P>&nbsp;&nbsp;&nbsp;void test（int i1, int i2, int i3）</P>
<P>{</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;printf(“i1=%d, i2=%d, i3=%d\n“,i1,i2,i3);</P>
<P>}</P>
<P>int i=0;</P>
<P>test(++i,++i,++i);</P>
<P>则输出结果为：i1=3, i2=2, i3=1</P>
<P>2、一个有趣的小问题--表达式与算符结合顺序</P>
<P>在VC论坛里看到有人对下面的表达式计算结果有点迷惑，</P>
<P>int i&nbsp;= 1;</P>
<P>int k = (++i) + (++i)+ (++i);</P>
<P>int i2&nbsp;= 1;</P>
<P>int k2 = (++i2) + (++i2);</P>
<P>我也测试了一下，很多人一开始会以为 k = 2 + 3 + 4&nbsp; =9;</P>
<P>但是事实上在VC, DevC++4.9(GCC)里面编译， 执行结果k=10;</P>
<P>综合其他人的一些看法和我自己的测试，得出结论:</P>
<P>k= (++i)+(++i)+(++i);//等价于++i，++i，k = i+i + （++i）；也就是 k = 3 + 3 + 4 = 10。</P>
<P>因此，k2的结果为6。</P>
<P>当然，这个没有进行语法上的深层次分析，有兴趣的朋友可以自己分析一下C++的相关语法。<BR></P>
<P>（本文是本人以baodi_z的网名原发表于CSDN的个人BLOG，原文发表于 2004年12月06日 11:23 AM ）</P><img src ="http://www.cppblog.com/paudy/aggbug/224.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/paudy/" target="_blank">冷夜</a> 2005-09-12 23:30 <a href="http://www.cppblog.com/paudy/articles/224.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boiz 的 C++ 备忘录（一）</title><link>http://www.cppblog.com/paudy/articles/223.html</link><dc:creator>冷夜</dc:creator><author>冷夜</author><pubDate>Mon, 12 Sep 2005 15:27:00 GMT</pubDate><guid>http://www.cppblog.com/paudy/articles/223.html</guid><wfw:comment>http://www.cppblog.com/paudy/comments/223.html</wfw:comment><comments>http://www.cppblog.com/paudy/articles/223.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/paudy/comments/commentRss/223.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/paudy/services/trackbacks/223.html</trackback:ping><description><![CDATA[<P>本文主要是记录一些初级的但是有时候我自己容易忽略或者忘记东西，仅作备忘录之用&nbsp;&nbsp;&nbsp;<BR>1）、衔接符 \ </P>
<P>\ 在c++中可以作为衔接符（忘了规范的术语是不是这么叫了， 汗自己一个~），例如：</P>
<P>&nbsp;&nbsp;//this is memo\</P>
<P>this is memo too</P>
<P>上面两行在c++中，编译器会认为是一行。</P>
<P>不过\一般只在宏定义中使用，因为如果是字符串，那么别写分号就行，如：<BR>char *s = "How "<BR>&nbsp;&nbsp;&nbsp; "are "<BR>&nbsp;&nbsp;&nbsp; "you?";<BR>如果是一般的语句，那么就直接换，比如：<BR>int sum = i + <BR>&nbsp;&nbsp;&nbsp; j;<BR></P>
<P>2）##</P>
<P>## 叫做指令粘贴符，它的英文术语叫做token-pasting operator，主要在宏定义中使用。使用例子如下：</P><PRE><CODE>#define paster( n ) printf( "token" #n " = %d", token##n )</CODE></PRE>
<P>int token9 = 9;</P>
<P>用如下方式调用宏,</P>
<P>paster( 9 ); //输出: taken9 = 9</P>
<P>上面的宏此时等价于</P>
<P>printf( "token" "9" " = %d", token9 );</P>
<P>结果就是：</P>
<P>printf( "token9 = %d", token9 );</P>
<P>3）、除法操作符</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp; ：除号，注意整数相除与浮点数相除的差别。如果3 / 2，结果=1。3.0 / 2 的结果则等于1.5。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%&nbsp;：求模操作符， 5%3 = = 2</P>
<P>第一部分先写这么多，以后再整理其他&nbsp;的。</P>
<P>（本文是本人以baodi_z的网名原发表在CSDN的个人BLOG，原文发表于 2004年11月30日 11:32 AM ）</P><img src ="http://www.cppblog.com/paudy/aggbug/223.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/paudy/" target="_blank">冷夜</a> 2005-09-12 23:27 <a href="http://www.cppblog.com/paudy/articles/223.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>