<?xml version="1.0" encoding="utf-8" ?>
<!-- generator="FEEDCREATOR_VERSION" -->
<rss version="2.0" xmlns:sns="http://blog.sina.com.cn/sns">
    <channel>
        <title>大牙的BLOG</title>
        <description></description>
        <link>http://blog.sina.com.cn/cldaya</link>
        <lastBuildDate>Wed, 23 Mar 2011 13:56:28 +0800</lastBuildDate>
        <generator>FEEDCREATOR_VERSION</generator>
        <language>zh-cn</language>
        <copyright>Copyright 1996 - 2009 SINA Inc. All Rights Reserved.</copyright>
        <pubDate>Mon, 06 Feb 2012 19:29:00 +0800</pubDate>
        <item>
            <title>quota</title>
            <link>http://blog.sina.com.cn/s/blog_49302a850100qkqy.html</link>
            <description><![CDATA[<span STYLE="border-collapse: collapse; color: rgb(68, 68, 68); font-family: Verdana, Helvetica, Arial, sans-serif; line-height: 22px;">
该方案已在多台服务器设置成功，绝对能有。&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
试验机采用Redhat　Linux9缺省安装，所有程序文件安装在（/dev/hda2）硬盘，挂载点”/”；quota版本V3.0-9&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />

安装步骤：&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
1、 首先使用root用户登录&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
2、 cd /
(转到根目录，因本人使用的缺省安装，所以根目录是本硬盘的挂载点，如自定义安装需转到相应的目录下，如/home或/usr)&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />

3、 gedit /etc/fstab（编辑fstab文件）&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
如:LABEL=/ / ext3 defaults,usrquota,grpquota 1 1(
usrquota,grpquota为增加项)&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
存盘。&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
4、 gedit
/etc/rc.d/rc.local　（编辑rc.local文件）加入以下代码：&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />

<br STYLE="word-wrap: break-word; line-height: normal;" />
# Check quota and then turn quota on.&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
if [ -x /usr/sbin/quotacheck ]&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
then&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
echo "Checking quotas. This may take some
time."&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
/usr/sbin/quotacheck -avug&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
echo " Done."&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
fi&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
if [ -x /usr/sbin/quotaon ]&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
then&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
echo "Turning on quota."&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
/usr/sbin/quotaon -avug&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
fi&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
存盘；&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
5、 cd /　（回到根目录，为挂载点的根目录，如/home,/usr）&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
6、 touch quota.user&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
7、 touch quota.group&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
8、 chmod 600 quota.user&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
9、 chmod 600 quota.group&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
10、 reboot (重起，不要急，在启动过程中会报错，不要理它。)&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
11、 启动完成后，继续以下操作。&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
12、 quotacheck &ndash;mfugv
(这是关系操作，因为原先所建的quota.user和quota.group为空文件，这条命令会重建这两个文件，视机器情况需要一段时间，它会疯狂地读硬盘。&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />

13、 读盘光标停止后，接着输入&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
　　　convertquota &ndash;u /
(注意”/”为硬盘挂载点，因我采用的是缺省安装所以是”/”，该命令是对刚生成的新quota.user文件进行格式转换，必须实行此步骤)；&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />

　　　convertquota &ndash;g
/（该命令是对刚生成的新quota.group文件进行格式转换，必须实行此步骤）&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />

14、 转换完成后，祝贺你已大功告成了。&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
15、 实行quotaon -avug，启动你的Quota吧。&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
16、 用repquota &ndash;a 查一下，看看你的工作成果吧。&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
17、 用户空间分配请使用&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
　　　edquota &ndash;u (-g，-u表示是用户/-g表示是群组)
name(用户/群组名)&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
例：edquota &ndash;u myname&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
edquota &ndash;g mygroup&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
edquota -p nowuser newuser
#将旧用户的属性复制到新用户中。&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
输入完后会进入VI编辑模式，改好参数就行了。&nbsp;<br STYLE="word-wrap: break-word; line-height: normal;" />
18、 edquota &ndash;t （为修改宽限期时间）</SPAN>]]></description>
            <author>大牙</author>
            <comments>http://blog.sina.com.cn/s/blog_49302a850100qkqy.html#comment</comments>
            <pubDate>Wed, 23 Mar 2011 13:56:28 +0800</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_49302a850100qkqy.html</guid>
        </item>
        <item>
            <title>线程与进程</title>
            <link>http://blog.sina.com.cn/s/blog_49302a850100mvx8.html</link>
            <description><![CDATA[<p>本文详细的介绍了Linux内核中的同步机制：原子操作、信号量、读写信号量和自旋锁的API，使用要求以及一些典型示例<br />
　　<br />
　　一、引言<br />
　　<br />
　　在现代操作系统里，同一时间可能有多个内核执行流在执行，因此内核其实象多进程多线程编程一样也需要一些同步机制来同步各执行单元对共享数据的访问。尤其是在多处理器系统上，更需要一些同步机制来同步不同处理器上的执行单元对共享的数据的访问。<br />

　　<br />
　　在主流的Linux内核中包含了几乎所有现代的操作系统具有的同步机制，这些同步机制包括：原子操作、信号量（semaphore）、读写信号量（rw_semaphore）、spinlock、BKL(Big
Kernel
Lock)、rwlock、brlock（只包含在2.4内核中）、RCU（只包含在2.6内核中）和seqlock（只包含在2.6内核中）。<br />

　　<br />
　　二、原子操作<br />
　　<br />
　　所谓原子操作，就是该操作绝不会在执行完毕前被任何其他任务或事件打断，也就说，它的最小的执行单位，不可能有比它更小的执行单位，因此这里的原子实际是使用了物理学里的物质微粒的概念。<br />

　　<br />
　　原子操作需要硬件的支持，因此是架构相关的，其API和原子类型的定义都定义在内核源码树的include/asm/atomic.h文件中，它们都使用汇编语言实现，因为C语言并不能实现这样的操作。<br />

　　<br />
　　原子操作主要用于实现资源计数，很多引用计数(refcnt)就是通过原子操作实现的。原子类型定义如下：<br />
　　<br />
　　typedef struct<br />
　　 {<br />
　　 volatile int counter;<br />
　　 }<br />
　　 atomic_t;<br />
　　<br />
　　volatile修饰字段告诉gcc不要对该类型的数据做优化处理，对它的访问都是对内存的访问，而不是对寄存器的访问。<br />
　　<br />
　　原子操作API包括：<br />
　　<br />
　　atomic_read(atomic_t * v);<br />
　　<br />
　　该函数对原子类型的变量进行原子读操作，它返回原子类型的变量v的值。<br />
　　<br />
　　atomic_set(atomic_t * v, int i);<br />
　　<br />
　　该函数设置原子类型的变量v的值为i。<br />
　　<br />
　　void atomic_add(int i, atomic_t *v);<br />
　　<br />
　　该函数给原子类型的变量v增加值i。<br />
　　<br />
　　atomic_sub(int i, atomic_t *v);<br />
　　<br />
　　该函数从原子类型的变量v中减去i。<br />
　　<br />
　　int atomic_sub_and_test(int i, atomic_t *v);<br />
　　<br />
　　该函数从原子类型的变量v中减去i，并判断结果是否为0，如果为0，返回真，否则返回假。<br />
　　<br />
　　void atomic_inc(atomic_t *v);<br />
　　<br />
　　该函数对原子类型变量v原子地增加1。<br />
　　<br />
　　void atomic_dec(atomic_t *v);<br />
　　<br />
　　该函数对原子类型的变量v原子地减1。<br />
　　<br />
　　int atomic_dec_and_test(atomic_t *v);<br />
　　<br />
　　该函数对原子类型的变量v原子地减1，并判断结果是否为0，如果为0，返回真，否则返回假。<br />
　　<br />
　　int atomic_inc_and_test(atomic_t *v);<br />
　　<br />
　　该函数对原子类型的变量v原子地增加1，并判断结果是否为0，如果为0，返回真，否则返回假。<br />
　　<br />
　　int atomic_add_negative(int i, atomic_t *v);<br />
　　<br />
　　该函数对原子类型的变量v原子地增加I，并判断结果是否为负数，如果是，返回真，否则返回假。<br />
　　<br />
　　int atomic_add_return(int i, atomic_t *v);<br />
　　<br />
　　该函数对原子类型的变量v原子地增加i，并且返回指向v的指针。<br />
　　<br />
　　int atomic_sub_return(int i, atomic_t *v);<br />
　　<br />
　　该函数从原子类型的变量v中减去i，并且返回指向v的指针。<br />
　　<br />
　　int atomic_inc_return(atomic_t * v);<br />
　　<br />
　　该函数对原子类型的变量v原子地增加1并且返回指向v的指针。<br />
　　<br />
　　int atomic_dec_return(atomic_t * v);<br />
　　<br />
　　该函数对原子类型的变量v原子地减1并且返回指向v的指针。<br />
　　<br />
　　原子操作通常用于实现资源的引用计数，在TCP/IP协议栈的IP碎片处理中，就使用了引用计数，碎片队列结构struct
ipq描述了一个IP碎片，字段refcnt就是引用计数器，它的类型为atomic_t，当创建IP碎片时（在函数ip_frag_create中），使用atomic_set函数把它设置为1，当引用该IP碎片时，就使用函数atomic_inc把引用计数加1。<br />

　　<br />
　　当不需要引用该IP碎片时，就使用函数ipq_put来释放该IP碎片，ipq_put使用函数atomic_dec_and_test把引用计数减1并判断引用计数是否为0，如果是就释放IP碎片。函数ipq_kill把IP碎片从ipq队列中删除，并把该删除的IP碎片的引用计数减1（通过使用函数atomic_dec实现）。<br />

　　<br />
　　三、信号量（semaphore）<br />
　　<br />
　　Linux内核的信号量在概念和原理上与用户态的System
V的IPC机制信号量是一样的，但是它绝不可能在内核之外使用，因此它与System V的IPC机制信号量毫不相干。<br />
　　<br />
　　信号量在创建时需要设置一个初始值，表示同时可以有几个任务可以访问该信号量保护的共享资源，初始值为1就变成互斥锁（Mutex），即同时只能有一个任务可以访问信号量保护的共享资源。<br />

　　<br />
　　一个任务要想访问共享资源，首先必须得到信号量，获取信号量的操作将把信号量的值减1，若当前信号量的值为负数，表明无法获得信号量，该任务必须挂起在该信号量的等待队列等待该信号量可用；若当前信号量的值为非负数，表示可以获得信号量，因而可以立刻访问被该信号量保护的共享资源。<br />

　　<br />
　　当任务访问完被信号量保护的共享资源后，必须释放信号量，释放信号量通过把信号量的值加1实现，如果信号量的值为非正数，表明有任务等待当前信号量，因此它也唤醒所有等待该信号量的任务。<br />

　　<br />
　　信号量的API有：<br />
　　<br />
　　DECLARE_MUTEX(name)<br />
　　<br />
　　该宏声明一个信号量name并初始化它的值为0，即声明一个互斥锁。<br />
　　<br />
　　DECLARE_MUTEX_LOCKED(name)<br />
　　<br />
　　该宏声明一个互斥锁name，但把它的初始值设置为0，即锁在创建时就处在已锁状态。因此对于这种锁，一般是先释放后获得。<br />
　　<br />
　　void sema_init (struct semaphore *sem, int val);<br />
　　<br />
　　该函用于数初始化设置信号量的初值，它设置信号量sem的值为val。<br />
　　<br />
　　void init_MUTEX (struct semaphore *sem);<br />
　　<br />
　　该函数用于初始化一个互斥锁，即它把信号量sem的值设置为1。<br />
　　<br />
　　void init_MUTEX_LOCKED (struct semaphore *sem);<br />
　　<br />
　　该函数也用于初始化一个互斥锁，但它把信号量sem的值设置为0，即一开始就处在已锁状态。<br />
　　<br />
　　void down(struct semaphore * sem);<br />
　　<br />
　　该函数用于获得信号量sem，它会导致睡眠，因此不能在中断上下文（包括IRQ上下文和softirq上下文）使用该函数。该函数将把sem的值减1，如果信号量sem的值非负，就直接返回，否则调用者将被挂起，直到别的任务释放该信号量才能继续运行。<br />

　　<br />
　　int down_interruptible(struct semaphore * sem);<br />
　　<br />
　　该函数功能与down类似，不同之处为，down不会被信号（signal）打断，但down_interruptible能被信号打断，因此该函数有返回值来区分是正常返回还是被信号中断，如果返回0，表示获得信号量正常返回，如果被信号打断，返回-EINTR。<br />

　　<br />
　　int down_trylock(struct semaphore * sem);<br />
　　<br />
　　该函数试着获得信号量sem，如果能够立刻获得，它就获得该信号量并返回0，否则，表示不能获得信号量sem，返回值为非0值。因此，它不会导致调用者睡眠，可以在中断上下文使用。<br />

　　<br />
　　void up(struct semaphore * sem);<br />
　　<br />
　　该函数释放信号量sem，即把sem的值加1，如果sem的值为非正数，表明有任务等待该信号量，因此唤醒这些等待者。<br />
　　<br />
　　信号量在绝大部分情况下作为互斥锁使用，下面以console驱动系统为例说明信号量的使用。<br />
　　<br />
　　在内核源码树的kernel/printk.c中，使用宏DECLARE_MUTEX声明了一个互斥锁console_sem，它用于保护console驱动列表console_drivers以及同步对整个console驱动系统的访问。<br />

　　<br />
　　其中定义了函数acquire_console_sem来获得互斥锁console_sem，定义了release_console_sem来释放互斥锁console_sem，定义了函数try_acquire_console_sem来尽力得到互斥锁console_sem。这三个函数实际上是分别对函数down，up和down_trylock的简单包装。<br />

　　<br />
　　需要访问console_drivers驱动列表时就需要使用acquire_console_sem来保护console_drivers列表，当访问完该列表后，就调用release_console_sem释放信号量console_sem。<br />

　　<br />
　　函数console_unblank，console_device，console_stop，console_start，register_console和unregister_console都需要访问console_drivers，因此它们都使用函数对acquire_console_sem和release_console_sem来对console_drivers进行保护。<br />
</P>]]></description>
            <author>大牙</author>
            <comments>http://blog.sina.com.cn/s/blog_49302a850100mvx8.html#comment</comments>
            <pubDate>Mon, 25 Oct 2010 18:39:21 +0800</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_49302a850100mvx8.html</guid>
        </item>
        <item>
            <title>get()等</title>
            <link>http://blog.sina.com.cn/s/blog_49302a850100gyto.html</link>
            <description><![CDATA[<div>
<p>
学C++的时候，这几个输入函数弄的有点迷糊；这里做个小结，为了自己复习，也希望对后来者能有所帮助，如果有差错的地方还请各位多多指教（本文所有程序均通过VC
6.0运行）转载请保留作者信息；<br />
1、cin<br />
1、cin.get()<br />
2、cin.getline()<br />
3、getline()<br />
4、gets()<br />
5、getchar()</P>
<p><strong><em><font COLOR="#FF0000">1、cin&gt;&gt;&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr /></FONT></EM></STRONG></P>
<p><font COLOR="#808000">用法1：最基本，也是最常用的用法，输入一个数字：</FONT></P>
<p><font COLOR="#808080">#include
&lt;iostream&gt;<br />
using namespace std;<br />
main ()<br />
{<br />
int a,b;<br />
cin&gt;&gt;a&gt;&gt;b;<br />

cout&lt;&lt;a+b&lt;&lt;endl;<br />

}</FONT></P>
<p>输入：2[回车]3[回车]<br />
输出：5</P>
<p><font COLOR="#808000">用法2：接受一个字符串，遇“空格”、“TAB”、“回车”都结束</FONT></P>
<p><font COLOR="#808080">#include
&lt;iostream&gt;<br />
using namespace std;<br />
main ()<br />
{<br />
char a[20];<br />
cin&gt;&gt;a;<br />
cout&lt;&lt;a&lt;&lt;endl;<br />

}</FONT></P>
<p>输入：jkljkljkl<br />
输出：jkljkljkl</P>
<p>输入：jkljkl
jkljkl&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />
<font COLOR="#808080">//遇空格结束</FONT><br />
输出：jkljkl</P>
<p><em><strong><font COLOR="#FF0000">2、cin.get()</FONT></STRONG></EM></P>
<p>&nbsp;<wbr /></P>
<p><font COLOR="#808000">用法1： cin.get(字符变量名)可以用来接收字符</FONT></P>
<p><font COLOR="#808080">#include
&lt;iostream&gt;<br />
using namespace std;<br />
main ()<br />
{<br />
char ch;<br />
ch=cin.get();&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />
//或者cin.get(ch);<br />
cout&lt;&lt;ch&lt;&lt;endl;<br />

}</FONT></P>
<p>输入：jljkljkl<br />
输出：j</P>
<p><font COLOR="#808000">用法2：cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格</FONT></P>
<p><font COLOR="#808080">#include
&lt;iostream&gt;<br />
using namespace std;<br />
main ()<br />
{<br />
char a[20];<br />
cin.get(a,20);<br />
cout&lt;&lt;a&lt;&lt;endl;<br />

}</FONT></P>
<p>输入：jkl jkl jkl<br />
输出：jkl jkl jkl</P>
<p>输入：abcdeabcdeabcdeabcdeabcde （输入25个字符）<br />
输出：abcdeabcdeabcdeabcd&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />
（接收19个字符+1个'\0'）</P>
<p><font COLOR="#808000">用法3：cin.get(无参数)没有参数主要是用于舍弃输入流中的不需要的字符,或者舍弃回车,弥补cin.get(字符数组名,接收字符数目)的不足.</FONT></P>
<p>这个我还不知道怎么用，知道的前辈请赐教；</P>
<p><strong><em><font COLOR="#FF0000">3、cin.getline()&nbsp;<wbr />&nbsp;<wbr />
// 接受一个字符串，可以接收空格并输出</FONT></EM></STRONG></P>
<p><font COLOR="#808080">#include
&lt;iostream&gt;<br />
using namespace std;<br />
main ()<br />
{<br />
char m[20];<br />
cin.getline(m,5);<br />
cout&lt;&lt;m&lt;&lt;endl;<br />

}</FONT></P>
<p>输入：jkljkljkl<br />
输出：jklj</P>
<p>接受5个字符到m中，其中最后一个为'\0'，所以只看到4个字符输出；</P>
<p><font COLOR="#808080">如果把5改成20：<br /></FONT><font COLOR="#808080">输入：jkljkljkl<br />
输出：jkljkljkl</FONT></P>
<p><font COLOR="#808080">输入：jklf fjlsjf fjsdklf<br />
输出：jklf fjlsjf fjsdklf</FONT></P>
<p>//延伸：<br />
//cin.getline()实际上有三个参数，cin.getline(接受字符串的看哦那间m,接受个数5,结束字符)<br />
//当第三个参数省略时，系统默认为'\0'<br />
//如果将例子中cin.getline()改为cin.getline(m,5,'a');当输入jlkjkljkl时输出jklj，输入jkaljkljkl时，输出jk</P>
<p>当用在多维数组中的时候，也可以用cin.getline(m[i],20)之类的用法：</P>
<p><font COLOR="#808080">#include&lt;iostream&gt;<br />
#include&lt;string&gt;<br />
using namespace std;</FONT></P>
<p><font COLOR="#808080">main ()<br />
{<br />
char m[3][20];<br />
for(int i=0;i&lt;3;i++)<br />
{<br />
cout&lt;&lt;"\n请输入第"&lt;&lt;i+1&lt;&lt;"个字符串："&lt;&lt;endl;<br />

cin.getline(m[i],20);<br />
}</FONT></P>
<p><font COLOR="#808080">cout&lt;&lt;endl;<br />
for(int j=0;j&lt;3;j++)<br />
cout&lt;&lt;"输出m["&lt;&lt;j&lt;&lt;"]的值:"&lt;&lt;m[j]&lt;&lt;endl;</FONT></P>
<p><font COLOR="#808080">}</FONT></P>
<p>请输入第1个字符串：<br />
kskr1</P>
<p>请输入第2个字符串：<br />
kskr2</P>
<p>请输入第3个字符串：<br />
kskr3</P>
<p>输出m[0]的值:kskr1<br />
输出m[1]的值:kskr2<br />
输出m[2]的值:kskr3</P>
<p><em><strong><font COLOR="#FF0000">4、getline()&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />
// 接受一个字符串，可<font COLOR="#FF0000">以接收空格并输出，</FONT></FONT><font COLOR="#FF0000">需包含“#include&lt;string&gt;”</FONT></STRONG></EM></P>
<p><font COLOR="#808080">#include&lt;iostream&gt;<br />
#include&lt;string&gt;<br />
using namespace std;<br />
main ()<br />
{<br />
string str;<br />
getline(cin,str);<br />
cout&lt;&lt;str&lt;&lt;endl;<br />

}</FONT></P>
<p>输入：jkljkljkl<br />
输出：jkljkljkl</P>
<p>输入：jkl jfksldfj jklsjfl<br />
输出：jkl jfksldfj jklsjfl</P>
<p>
和cin.getline()类似，但是cin.getline()属于istream流，而getline()属于string流，是不一样的两个函数</P>
<p><font COLOR="#FF0000"><strong><em>5、gets()&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />
//
接受一个字符串，可以接收空格并输出，需包含“#include&lt;string&gt;”</EM></STRONG></FONT></P>
<p><font COLOR="#808080">#include&lt;iostream&gt;<br />
#include&lt;string&gt;<br />
using namespace std;<br />
main ()<br />
{<br />
char m[20];<br />
gets(m);&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />
//不能写成m=gets();<br />
cout&lt;&lt;m&lt;&lt;endl;<br />

}</FONT></P>
<p>输入：jkljkljkl<br />
输出：jkljkljkl</P>
<p>输入：jkl jkl jkl<br />
输出：jkl jkl jkl</P>
<p>类似cin.getline()里面的一个例子，gets()同样可以用在多维数组里面：</P>
<p><font COLOR="#808080">#include&lt;iostream&gt;<br />
#include&lt;string&gt;<br />
using namespace std;</FONT></P>
<p><font COLOR="#808080">main ()<br />
{<br />
char m[3][20];<br />
for(int i=0;i&lt;3;i++)<br />
{<br />
cout&lt;&lt;"\n请输入第"&lt;&lt;i+1&lt;&lt;"个字符串："&lt;&lt;endl;<br />

gets(m[i]);<br />
}</FONT></P>
<p><font COLOR="#808080">cout&lt;&lt;endl;<br />
for(int j=0;j&lt;3;j++)<br />
cout&lt;&lt;"输出m["&lt;&lt;j&lt;&lt;"]的值:"&lt;&lt;m[j]&lt;&lt;endl;</FONT></P>
<p><font COLOR="#808080">}</FONT></P>
<p>请输入第1个字符串：<br />
kskr1</P>
<p>请输入第2个字符串：<br />
kskr2</P>
<p>请输入第3个字符串：<br />
kskr3</P>
<p>输出m[0]的值:kskr1<br />
输出m[1]的值:kskr2<br />
输出m[2]的值:kskr3</P>
<p>自我感觉gets()和cin.getline()的用法很类似，只不过cin.getline()多一个参数罢了；</P>
<p>
这里顺带说明一下，对于本文中的这个kskr1,kskr2,kskr3的例子，对于cin&gt;&gt;也可以适用，原因是这里输入的没有空格，如果输入了空格，比如“ks
kr jkl[回车]”那么cin就会已经接收到3个字符串，“ks,kr,jkl”；再如“kskr 1[回车]kskr
2[回车]”，那么则接收“kskr,1,kskr”；这不是我们所要的结果！而cin.getline()和gets()因为可以接收空格，所以不会产生这个错误；</P>
<p><strong><em><font COLOR="#FF0000">6、getchar()&nbsp;<wbr />&nbsp;<wbr />
//接受一个字符，需包含<font COLOR="#FF0000">“</FONT></FONT><font COLOR="#FF0000">#include&lt;string&gt;”</FONT></EM></STRONG></P>
<p><font COLOR="#808080">#include&lt;iostream&gt;<br />
#include&lt;string&gt;<br />
using namespace std;<br />
main ()<br />
{<br />
char ch;<br />
ch=getchar();&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />
//不能写成getchar(ch);<br />
cout&lt;&lt;ch&lt;&lt;endl;<br />

}</FONT></P>
<p>输入：jkljkljkl<br />
输出：j</P>
<p>//getchar()是C语言的函数，C++也可以兼容，但是尽量不用或少用；</P>
</DIV>]]></description>
            <author>大牙</author>
            <comments>http://blog.sina.com.cn/s/blog_49302a850100gyto.html#comment</comments>
            <pubDate>Sat, 12 Dec 2009 19:02:56 +0800</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_49302a850100gyto.html</guid>
        </item>
        <item>
            <title>总结TYPEDEF</title>
            <link>http://blog.sina.com.cn/s/blog_49302a850100gud9.html</link>
            <description><![CDATA[<p><strong><font SIZE="4">第一、四个用途</FONT></STRONG></P>
<p><strong>用途一：</STRONG></P>
<p>定义一种类型的别名，而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如：<br />
char* pa, pb; // 这多数不符合我们的意图，它只声明了一个指向字符变量的指针，<br />
// 和一个字符变量；<br />
以下则可行：<br />
typedef char* PCHAR; // 一般用大写<br />
PCHAR pa, pb; // 可行，同时声明了两个指向字符变量的指针<br />
虽然：<br />
char *pa, *pb;<br />
也可行，但相对来说没有用typedef的形式直观，尤其在需要大量指针的地方，typedef的方式更省事。</P>
<p><strong>用途二：</STRONG></P>
<p>
用在旧的C的代码中（具体多旧没有查），帮助struct。以前的代码中，声明struct新对象时，必须要带上struct，即形式为：
struct 结构名 对象名，如：<br />
struct tagPOINT1<br />
{<br />
int x;<br />
int y;<br />
};<br />
struct tagPOINT1 p1;</P>
<p>而在C++中，则可以直接写：结构名 对象名，即：<br />
tagPOINT1 p1;</P>
<p>估计某人觉得经常多写一个struct太麻烦了，于是就发明了：<br />
typedef struct tagPOINT<br />
{<br />
int x;<br />
int y;<br />
}POINT;</P>
<p>POINT p1; // 这样就比原来的方式少写了一个struct，比较省事，尤其在大量使用的时候</P>
<p>
或许，在C++中，typedef的这种用途二不是很大，但是理解了它，对掌握以前的旧代码还是有帮助的，毕竟我们在项目中有可能会遇到较早些年代遗留下来的代码。</P>
<p><strong>用途三：</STRONG></P>
<p>用typedef来定义与平台无关的类型。<br />
比如定义一个叫 REAL 的浮点类型，在目标平台一上，让它表示最高精度的类型为：<br />
typedef long double REAL;<br />
在不支持 long double 的平台二上，改为：<br />
typedef double REAL;<br />
在连 double 都不支持的平台三上，改为：<br />
typedef float REAL;<br />
也就是说，当跨平台时，只要改下 typedef 本身就行，不用对其他源码做任何修改。<br />
标准库就广泛使用了这个技巧，比如size_t。<br />
另外，因为typedef是定义了一种类型的新别名，不是简单的字符串替换，所以它比宏来得稳健（虽然用宏有时也可以完成以上的用途）。</P>
<p><strong>用途四：</STRONG></P>
<p>
为复杂的声明定义一个新的简单的别名。方法是：在原来的声明里逐步用别名替换一部分复杂声明，如此循环，把带变量名的部分留到最后替换，得到的就是原声明的最简化版。举例：</P>
<p>1. 原声明：int *(*a[5])(int, char*);<br />
变量名为a，直接用一个新别名pFun替换a就可以了：<br />
typedef int *(*pFun)(int, char*);<br />
原声明的最简化版：<br />
pFun a[5];</P>
<p>2. 原声明：void (*b[10]) (void (*)());<br />
变量名为b，先替换右边部分括号里的，pFunParam为别名一：<br />
typedef void (*pFunParam)();<br />
再替换左边的变量b，pFunx为别名二：<br />
typedef void (*pFunx)(pFunParam);<br />
原声明的最简化版：<br />
pFunx b[10];</P>
<p>3. 原声明：doube(*)() (*e)[9];<br />
变量名为e，先替换左边部分，pFuny为别名一：<br />
typedef double(*pFuny)();<br />
再替换右边的变量e，pFunParamy为别名二<br />
typedef pFuny (*pFunParamy)[9];<br />
原声明的最简化版：<br />
pFunParamy e;</P>
<p>理解复杂声明可用的“右左法则”：<br />
从变量名看起，先往右，再往左，碰到一个圆括号就调转阅读的方向；括号内分析完就跳出括号，还是按先右后左的顺序，如此循环，直到整个声明分析完。举例：<br />

int (*func)(int *p);<br />
首先找到变量名func，外面有一对圆括号，而且左边是一个*号，这说明func是一个指针；然后跳出这个圆括号，先看右边，又遇到圆括号，这说明(*func)是一个函数，所以func是一个指向这类函数的指针，即函数指针，这类函数具有int*类型的形参，返回值类型是int。<br />

int (*func[5])(int *);<br />
func右边是一个[]运算符，说明func是具有5个元素的数组；func的左边有一个*，说明func的元素是指针（注意这里的*不是修饰func，而是修饰func[5]的，原因是[]运算符优先级比*高，func先跟[]结合）。跳出这个括号，看右边，又遇到圆括号，说明func数组的元素是函数类型的指针，它指向的函数具有int*类型的形参，返回值类型为int。</P>
<p>也可以记住2个模式：<br />
type (*)(....)函数指针<br />
type (*)[]数组指针<br /></P>
<p><strong><font SIZE="4">第二、两大陷阱</FONT></STRONG></P>
<p><strong>陷阱一：</STRONG></P>
<p>记住，typedef是定义了一种类型的新别名，不同于宏，它不是简单的字符串替换。比如：<br />
先定义：<br />
typedef char* PSTR;<br />
然后：<br />
int mystrcmp(const PSTR, const PSTR);</P>
<p>const PSTR实际上相当于const char*吗？不是的，它实际上相当于char* const。<br />
原因在于const给予了整个指针本身以常量性，也就是形成了常量指针char* const。<br />
简单来说，记住当const和typedef一起出现时，typedef不会是简单的字符串替换就行。</P>
<p><strong>陷阱二：</STRONG></P>
<p>
typedef在语法上是一个存储类的关键字（如auto、extern、mutable、static、register等一样），虽然它并不真正影响对象的存储特性，如：<br />

typedef static int INT2; //不可行<br />
编译将失败，会提示“指定了一个以上的存储类”。</P>
<p><strong>以上资料出自：</STRONG><a HREF="http://blog.sina.com.cn/s/blog_4826f7970100074k.html" TARGET="_blank">http://blog.sina.com.cn/s/blog_4826f7970100074k.html</A>&nbsp;作者：赤龙</P>
<p><strong><font SIZE="4">第三、typedef 与
#define的区别</FONT></STRONG></P>
<p>案例一：</P>
<p>通常讲，typedef要比#define要好，特别是在有指针的场合。请看例子：</P>
<p>typedef char *pStr1;</P>
<p>#define pStr2 char *;</P>
<p>pStr1 s1, s2;</P>
<p>pStr2 s3, s4;</P>
<p>在上述的变量定义中，s1、s2、s3都被定义为char
*，而s4则定义成了char，不是我们所预期的指针变量，根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。</P>
<p>案例二：</P>
<p>下面的代码中编译器会报一个错误，你知道是哪个语句错了吗？</P>
<p>typedef char * pStr;</P>
<p>char string[4] = "abc";</P>
<p>const char *p1 = string;</P>
<p>const pStr p2 = string;</P>
<p>p1++;</P>
<p>p2++;</P>
<p>是p2++出错了。这个问题再一次提醒我们：typedef和#define不同，它不是简单的文本替换。上述代码中const
pStr p2并不等于const char * p2。const pStr p2和const long
x本质上没有区别，都是对变量进行只读限制，只不过此处变量p2的数据类型是我们自己定义的而不是系统固有类型而已。因此，const
pStr p2的含义是：限定数据类型为char *的变量p2为只读，因此p2++错误。</P>
<p><strong><font SIZE="4">第四部分资料：使用 typedef
抑制劣质代码</FONT></STRONG></P>
<p>作者：Danny Kalev<br />
编译：MTT 工作室</P>
<p>原文出处：Using typedef to Curb Miscreant Code</P>
<center>
<table STYLE="BorDer-CoLLApse: collapse" HEIGHT="61" CELLSPACING="0" CELLPADDING="0" WIDTH="92%" BORDER="0">
<tbody>
<tr>
<td WIDTH="100%" HEIGHT="61"><strong>摘要：</STRONG>Typedef
声明有助于创建平台无关类型，甚至能隐藏复杂和难以理解的语法。不管怎样，使用 typedef
能为代码带来意想不到的好处，通过本文你可以学习用 typedef 避免缺欠，从而使代码更健壮。</TD>
</TR>
</TBODY>
</TABLE>
</CENTER>
<p>typedef 声明，简称 typedef，为现有类型创建一个新的名字。比如人们常常使用 typedef
来编写更美观和可读的代码。所谓美观，意指 typedef
能隐藏笨拙的语法构造以及平台相关的数据类型，从而增强可移植性和以及未来的可维护性。本文下面将竭尽全力来揭示 typedef
强大功能以及如何避免一些常见的陷阱。</P>
<p>Q：如何创建平台无关的数据类型，隐藏笨拙且难以理解的语法?</P>
<p>A： 使用 typedefs 为现有类型创建同义字。</P>
<p><strong>定义易于记忆的类型名</STRONG><br />
　　typedef 使用最多的地方是创建易于记忆的类型名，用它来归档程序员的意图。类型出现在所声明的变量名字中，位于
''typedef'' 关键字右边。例如：</P>
<pre>
typedef int size;
</PRE>
<p>此声明定义了一个 int 的同义字，名字为 size。注意 typedef
并不创建新的类型。它仅仅为现有类型添加一个同义字。你可以在任何需要 int 的上下文中使用 size：</P>
<pre>
void measure(size * psz); size array[4];size len = file.getlength();std::vector &lt;size&gt; vs; 
</PRE>
<p>typedef 还可以掩饰符合类型，如指针和数组。例如，你不用象下面这样重复定义有 81 个字符元素的数组：</P>
<pre>
char line[81];char text[81];
</PRE>
<p>定义一个 typedef，每当要用到相同类型和大小的数组时，可以这样：</P>
<pre>
typedef char Line[81]; Line text, secondline;getline(text);
</PRE>
<p>同样，可以象下面这样隐藏指针语法：</P>
<pre>
typedef char * pstr;int mystrcmp(pstr, pstr);
</PRE>
<p>这里将带我们到达第一个 typedef 陷阱。标准函数 strcmp()有两个‘const char
*’类型的参数。因此，它可能会误导人们象下面这样声明 mystrcmp()：</P>
<pre>
int mystrcmp(const pstr, const pstr); 
</PRE>
<p>这是错误的，按照顺序，‘const pstr’被解释为‘char * const’（一个指向 char
的常量指针），而不是‘const char *’（指向常量 char 的指针）。这个问题很容易解决：</P>
<pre>
typedef const char * cpstr; int mystrcmp(cpstr, cpstr); // 现在是正确的
</PRE>
<p><strong>记住：</STRONG>不管什么时候，只要为指针声明 typedef，那么都要在最终的 typedef
名称中加一个 const，以使得该指针本身是常量，而不是对象。</P>
<p><strong>代码简化</STRONG><br />
　　上面讨论的 typedef 行为有点像 #define 宏，用其实际类型替代同义字。不同点是 typedef
在编译时被解释，因此让编译器来应付超越预处理器能力的文本替换。例如：</P>
<pre>
typedef int (*PF) (const char *, const char *);
</PRE>
<p>这个声明引入了 PF 类型作为函数指针的同义字，该函数有两个 const char * 类型的参数以及一个 int
类型的返回值。如果要使用下列形式的函数声明，那么上述这个 typedef 是不可或缺的：</P>
<pre>
PF Register(PF pf);
</PRE>
<p>Register() 的参数是一个 PF
类型的回调函数，返回某个函数的地址，其署名与先前注册的名字相同。做一次深呼吸。下面我展示一下如果不用
typedef，我们是如何实现这个声明的：</P>
<pre>
int (*Register (int (*pf)(const char *, const char *))) (const char *, const char *); 
</PRE>
<p>很少有程序员理解它是什么意思，更不用说这种费解的代码所带来的出错风险了。显然，这里使用 typedef
不是一种特权，而是一种必需。持怀疑态度的人可能会问：“OK，有人还会写这样的代码吗？”，快速浏览一下揭示 signal()函数的头文件
&lt;csinal&gt;，一个有同样接口的函数。</P>
<p><strong>typedef 和存储类关键字（storage class specifier）</STRONG><br />
　　这种说法是不是有点令人惊讶，typedef 就像 auto，extern，mutable，static，和 register
一样，是一个存储类关键字。这并是说 typedef 会真正影响对象的存储特性；它只是说在语句构成上，typedef 声明看起来象
static，extern 等类型的变量声明。下面将带到第二个陷阱：</P>
<pre>
typedef register int FAST_COUNTER; // 错误
</PRE>
<p>编译通不过。问题出在你不能在声明中有多个存储类关键字。因为符号 typedef 已经占据了存储类关键字的位置，在 typedef
声明中不能用 register（或任何其它存储类关键字）。</P>
<p><strong>促进跨平台开发</STRONG><br />
　　typedef 有另外一个重要的用途，那就是定义机器无关的类型，例如，你可以定义一个叫 REAL
的浮点类型，在目标机器上它可以i获得最高的精度：</P>
<pre>
typedef long double REAL; 
</PRE>
<p>在不支持 long double 的机器上，该 typedef 看起来会是下面这样：</P>
<pre>
typedef double REAL; 
</PRE>
<p>并且，在连 double 都不支持的机器上，该 typedef 看起来会是这样： 、</P>
<pre>
typedef float REAL; 
</PRE>
<p>你不用对源代码做任何修改，便可以在每一种平台上编译这个使用 REAL 类型的应用程序。唯一要改的是 typedef
本身。在大多数情况下，甚至这个微小的变动完全都可以通过奇妙的条件编译来自动实现。不是吗? 标准库广泛地使用 typedef
来创建这样的平台无关类型：size_t，ptrdiff 和 fpos_t 就是其中的例子。此外，象 std::string 和
std::ofstream 这样的 typedef
还隐藏了长长的，难以理解的模板特化语法，例如：basic_string&lt;char,
char_traits&lt;char&gt;，allocator&lt;char&gt;&gt;
和 basic_ofstream&lt;char,
char_traits&lt;char&gt;&gt;。</P>]]></description>
            <author>大牙</author>
            <comments>http://blog.sina.com.cn/s/blog_49302a850100gud9.html#comment</comments>
            <pubDate>Wed, 02 Dec 2009 22:00:01 +0800</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_49302a850100gud9.html</guid>
        </item>
        <item>
            <title>区别TYPEDEF&amp;DEFINE</title>
            <link>http://blog.sina.com.cn/s/blog_49302a850100gud6.html</link>
            <description><![CDATA[<p><strong>一、typedef的用法</STRONG></P>
<p>
在C/C++语言中，typedef常用来定义一个标识符及关键字的别名，它是语言编译过程的一部分，但它并不实际分配内存空间，实例像：</P>
<p>typedef&nbsp;&nbsp;&nbsp;
int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
INT;<br />
typedef&nbsp;&nbsp;&nbsp;
int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ARRAY[10];<br />
typedef&nbsp;&nbsp;
(int*)&nbsp;&nbsp; pINT;</P>
<p>typedef可以增强程序的可读性，以及标识符的灵活性，但它也有“非直观性”等缺点。</P>
<p><strong>二、#define的用法</STRONG></P>
<p>
#define为一宏定义语句，通常用它来定义常量(包括无参量与带参量)，以及用来实现那些“表面似和善、背后一长串”的宏，它本身并不在编</P>
<p>译过程中进行，而是在这之前(预处理过程)就已经完成了，但也因此难以发现潜在的错误及其它代码维护问题，它的实例像：</P>
<p>#define&nbsp;&nbsp;
INT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int<br />
#define&nbsp;&nbsp;
TRUE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1<br />
#define&nbsp;&nbsp;
Add(a,b)&nbsp;&nbsp;&nbsp;&nbsp;
((a)+(b));<br />
#define&nbsp;&nbsp;
Loop_10&nbsp;&nbsp;&nbsp; for
(int i=0; i&lt;10; i++)</P>
<p>在Scott Meyer的Effective
C++一书的条款1中有关于#define语句弊端的分析，以及好的替代方法，大家可参看。</P>
<p><strong>三、typedef与#define的区别</STRONG></P>
<p>
从以上的概念便也能基本清楚，typedef只是为了增加可读性而为标识符另起的新名称(仅仅只是个别名)，而#define原本在C中是为了定义常量</P>
<p>
，到了C++，const、enum、inline的出现使它也渐渐成为了起别名的工具。有时很容易搞不清楚与typedef两者到底该用哪个好，如#define</P>
<p>INT
int这样的语句，用typedef一样可以完成，用哪个好呢？我主张用typedef，因为在早期的许多C编译器中这条语句是非法的，只是现今的</P>
<p>
编译器又做了扩充。为了尽可能地兼容，一般都遵循#define定义“可读”的常量以及一些宏语句的任务，而typedef则常用来定义关键字、冗</P>
<p>长的类型的别名。</P>
<p>
宏定义只是简单的字符串代换(原地扩展)，而typedef则不是原地扩展，它的新名字具有一定的封装性，以致于新命名的标识符具有更易定义变</P>
<p>量的功能。请看上面第一大点代码的第三行：</P>
<p>typedef&nbsp;&nbsp;&nbsp;
(int*)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pINT;<br />
以及下面这行:<br />
#define&nbsp;&nbsp;&nbsp;
pINT2&nbsp;&nbsp;&nbsp;
int*</P>
<p>效果相同？实则不同！实践中见差别：pINT a,b;的效果同int *a; int
*b;表示定义了两个整型指针变量。而pINT2 a,b;的效果同int *a, b;</P>
<p>表示定义了一个整型指针变量a和整型变量b。</P>
<p><span STYLE="CoLor: #ff0000">注意：两者还有一个行尾;号的区别哦！</SPAN></P>]]></description>
            <author>大牙</author>
            <comments>http://blog.sina.com.cn/s/blog_49302a850100gud6.html#comment</comments>
            <pubDate>Wed, 02 Dec 2009 21:56:29 +0800</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_49302a850100gud6.html</guid>
        </item>
        <item>
            <title>typedef</title>
            <link>http://blog.sina.com.cn/s/blog_49302a850100gud3.html</link>
            <description><![CDATA[用途一：<br />
定义一种类型的别名，而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如：<br />
char*&nbsp;pa,&nbsp;pb;&nbsp;&nbsp;//&nbsp;这多数不符合我们的意图，它只声明了一个指向字符变量的指针，&nbsp;<br />

//&nbsp;和一个字符变量；<br />
以下则可行：<br />
typedef&nbsp;char*&nbsp;PCHAR;&nbsp;&nbsp;//&nbsp;一般用大写<br />

PCHAR&nbsp;pa,&nbsp;pb;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;可行，同时声明了两个指向字符变量的指针<br />

虽然：<br />
char&nbsp;*pa,&nbsp;*pb;<br />
也可行，但相对来说没有用typedef的形式直观，尤其在需要大量指针的地方，typedef的方式更省事。<br />
<br />
用途二：<br />
用在旧的C代码中（具体多旧没有查），帮助struct。以前的代码中，声明struct新对象时，必须要带上struct，即形式为：&nbsp;struct&nbsp;结构名&nbsp;对象名，如：<br />

struct&nbsp;tagPOINT1<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x;<br />

&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;y;<br />

};<br />
struct&nbsp;tagPOINT1&nbsp;p1;&nbsp;<br />

<br />
而在C++中，则可以直接写：结构名&nbsp;对象名，即：<br />
tagPOINT1&nbsp;p1;<br />
<br />
估计某人觉得经常多写一个struct太麻烦了，于是就发明了：<br />
typedef&nbsp;struct&nbsp;tagPOINT<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x;<br />

&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;y;<br />

}POINT;<br />
<br />
POINT&nbsp;p1;&nbsp;//&nbsp;这样就比原来的方式少写了一个struct，比较省事，尤其在大量使用的时候<br />

<br />
或许，在C++中，typedef的这种用途二不是很大，但是理解了它，对掌握以前的旧代码还是有帮助的，毕竟我们在项目中有可能会遇到较早些年代遗留下来的代码。<br />

<br />
用途三：<br />
用typedef来定义与平台无关的类型。<br />
比如定义一个叫&nbsp;REAL&nbsp;的浮点类型，在目标平台一上，让它表示最高精度的类型为：<br />

typedef&nbsp;long&nbsp;double&nbsp;REAL;&nbsp;<br />

在不支持&nbsp;long&nbsp;double&nbsp;的平台二上，改为：<br />

typedef&nbsp;double&nbsp;REAL;&nbsp;<br />

在连&nbsp;double&nbsp;都不支持的平台三上，改为：<br />
typedef&nbsp;float&nbsp;REAL;&nbsp;<br />

也就是说，当跨平台时，只要改下&nbsp;typedef&nbsp;本身就行，不用对其他源码做任何修改。<br />

标准库就广泛使用了这个技巧，比如size_t。<br />
另外，因为typedef是定义了一种类型的新别名，不是简单的字符串替换，所以它比宏来得稳健（虽然用宏有时也可以完成以上的用途）。<br />

<br />
用途四：<br />
为复杂的声明定义一个新的简单的别名。方法是：在原来的声明里逐步用别名替换一部分复杂声明，如此循环，把带变量名的部分留到最后替换，得到的就是原声明的最简化版。举例：<br />

<br />
1.&nbsp;原声明：int&nbsp;*(*a[5])(int,&nbsp;char*);<br />

变量名为a，直接用一个新别名pFun替换a就可以了：<br />
typedef&nbsp;int&nbsp;*(*pFun)(int,&nbsp;char*);&nbsp;<br />

原声明的最简化版：<br />
pFun&nbsp;a[5];&nbsp;<br />
<br />
2.&nbsp;原声明：void&nbsp;(*b[10])&nbsp;(void&nbsp;(*)());<br />

变量名为b，先替换右边部分括号里的，pFunParam为别名一：<br />
typedef&nbsp;void&nbsp;(*pFunParam)();<br />

再替换左边的变量b，pFunx为别名二：<br />
typedef&nbsp;void&nbsp;(*pFunx)(pFunParam);<br />

原声明的最简化版：<br />
pFunx&nbsp;b[10];<br />
<br />
3.&nbsp;原声明：doube(*)()&nbsp;(*e)[9];&nbsp;<br />

变量名为e，先替换左边部分，pFuny为别名一：<br />
typedef&nbsp;double(*pFuny)();<br />
再替换右边的变量e，pFunParamy为别名二<br />
typedef&nbsp;pFuny&nbsp;(*pFunParamy)[9];<br />

原声明的最简化版：<br />
pFunParamy&nbsp;e;&nbsp;<br />
<br />
理解复杂声明可用的“右左法则”：从变量名看起，先往右，再往左，碰到一个圆括号就调转阅读的方向；括号内分析完就跳出括号，还是按先右后左的顺序，如此循环，直到整个声明分析完。举例：<br />

int&nbsp;(*func)(int&nbsp;*p);<br />
首先找到变量名func，外面有一对圆括号，而且左边是一个*号，这说明func是一个指针；然后跳出这个圆括号，先看右边，又遇到圆括号，这说明(*func)是一个函数，所以func是一个指向这类函数的指针，即函数指针，这类函数具有int*类型的形参，返回值类型是int。<br />

int&nbsp;(*func[5])(int&nbsp;*);<br />
func右边是一个[]运算符，说明func是具有5个元素的数组；func的左边有一个*，说明func的元素是指针（注意这里的*不是修饰func，而是修饰func[5]的，原因是[]运算符优先级比*高，func先跟[]结合）。跳出这个括号，看右边，又遇到圆括号，说明func数组的元素是函数类型的指针，它指向的函数具有int*类型的形参，返回值类型为int。<br />

<br />
也可以记住2个模式：<br />
type&nbsp;(*)(....)函数指针&nbsp;<br />
type&nbsp;(*)[]数组指针&nbsp;<br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br />
<br />
陷阱一：<br />
记住，typedef是定义了一种类型的新别名，不同于宏，它不是简单的字符串替换。比如：<br />
先定义：<br />
typedef&nbsp;char*&nbsp;PSTR;<br />
然后：<br />
int&nbsp;mystrcmp(const&nbsp;PSTR,&nbsp;const&nbsp;PSTR);<br />

<br />
const&nbsp;PSTR实际上相当于const&nbsp;char*吗？不是的，它实际上相当于char*&nbsp;const。<br />

原因在于const给予了整个指针本身以常量性，也就是形成了常量指针char*&nbsp;const。<br />

简单来说，记住当const和typedef一起出现时，typedef不会是简单的字符串替换就行。<br />
<br />
陷阱二：<br />
typedef在语法上是一个存储类的关键字（如auto、extern、mutable、static、register等一样），虽然它并不真正影响对象的存储特性，如：<br />

typedef&nbsp;static&nbsp;int&nbsp;INT2;&nbsp;//不可行<br />

编译将失败，会提示“指定了一个以上的存储类”。]]></description>
            <author>大牙</author>
            <comments>http://blog.sina.com.cn/s/blog_49302a850100gud3.html#comment</comments>
            <pubDate>Wed, 02 Dec 2009 21:48:34 +0800</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_49302a850100gud3.html</guid>
        </item>
        <item>
            <title>字符串常量</title>
            <link>http://blog.sina.com.cn/s/blog_49302a850100gmgd.html</link>
            <description><![CDATA[<p>
字符串常量是双引号中的字符序列（可能是空的）。可以用字符常量所用的转义机制表示字符串中的字符。标准C语言允许在字符串型常量前面加上L前缀来指定宽字符串常量。</P>
<p>
对每个n字符的非宽字符串常量，运行时静态分配n+1个字符的内存块，其中前n个字符是字符串中的字符，最后一个字符是null字符'\0'。这个内存块是字符串常量的值，类型为char[n+1]。同样，宽字符串常量变成n个宽字符加上一个宽null字符，类型为wchar_t
[n+1]。</P>
<p>&nbsp;</P>
<p>&nbsp;</P>
<p>#include &lt;stdio.h&gt;</P>
<p>#include &lt;string.h&gt;</P>
<p>&nbsp;</P>
<p>int</P>
<p>main (int argc, char *argv[])</P>
<p>{</P>
<p>&nbsp; char str[] = "hello";</P>
<p>&nbsp;</P>
<p>&nbsp; printf ("strlen(\"%s\") = %d sizeof(\"%s\") =
%d\n", str, strlen (str), str,</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
sizeof (str));</P>
<p>&nbsp; printf ("strlen(\"%s\") = %d sizeof(\"%s\") =
%d\n", "hello",</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
strlen ("hello"), "hello", sizeof ("hello"));</P>
<p>&nbsp; printf ("strlen(\"%s\") = %d sizeof(\"%s\") =
%d\n", "", strlen (""), "",</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
sizeof (""));</P>
<p>&nbsp; return 0;</P>
<p>}</P>
<p><br />
结果：</P>
<p>&nbsp;</P>
<p>strlen("hello") = 5 sizeof("hello") = 6<br />
strlen("hello") = 5 sizeof("hello") = 6<br />
strlen("") = 0 sizeof("") = 1</P>]]></description>
            <author>大牙</author>
            <comments>http://blog.sina.com.cn/s/blog_49302a850100gmgd.html#comment</comments>
            <pubDate>Sat, 14 Nov 2009 23:30:47 +0800</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_49302a850100gmgd.html</guid>
        </item>
        <item>
            <title>宏</title>
            <link>http://blog.sina.com.cn/s/blog_49302a850100gmfp.html</link>
            <description><![CDATA[写好C语言，漂亮的宏定义很重要，使用宏定义可以防止出错，提高可移植性，可读性，方便性 等等。下面列举一些成熟软件中常用得宏定义：
<p>1，防止一个头文件被重复包含</P>
<p>#ifndef COMDEF_H</P>
<p>#define COMDEF_H</P>
<p>//头文件内容</P>
<p>#endif</P>
<p>2，重新定义一些类型，防止由于各种平台和编译器的不同，而产生的类型字节数差异，方便移植。</P>
<p>typedef&nbsp; unsigned
char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
boolean;&nbsp;&nbsp;&nbsp;&nbsp;</P>
<p>typedef&nbsp; unsigned long int&nbsp;
uint32;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P>
<p>typedef&nbsp; unsigned
short&nbsp;&nbsp;&nbsp;&nbsp;
uint16;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P>
<p>typedef&nbsp; unsigned
char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
uint8;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P>
<p>typedef&nbsp; signed long
int&nbsp;&nbsp;&nbsp;
int32;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P>
<p>typedef&nbsp; signed
short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int16;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P>
<p>typedef&nbsp; signed
char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int8;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;</P>
<p>//下面的不建议使用</P>
<p>typedef&nbsp; unsigned
char&nbsp;&nbsp;&nbsp;&nbsp;
byte;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P>
<p>typedef&nbsp; unsigned
short&nbsp;&nbsp;&nbsp;
word;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P>
<p>typedef&nbsp; unsigned
long&nbsp;&nbsp;&nbsp;&nbsp;
dword;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P>
<p>typedef&nbsp; unsigned
char&nbsp;&nbsp;&nbsp;&nbsp;
uint1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P>
<p>typedef&nbsp; unsigned
short&nbsp;&nbsp;&nbsp;
uint2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P>
<p>typedef&nbsp; unsigned
long&nbsp;&nbsp;&nbsp;&nbsp;
uint4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P>
<p><br />
typedef&nbsp; signed
char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P>
<p>typedef&nbsp; signed
short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P>
<p>typedef&nbsp; long
int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P>
<p><br />
typedef&nbsp; signed
long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
sint31;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P>
<p>typedef&nbsp; signed
short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
sint15;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P>
<p>typedef&nbsp; signed
char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
sint7;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P>
<p>3，得到指定地址上的一个字节或字</P>
<p>#define&nbsp; MEM_B( x )&nbsp; ( *(
(byte *) (x) ) )</P>
<p>#define&nbsp; MEM_W( x )&nbsp; ( *(
(word *) (x) ) )</P>
<p>4，求最大值和最小值</P>
<p>&nbsp;&nbsp; #define&nbsp;
MAX( x, y ) ( ((x) &gt; (y)) ? (x) : (y) )</P>
<p>&nbsp;&nbsp; #define&nbsp;
MIN( x, y ) ( ((x) &lt; (y)) ? (x) : (y) )</P>
<p>5，得到一个field在结构体(struct)中的偏移量</P>
<p>#define FPOS( type, field ) \</P>
<p>( (dword) &amp;(( type *) 0)-&gt; field
)</P>
<p>6,得到一个结构体中field所占用的字节数</P>
<p>#define FSIZ( type, field ) sizeof( ((type *)
0)-&gt;field )</P>
<p>7，按照LSB格式把两个字节转化为一个Word</P>
<p>#define&nbsp; FLIPW( ray ) ( (((word) (ray)[0]) *
256) + (ray)[1] )</P>
<p>8，按照LSB格式把一个Word转化为两个字节</P>
<p>#define&nbsp; FLOPW( ray, val ) \</P>
<p>&nbsp; (ray)[0] = ((val) / 256); \</P>
<p>&nbsp; (ray)[1] = ((val) &amp; 0xFF)</P>
<p>9，得到一个变量的地址（word宽度）</P>
<p>#define&nbsp; B_PTR( var )&nbsp; ( (byte
*) (void *) &amp;(var) )</P>
<p>#define&nbsp; W_PTR( var )&nbsp; ( (word
*) (void *) &amp;(var) )</P>
<p>10，得到一个字的高位和低位字节</P>
<p>#define&nbsp; WORD_LO(***)&nbsp; ((byte)
((word)(***) &amp; 255))</P>
<p>#define&nbsp; WORD_HI(***)&nbsp; ((byte)
((word)(***) &gt;&gt; 8))</P>
<p>11，返回一个比X大的最接近的8的倍数</P>
<p>#define RND8( x
)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
((((x) + 7) / 8 ) * 8 )</P>
<p>12，将一个字母转换为大写</P>
<p>#define&nbsp; UPCASE( c ) ( ((c) &gt;=
'a' &amp;&amp; (c) &lt;= 'z') ?
((c) - 0x20) : (c) )</P>
<p>13，判断字符是不是10进值的数字</P>
<p>#define&nbsp; DECCHK( c ) ((c) &gt;= '0'
&amp;&amp; (c) &lt;= '9')</P>
<p>14，判断字符是不是16进值的数字</P>
<p>#define&nbsp; HEXCHK( c ) ( ((c) &gt;=
'0' &amp;&amp; (c) &lt;= '9')
||\</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
((c) &gt;= 'A' &amp;&amp; (c)
&lt;= 'F') ||\</P>
<p>((c) &gt;= 'a' &amp;&amp;
(c) &lt;= 'f') )</P>
<p>15，防止溢出的一个方法</P>
<p>#define&nbsp; INC_SAT( val )&nbsp; (val
= ((val)+1 &gt; (val)) ? (val)+1 : (val))</P>
<p>16，返回数组元素的个数</P>
<p>#define&nbsp; ARR_SIZE( a )&nbsp; (
sizeof( (a) ) / sizeof( (a[0]) ) )</P>
<p>17，返回一个无符号数n尾的值MOD_BY_POWER_OF_TWO(X,n)=X%(2^n)</P>
<p>#define MOD_BY_POWER_OF_TWO( val, mod_by ) \</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
( (dword)(val) &amp; (dword)((mod_by)-1) )</P>
<p>18，对于IO空间映射在存储空间的结构，输入输出处理</P>
<p>&nbsp; #define
inp(port)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(*((volatile byte *) (port)))</P>
<p>&nbsp; #define
inpw(port)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(*((volatile word *) (port)))</P>
<p>&nbsp; #define
inpdw(port)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(*((volatile dword *)(port)))</P>
<p>&nbsp; #define outp(port,
val)&nbsp;&nbsp; (*((volatile byte *)
(port)) = ((byte) (val)))</P>
<p>&nbsp; #define outpw(port, val)&nbsp;
(*((volatile word *) (port)) = ((word) (val)))</P>
<p>&nbsp; #define outpdw(port, val) (*((volatile dword
*) (port)) = ((dword) (val)))</P>
<p><br />
19,使用一些宏跟踪调试</P>
<p>A N S I标准说明了五个预定义的宏名。它们是：</P>
<p>_ L I N E _</P>
<p>_ F I L E _</P>
<p>_ D A T E _</P>
<p>_ T I M E _</P>
<p>_ S T D C _</P>
<p>如果编译不是标准的，则可能仅支持以上宏名中的几个，或根本不支持。记住编译程序</P>
<p>也许还提供其它预定义的宏名。</P>
<p>_ L I N E _及_ F I L E _宏指令在有关# l i n e的部分中已讨论，这里讨论其余的宏名。</P>
<p>_ D AT E _宏指令含有形式为月/日/年的串，表示源文件被翻译到代码时的日期。</P>
<p>源代码翻译到目标代码的时间作为串包含在_ T I M E _中。串形式为时：分：秒。</P>
<p>如果实现是标准的，则宏_ S T D C _含有十进制常量1。如果它含有任何其它数，则实现是</P>
<p>非标准的。</P>
<p>可以定义宏，例如:</P>
<p>当定义了_DEBUG，输出数据信息和所在文件所在行</P>
<p>#ifdef _DEBUG</P>
<p>#define DEBUGMSG(msg,date)
printf(msg);printf(“%d%d%d”,date,_LINE_,_FILE_)</P>
<p>#else</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#define DEBUGMSG(msg,date)&nbsp;</P>
<p>#endif</P>
<p><br />
20，宏定义防止使用是错误</P>
<p>用小括号包含。</P>
<p>例如：#define ADD(a,b) （a+b）</P>
<p>用do{}while(0)语句包含多语句防止错误</P>
<p>例如：#difne DO(a,b) a+b;\</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
a++;</P>
<p>应用时：if(….)</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
DO(a,b); //产生错误</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
else</P>]]></description>
            <author>大牙</author>
            <comments>http://blog.sina.com.cn/s/blog_49302a850100gmfp.html#comment</comments>
            <pubDate>Sat, 14 Nov 2009 22:41:19 +0800</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_49302a850100gmfp.html</guid>
        </item>
        <item>
            <title>面试</title>
            <link>http://blog.sina.com.cn/s/blog_49302a850100gloy.html</link>
            <description><![CDATA[<p>
はじめまして、XXXと申（もう）します。今年（ことし）25歳（さい）です。私の専门（せんもん）は国际贸易（こくさいぼうえき）です。英语検定（えいごけんてい）CET6の资格（しかく）を持っています。三年间（さんねんかん）の仕事経験（しごとけいけん）も持っています。<br />

<br />
XXX会社はXXX市において17年の历史（れきし）があります。その地域（ちいき）の最大（さいだい）な外资系会社（がいしけいかいしゃ）です。私は6S管理（かんり）と品质管理（ひんしつかんり）についてある程度（ていど）理解（りかい）しています。私は貴社（きしゃ）に勤（つと）めたい気持ちが非常に强くて、会社のほかの社员（しゃいん）さんと同じように梦を持って仕事したいと思っています。<br />

<br />
私は日本语を学んだことがありますが、话しのほうが上手とは言えません。简単（かんたん）な会话ぐらいできます。でも、これからも精一杯（せいいっぱい）に顽张りたいと思っています。</P>
<p>您好！我叫XXX，今年25岁，国际贸易专业毕业，英语通过CET6考试了。已我经工作了3年时间。<br />
おはようございます。XXXと申します。今年は25歳、専门は国际贸易です。中国の英语试験CET6を取って、ほかの会社で三年の経験になりました。<br />

XXX公司在XXX市已有17年历史了，是该地区最大的外企。我对6S管理和品质管理有一定的了解。我非常想在贵公司工作，和公司的其他员工一样报着梦想工作。<br />

XXX市に17年间営业してきたXXX会社は、この周り最大の外资企业です。ですから、そこで働いてるときに6S管理と品质管理について少々勉强になりました。こんな経験になった私は、贵社の社员たちと一绪に同じ梦を持って贵社で働きたいのです。<br />

我学习过日语，但是日语讲的不是很好,只会些简单的，请不要介意.我会继续学习的。<br />
前は日本语を勉强しましたけれども、発音は苦手です。简単な挨拶や指示までです。しかし、もしチャンスがあれば、きっと勉强し続けたいのです。顽张ります。<br />

谢谢！<br />
ありがとうございます。</P>]]></description>
            <author>大牙</author>
            <comments>http://blog.sina.com.cn/s/blog_49302a850100gloy.html#comment</comments>
            <pubDate>Thu, 12 Nov 2009 20:14:12 +0800</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_49302a850100gloy.html</guid>
        </item>
        <item>
            <title>面试</title>
            <link>http://blog.sina.com.cn/s/blog_49302a850100glon.html</link>
            <description><![CDATA[<br />
2 面试的步骤<br />
面试大概的步骤如下<br />
（1） 入室<br />
（2） 自我介绍<br />
（3） 回答问题<br />
（4） 退出<br />
<br />
3 入室<br />
对于一个参加面试的人来说礼仪十分重要的，开关门要轻，进门后要鞠躬致意，轻声打招呼“しつれいします”（“打搅了”）。然后走到面试者的座位左侧站立再要鞠躬，同时轻声打招呼“<a HREF="http://bbs.veduchina.com/">よろしくおねがいします</A>”（“请多多关照”）。待主考官示意或说“すわってください”（“请坐”）后入座。坐下时一定要腰板挺直，双腿并拢，眼睛目视主考官。还应把双手搭在膝上。等待主考官进一步面试提问。<br />

<br />
4 自我介绍<br />
在一般情况下考官对面试者说的第一句话是“まずは自己(じこ)紹介(しょうかい)からお願(ねが)いします”（“首先请您作一下自我介绍”）。然后面试者开始自我介绍。
<font COLOR="#FFFFFF">日语面试常识与技巧</FONT><br />
<br />
自我介绍的例子如下：<br />
私(わたし)は、王(おう)建国(けんこく)<a HREF="http://bbs.veduchina.com/">と申(もう)します</A>。<br />
1975(せんきゅうひゃくななじゅうご)年(ねん)生(う)まれで、今年(ことし)28(にじゅうはっ)歳(さい)です。<br />
1997(せんきゅうひゃくきゅうじゅうなな)年(ねん)に上海(しゃんはい)交通(こうつう)大学(だいがく)を卒業(そつぎょう)しました。<br />

上海(しゃんはい)交通(こうつう)大学(だいがく)では、コンピュータを専攻(せんこう)していました。<br />
上海(しゃんはい)交通(こうつう)大学(だいがく)卒業後(そつぎょうご)は、上海(しゃんはい)啓明(けいめい)に入社(にゅうしゃ)し、主(おも)にＪＡＶＡ(じゃば)での開発(かいはつ)に従事(じゅうじ)しています。<br />

日本(にほん)向(む)けの開発(かいはつ)経験(けいけん)は豊富(ほうふ)で、日本語(にほんご)の<a HREF="http://bbs.veduchina.com/">読(よ)み書(か)きは</A>問題(もんだい)ありません。聞(き)き取(と)りと会話(かいわ)は少(すこ)し苦手(にがて)ですが、今後(こんご)努力(どりょく)して能力(のうりょく)を高(たか)めるつもりです。
<font COLOR="#FFFFFF">日语面试常识与技巧</FONT><br />
<br />
5 回答问题<br />
考官往往会从简单的问题开始，然后逐渐到比较专业的问题来提问。面试者如果遇到听不懂的问题时，可以对考官说“すみません。もう一度(いちど)言(い)ってください”（“对不起，请再说一遍”）。如果考官重复以后还是听不懂的话，则回答“すみません。よくわかりません”（“对不起，听不懂”）。<br />

<br />
6 退出<br />
面试结束后要起身，在面试者座位左侧站立鞠躬，同时说“ありがとうございました”（“谢谢”）。然后走到门口开门，出去后将门关闭时再要鞠躬并说“しつれいしました”（“打搅了”）。<br />

<br />
7 常见问题<br />
どのような<a HREF="http://bbs.veduchina.com/">実務</A>(じつむ)経験(けいけん)がありますか。（你有什么样的工作经验？）<br />

→ＪＡＶＡ(じゃば)、ＣＯＢＯＬ(こぼる)での開発(かいはつ)経験(けいけん)があります。（我有JAVA和COBOL的开发经验）
<font COLOR="#FFFFFF">日语面试常识与技巧</FONT><br />
<br />
どの言語(げんご)での開発(かいはつ)が得意(とくい)ですか。（你擅长的开发语言是什么？）<br />
→私(わたし)が得意(とくい)な開発(かいはつ)言語(げんご)は、ＪＡＶＡ(じゃば)です。（我擅长的开发语言是JAVA）<br />
<br />
&#9675;&#9675;(まるまる)のプロジェクトでは、何(なに)をされていたのですか。（在某某项目中你负责什么样的工作？）<br />
→&#9675;&#9675;(まるまる)のプロジェクトでは、コーディンゲとテストを担当(たんとう)しました。（在某某项目中我但当编程和测试）<br />
Ｃの開発(かいはつ)経験(けいけん)はありますか。（你有没有C语言的开发经验？）<br />
→Ｃの開発(かいはつ)経験(けいけん)は少(すこ)しあります。（我有一点C语言的开发经验）<br />
<br />
Ｃではどのような開発(かいはつ)経験(けいけん)がありますか。（你用C语言有怎样的开发经验？）<br />
→画像(がぞう)処理(しょり)のプロゲラムを開発(かいはつ)したことがあります。（我增经参与处理图像程序的开发）<br />
<br />
開発(かいはつ)期間(きかん)はどれくらいでしたか。（开发期有多长时间？）<br />
→三ヶ月(さんかげつ)でした。（是三个月） 日语面试常识与技巧<br />
<br />
どのような長所(ちょうしょ)がありますか。（你的优点是什么？）<br />
→長所(ちょうしょ)は、まじめで機転(きてん)が利(き)き、<a HREF="http://bbs.veduchina.com/">協調性(</A>きょうちょうせい)があることです。（我的优点是认真，思维敏捷，团队精神）
<font COLOR="#FFFFFF">日语面试常识与技巧</FONT><br />
<br />
仕事(しごと)では、どのようなことに興味(きょうみ)がありますか。（你对工作哪个方面最感兴趣？）<br />
→私(わたし)は、ネットワーク技術(ぎじゅつ)を利用(りよう)した開発(かいはつ)に興味(きょうみ)があります。（我对利用网络技术的开发最感兴趣）<br />

<br />
仕事(しごと)以外(いがい)に、どのようなことに興味(きょうみ)がありますか。（除了工作以外，你对什么样的事情最感兴趣？）<br />
→私(わたし)は、旅行(りょこう)に興味(きょうみ)があります。（我对旅游最感兴趣）<br />
<br />
日本語(にほんご)はどこで習(なら)いましたか。（你在哪里学的日语？）<br />
→自分(じぶん)で勉強(べんきょう)しました。（我自己学习的）<br />
<br />
日本語(にほんご)はどれくらい勉強(べんきょう)されましたか。（你学日语多长时间？）<br />
→一年(いちねん)ぐらい勉強(べんきょう)しました。（大概学了一年）]]></description>
            <author>大牙</author>
            <comments>http://blog.sina.com.cn/s/blog_49302a850100glon.html#comment</comments>
            <pubDate>Thu, 12 Nov 2009 20:03:10 +0800</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_49302a850100glon.html</guid>
        </item>
    </channel>
</rss>

