<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="FeedCreator 1.8" -->
<?xml-stylesheet href="https://www.gwduan.com/wiki/lib/exe/css.php?s=feed" type="text/css"?>
<rdf:RDF
    xmlns="http://purl.org/rss/1.0/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    xmlns:dc="http://purl.org/dc/elements/1.1/">
    <channel rdf:about="https://www.gwduan.com/wiki/feed.php">
        <title>响水凹 - computer:c:tips</title>
        <description>欢迎来到 Guang-Wen Duan (Dennis Duan) 的个人 Wiki</description>
        <link>https://www.gwduan.com/wiki/</link>
        <image rdf:resource="https://www.gwduan.com/wiki/lib/exe/fetch.php?media=wiki:dokuwiki.svg" />
       <dc:date>2026-04-13T01:34:21+00:00</dc:date>
        <items>
            <rdf:Seq>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:alignment&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:array_and_pointer&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:assignment_conversions&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:binary_conversions&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:binary_subtraction_and_unsigned&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:bitwise_shift&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:byte_order&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:casting_conversions&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:character_constant&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:character_encoding&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:comment&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:complicated_type&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:conditional_compliation&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:const_pointer_expr&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:const_with_pointer&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:copy_entire_array&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:decl_organization&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:end_of_line&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:error_command&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:escape_character&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:evaluation_order&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:execution_character_set&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:external_name_in_files&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:feature&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:file_inclusion&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:float_constant&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:function_argument_conversions&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:greedy_rule&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:history&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:identifier&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:integer_constant&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:invalid_pointer&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:line_command&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:logical_and_or&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:macro_expansion&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:macro_merging&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:macro_stringization&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:macro_with_parameters&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:overflow&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:precedence_of_operators&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:predifined_macros&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:preprocessor&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:sequence_point&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:sign_of_char&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:sizeof&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:size_of_pointer&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:stdc_version&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:string_constant&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:struct_layout&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:struct_offset&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:struct_pad_size&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:typedef_varlen_array&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:type_compatibility&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:type_conversions&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:type_conversions_rules&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:unary_conversions&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:unary_minus_and_unsigned&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:undef_command&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:use_of_unsigned&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:void&amp;rev=1414807369&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:whitespace&amp;rev=1414807369&amp;do=diff"/>
            </rdf:Seq>
        </items>
    </channel>
    <image rdf:about="https://www.gwduan.com/wiki/lib/exe/fetch.php?media=wiki:dokuwiki.svg">
        <title>响水凹</title>
        <link>https://www.gwduan.com/wiki/</link>
        <url>https://www.gwduan.com/wiki/lib/exe/fetch.php?media=wiki:dokuwiki.svg</url>
    </image>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:alignment&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>alignment</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:alignment&amp;rev=1414807369&amp;do=diff</link>
        <description>对齐限制（Alignment）

很多计算机出于效率等原因的考虑，对数据对象在内存中的存储地址有一定的限制。比如，某种计算机要求一个32位（4字节）整数的存放地址必须是4的倍数，此时称这种整数的对齐模数（alignment modulus）为4。如果违反了这个限制，可能会导致运行时错误，或者意想不到的结果。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:array_and_pointer&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>array_and_pointer</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:array_and_pointer&amp;rev=1414807369&amp;do=diff</link>
        <description>数组不转换为指针的场合

数组与指针的关系很密切，很多时候数组会转换成指针使用，比如一元转换、函数参数转换。

但以下场合例外：

	*  sizeof，此时返回的是整个数组的大小（size），而不是一个指针的大小；</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:assignment_conversions&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>assignment_conversions</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:assignment_conversions&amp;rev=1414807369&amp;do=diff</link>
        <description>赋值转换（Assignment conversions）

赋值表达式两边的表达式类型应该是一样的，当不一样时，则发生转换。

需要特别关注的是指针赋值规则：左边指针指向的类型必须拥有右边指针指向类型的所有类型限定符（type qualifier），此外，左边指向的类型要与右边指向类型相兼容（参见：</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:binary_conversions&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>binary_conversions</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:binary_conversions&amp;rev=1414807369&amp;do=diff</link>
        <description>二元转换（Binary conversions）

二元转换发生在二元操作符的两个操作数以及条件表达式的第二、第三操作数。

进行二元转换之前，每个操作数先独立的进行一元转换，之后，如果尚需转换的话，再进行二元转换。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:binary_subtraction_and_unsigned&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>binary_subtraction_and_unsigned</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:binary_subtraction_and_unsigned&amp;rev=1414807369&amp;do=diff</link>
        <description>二元减法与无符号数

当二元减法的两个操作数都是算术类型时，结果类型是两个操作数根据二元转换规则转换后的类型。

因此，当转换后的两个操作数都是无符号类型时（转换后的最小无符号类型是unsigned int），结果依旧是无符号类型。所以，即使被减数&lt;减数，结果也不会为负数，这点需要注意。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:bitwise_shift&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>bitwise_shift</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:bitwise_shift&amp;rev=1414807369&amp;do=diff</link>
        <description>移位操作符的注意事项

移位操作符&lt;&lt;和&gt;&gt;的两个操作数必须是整数，与一般二元操作不同的是，两个操作数分别进行一元转换，结果类型为第一操作数转换为的类型。

移位次数（第二操作数）必须大于等于0，且小于被移位数（第一操作数）的bit位数，否则结果是未定义的（undefined）。例如，被移位数是一个32位的int整数，则第二操作数的合法取值范围是0～31。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:byte_order&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>byte_order</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:byte_order&amp;rev=1414807369&amp;do=diff</link>
        <description>字节序（Byte order）

对于字节编址（byte-addressable）的计算机，通常存在两种字节序：

	*  高端字节序（big-endian, left-to-right）
	*  小端字节序（little-endian, right-to-left）

比如一个32位（4字节）的整数0x01020304，下面是两种字节序的存储图示（A代表地址）：</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:casting_conversions&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>casting_conversions</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:casting_conversions&amp;rev=1414807369&amp;do=diff</link>
        <description>强制转换（Casting conversions）

在类型转换规则中提到的各种类型之间的转换可以通过强制转换明确进行，此时将不会产生告警信息。

标准C不允许一个函数指针和一个对象指针进行强制转换。

标准C规定，一个对象指针转换为void *指针，之后再转换回来，指针的原始值保持不变。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:character_constant&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>character_constant</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:character_constant&amp;rev=1414807369&amp;do=diff</link>
        <description>字符常量（Character constant）

字符常量由单引号（&#039;）包含的一个或多个字符构成。标准C允许使用前缀L来表示宽字符常量。

常量中可以使用反斜杆（\）实现转义。如果常量中要包含单引号（&#039;）和反斜杆（\），则需要转义。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:character_encoding&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>character_encoding</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:character_encoding&amp;rev=1414807369&amp;do=diff</link>
        <description>不能假设所使用的字符编码（Character encoding）

不同计算机上的字符编码可能是不同的。一个常见的C程序错误，就是对使用的字符编码做出假设。如通过如下表达式来获得大写字母的数目：</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:comment&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>comment</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:comment&amp;rev=1414807369&amp;do=diff</link>
        <description>注释（Comment）

C有两种注释方法：

	*  传统的方式，即从/*开始，到*/的第一次出现结束。
	*  C99开始引入第二种方式，即从//开始，到本行末尾(不包括行结束符)。这种新的注释方式可能会导致旧代码出现兼容问题，不是很建议使用。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:complicated_type&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>complicated_type</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:complicated_type&amp;rev=1414807369&amp;do=diff</link>
        <description>复杂类型声明的分析

C语言的类型声明可以很简单，如仅仅声明一个int变量、指向int的指针、int数组等。也可以将这些简单类型组合起来构成很复杂的类型。

要分析这些复杂声明，关键是记住优先级：</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:conditional_compliation&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>conditional_compliation</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:conditional_compliation&amp;rev=1414807369&amp;do=diff</link>
        <description>条件编译（Conditional compliation）

通过#if、#elif、#ifdef、#ifndef、#else、#endif等预编译指令选择进行下一步编译的代码。

基本形式如下：


#if constant-expression-1
        group-of-lines-1
#elif constant-expression-2
        group-of-lines-2
...
#elif constant-expression-n
        group-of-lines-n
#else
        last-group-of-lines
#endif</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:const_pointer_expr&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>const_pointer_expr</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:const_pointer_expr&amp;rev=1414807369&amp;do=diff</link>
        <description>常量指针表达式

当对全局（external）与静态（static）变量进行初始化时，初始化表达式必须是常量表达式。当变量是指针时，相应的常量指针表达式如何构成呢？

一般有如下几种方法：

1. 空指针。如：</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:const_with_pointer&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>const_with_pointer</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:const_with_pointer&amp;rev=1414807369&amp;do=diff</link>
        <description>const与指针

由于指针的特殊性，当使用const类型限定符时，不同的位置有不同的含义。

例如：


int * const p;


这里p是一个常量指针，即p的值不能修改，但p引用的对象的值可以修改。

而：</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:copy_entire_array&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>copy_entire_array</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:copy_entire_array&amp;rev=1414807369&amp;do=diff</link>
        <description>复制整个数组的一个方法

我们知道，无法通过赋值操作实现两个数组的复制。下面的代码是非法的：


        int a[10], b[10];
        a = b;


由于标准C支持struct/union对象的赋值操作，因而可以将数组嵌在struct/union内，来实现数组的复制。如：</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:decl_organization&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>decl_organization</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:decl_organization&amp;rev=1414807369&amp;do=diff</link>
        <description>声明的组织形式

C语言的类型声明部分，除了类型名（type）本身外，还可以包含存储类别（storage-class）、类型限定符（type-qualifier），C99还增加了函数限定符（function-specifier）。

从语法上说，这四者在声明部分的顺序是无所谓的，但通常的风格是按如下的顺序来组织：</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:end_of_line&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>end_of_line</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:end_of_line&amp;rev=1414807369&amp;do=diff</link>
        <description>行结束符（End-of-line）

行结束符（End-of-line）用来标记C源程序中一行源代码的结束，跟在该结束符后的第一个字符被认作下一行的第一个字符。

可以通过反斜杆（\）将多个源代码行合并成一个逻辑行，合并时反斜杆和之后的行结束符被删除。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:error_command&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>error_command</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:error_command&amp;rev=1414807369&amp;do=diff</link>
        <description>#error出错

#error指令产生一个编译时错误信息。

示例：


#if (SIZE % 256) != 0
#error &quot;SIZE must be a multiple of 256!&quot;
#endif</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:escape_character&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>escape_character</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:escape_character&amp;rev=1414807369&amp;do=diff</link>
        <description>转义字符(Escape character）

转义字符有两种形式：符号形式和数字形式。

符号形式的有如下几个：
\a      alert(e.g., bell)    响铃        \b      backspace            回退        \f      form feed            换页</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:evaluation_order&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>evaluation_order</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:evaluation_order&amp;rev=1414807369&amp;do=diff</link>
        <description>求值顺序（Evaluation order）

C语言中，某些运算的顺序是确定的，而其他运算的顺序则不确定。

例如表达式：


        f(a) &lt; f(b) &amp;&amp; f(c) &gt; f(d)


这里f(a) &lt; f(b)会先计算，根据比较结果才决定是否执行</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:execution_character_set&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>execution_character_set</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:execution_character_set&amp;rev=1414807369&amp;do=diff</link>
        <description>执行字符集（Execution Character Set）

编写C代码时所用的字符集（source character set）和生成的执行程序所用的字符集（execution character set：执行字符集）不一定是相同的，比如交叉编译（Cross Compile）的时候。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:external_name_in_files&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>external_name_in_files</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:external_name_in_files&amp;rev=1414807369&amp;do=diff</link>
        <description>在多个文件中共享external name的方法

全局变量和函数经常在多个地方使用，保持其定义与声明的一致性是程序员的责任。编译器没能力发现所有的不一致问题，不一致的后果可能在运行时才暴露。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:feature&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>feature</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:feature&amp;rev=1414807369&amp;do=diff</link>
        <description>C的特点

C wears well as one&#039;s experience with it grows.(Brain W. Kernighan, Dennis M. Ritchie, The C Programming Language)

C语言编程是一门技艺，需要多年历练才能达到较为完善的境界。一个头脑敏捷的人很快就能学会C语言中基础的东西。但要品味出C语言的细微之处，并通过大量编写各种不同程序成为C语言专家，则耗时甚巨。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:file_inclusion&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>file_inclusion</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:file_inclusion&amp;rev=1414807369&amp;do=diff</link>
        <description>#include文件包含（File inclusion）

标准C支持三种形式的#include指令：

	*  #include &lt;...&gt;
	*  #include &quot;...&quot;
	*  #inlcude preprocessor-tokens

&lt;&gt;和&quot;&quot;之间的内容通常是一个依赖于实现的文件名，文件名中可以有三元组（trigraph）和续行符。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:float_constant&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>float_constant</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:float_constant&amp;rev=1414807369&amp;do=diff</link>
        <description>浮点常量（Floating-point constant）

浮点常量除了用小数点表示，也可以有指数部分，以e或E开头。

标准C允许添加后缀来指定浮点类型，f或F表示float类型，l或L表示long double，不指定后缀则为double型。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:function_argument_conversions&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>function_argument_conversions</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:function_argument_conversions&amp;rev=1414807369&amp;do=diff</link>
        <description>函数参数转换（Function argument conversions）

对于没有原型（prototype）控制的函数参数，在传递给函数前要进行转换，转换规则同一元转换规则。唯一例外是float类型，即使在标准C下，也要提升为double。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:greedy_rule&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>greedy_rule</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:greedy_rule&amp;rev=1414807369&amp;do=diff</link>
        <description>词法分析的贪心法则

编译器在进行词法分析时，总是从左到右，尽可能的获取词法单位，即使最终可能导致错误的程序。

例如：


	b--x;


词法分析的结果为b，--，x，这是一个无效的语句。虽然分解为b，-，-，x能得到合法的结果，但这不是编译器的行为。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:history&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>history</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:history&amp;rev=1414807369&amp;do=diff</link>
        <description>UNIX和C的起源

1969年，Multics项目失败后，贝尔实验室的Ken Thompson使用汇编语言在PDP-7系统上编写了一个简易的操作系统，1970年，Brain Kernighan给它取名为UNIX。

使用汇编语言很繁琐，所以，Ken Thompson尝试开发新的语言，他在BCPL语言的基础上进行了简化，创建了无类型的B语言，但B语言从来没有真正成功应用过。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:identifier&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>identifier</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:identifier&amp;rev=1414807369&amp;do=diff</link>
        <description>标识符的限制（Identifier）

标识符的命名不能与关键字相同，不能与标准库中的名字相同；此外，标准C将所有以一个下划线(Underscore)开头，后面跟一个大写字母或者另一个下划线，之后为其他字符的标识符保留，以备将来扩展之用。程序员在命名自己的标识符时，要注意这些限制。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:integer_constant&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>integer_constant</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:integer_constant&amp;rev=1414807369&amp;do=diff</link>
        <description>整型常量（Integer constant）

整型常量的表现形式有十进制（Decimal）、八进制（Octal）和十六进制（Hexadecimal）。十六进制以0x或0X开头，八进制以0开头，其余为十进制形式。

整型常量可以接后缀，字母l或L表示long型，字母u或U表示无符号（unsigned）整数，C99增加了long long类型，相应的，ll或LL表示long long型。u/U和l/L、u/U和ll/LL可以同时出现，顺序无所谓。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:invalid_pointer&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>invalid_pointer</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:invalid_pointer&amp;rev=1414807369&amp;do=diff</link>
        <description>无效指针的特例

无效指针（invalid pointer）是值不为NULL，但并没有引用一个有效的对象或函数的指针。

任何使用无效指针的操作结果都是未定义的（undefined），可能导致运行时错误（run-time error），保证指针有效性是程序员的责任。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:line_command&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>line_command</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:line_command&amp;rev=1414807369&amp;do=diff</link>
        <description>#line指定行号

程序员可以通过#line预处理命令告诉编译器下一行源代码的行号和文件名（可选）。

两种形式：


#line n
#line n &quot;filename&quot;


指令影响预定义宏__LINE__和__FILE__。

一些自动生成源程序的工具使用该指令来生成调试信息，以便能定位到最初由程序员编写的源程序，而不是之后生成的代码。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:logical_and_or&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>logical_and_or</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:logical_and_or&amp;rev=1414807369&amp;do=diff</link>
        <description>逻辑与/或操作符的注意事项

逻辑与操作符&amp;&amp;、逻辑或操作符||也称为条件与（conditional AND）、条件或（conditional OR）,因为它们的第二个操作数不一定需要计算，这一点需要注意。

例如：


        if (i &lt; 10 &amp;&amp; a[i++] != 0)</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:macro_expansion&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>macro_expansion</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:macro_expansion&amp;rev=1414807369&amp;do=diff</link>
        <description>宏扩展（Macro expansion）

宏的扩展是一个多次进行的过程：当一个宏扩展之后，会返回到扩展结果的开头，继续再做一次扩展，以便识别出别的宏并扩展它，直到没有宏为止。

扩展在宏调用的时候进行，在#define定义的时候不进行，参见</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:macro_merging&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>macro_merging</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:macro_merging&amp;rev=1414807369&amp;do=diff</link>
        <description>##符号合并（Macro merging）

标准C使用##将两边的符号合并成单个符号。所以，##不能出现在开头或结尾，必须是被符号包围。如果合并生成的符号非法，则结果是未定义的。

例如：


#define TEMP(a) temp ## a</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:macro_stringization&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>macro_stringization</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:macro_stringization&amp;rev=1414807369&amp;do=diff</link>
        <description>#参数字符串化（Macro stringization）

标准C使用#符号将宏参数字符串化(stringization)。#后面必须是一个宏参数名，当宏扩展时，#和后面的宏参数名替换成实际参数内容构成的字符串常量。

转化时，实参中的引号和转义前会添加\以保留它的原义。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:macro_with_parameters&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>macro_with_parameters</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:macro_with_parameters&amp;rev=1414807369&amp;do=diff</link>
        <description>参数宏（Macro with parameters）

括号规则

对于带参数的宏，定义时左括号（parenthesis）必须紧接着宏名，之间不能有空格，否则，从左括号开始的部分都被识别为宏的定义。当运行时，宏名和左括号之间可以有空白。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:overflow&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>overflow</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:overflow&amp;rev=1414807369&amp;do=diff</link>
        <description>关于溢出（Overflow）

当实际计算结果超出结果类型所能表示的范围时，就发生了溢出（overflow或underflow）。

对有符号整数和浮点数，C没有定义溢出的后果。但对于无符号数（unsigned），C明确规定结果等于实际算术结果模2</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:precedence_of_operators&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>precedence_of_operators</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:precedence_of_operators&amp;rev=1414807369&amp;do=diff</link>
        <description>操作符优先级列表

C语言有着过于丰富的操作符（operator），记住各个操作符的优先级不是一件容易的事，必要时应使用括号（parentheses）以保证代码的清晰可读。

下面是所有的操作符列表：</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:predifined_macros&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>predifined_macros</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:predifined_macros&amp;rev=1414807369&amp;do=diff</link>
        <description>预定义宏（Predifined macros）

标准C预定义了一些宏，宏名以双下划线开始，以双下划线结束。这些宏不能用#undef取消定义。
  宏    值  __LINE__                  当前行在源文件中的行号（十进制表示）。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:preprocessor&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>preprocessor</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:preprocessor&amp;rev=1414807369&amp;do=diff</link>
        <description>预处理概览（Preprocessor）

基本定义

预处理指令以#开头，标准C允许#的前后可以有空白字符，但旧的编译器可能不允许这么做。

如果一行中只有#一个非空白字符，标准C当作空白行处理。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:sequence_point&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>sequence_point</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:sequence_point&amp;rev=1414807369&amp;do=diff</link>
        <description>序列点（Sequence point）

序列点（Sequence point）是一个时间点，在此之前计算的所有副作用（side effects）已经结束，而之后计算的副作用还没有开始。

具体的说，序列点发生在如下场合：

	*</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:sign_of_char&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>sign_of_char</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:sign_of_char&amp;rev=1414807369&amp;do=diff</link>
        <description>char类型的符号问题

char类型可以是有符号（signed）类型，也可以是无符号（unsigned）类型，甚至是两者的混合类型，具体依赖于编译器的实现。

所以，当确定需要有符号的char类型时，请直接使用signed char；当确定需要无符号的char，则直接使用unsigned char。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:sizeof&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>sizeof</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:sizeof&amp;rev=1414807369&amp;do=diff</link>
        <description>Sizeof的几点事项

标准C定义了一个无符号类型size_t，作为sizeof操作符的返回值类型。

当sizeof的操作数是表达式时，通常不进行类型转换，所以当操作数是数组时，sizeof能获得数组的大小，而不是数组转换为的指针的大小。但如果表达式中包含其他操作符，需要进行类型转换后才能决定表达式size时，则将进行类型转换。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:size_of_pointer&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>size_of_pointer</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:size_of_pointer&amp;rev=1414807369&amp;do=diff</link>
        <description>指针的size

指针的大小（size）依赖于实现（implementation-dependant），甚至不同类型的指针可以有不同的size，不一定与某种整数类型匹配。

虽然，我们有时将整数和指针强制互换使用；我们假设long形变量能够容纳所有指针的值；C99标准还定义了一个intprt_t类型，表示能容纳指针的整数类型。但要知道，C标准并没有规定了这种做法，结果不一定是可移植的。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:stdc_version&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>stdc_version</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:stdc_version&amp;rev=1414807369&amp;do=diff</link>
        <description>用预定义宏判断C标准的版本

预定义宏__STC__和__STDC_VERSION__的配合使用，可以让我们编写兼容各种C标准的代码。

如下是一个典型的模板：


#ifdef __STDC__
        /* Some version of Standard C */
#if defined(__STDC_VERSION__) &amp;&amp; __STDC_VERSION__ &gt;= 199901L
        /* C99 */
#elif defined(__STDC_VERSION__) &amp;&amp; __STDC_VERSION__ &gt;= 199409L
        /* C89 and Amendent 1 */
#else
        /* C89 but not Amendent 1 */
#endif
#else
        /* Not Standard C */
#endif…</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:string_constant&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>string_constant</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:string_constant&amp;rev=1414807369&amp;do=diff</link>
        <description>字符串常量（String constant）

字符串常量由双引号（“）包含的0个或多个字符构成。标准C允许使用前缀L来表示宽字符串常量。

字符串常量中可以使用反斜杆（\）实现转义。如果字符串常量中要包含双引号（</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:struct_layout&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>struct_layout</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:struct_layout&amp;rev=1414807369&amp;do=diff</link>
        <description>结构体成员的地址分布

C编译器对结构体（struct）对象的成员按地址增序的方式进行空间分配，即第一个成员的地址就是整个结构体对象的起始地址，其他成员按定义顺序依次排在后面。

例如：</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:struct_offset&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>struct_offset</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:struct_offset&amp;rev=1414807369&amp;do=diff</link>
        <description>结构体成员Offset

有一种空指针（NULL）的特殊用法，将其强制转换为某种结构体类型，然后获取该结构体某成员的地址偏移量（offset）：


#define OFFSET(type, field) \
        ((size_t)&amp;((type *)0)-&gt;field)</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:struct_pad_size&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>struct_pad_size</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:struct_pad_size&amp;rev=1414807369&amp;do=diff</link>
        <description>结构体的填充与大小

出于对齐（Alignment）的需要，结构体成员之间，以及最后一个成员之后，可能会有一些填充空间（也称为空洞，hole）。

成员之间的填充是为了满足成员的对齐要求。最后的填充则是为了满足整个结构体的对齐要求：要保证结构体对象能做为数组的元素，而数组的各个元素的地址是连续的，所以结构体的起始地址与结束地址都要在对齐边界上。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:typedef_varlen_array&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>typedef_varlen_array</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:typedef_varlen_array&amp;rev=1414807369&amp;do=diff</link>
        <description>typedef与变长数组

C99引入了变长数组（variable length array）的概念。当typedef定义的类型涉及变长数组时，数组的大小在typedef定义时确定，而不是在使用typedef定义的类型时才确定。

例如：


#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

int main(void)
{
        int n = 5;
        typedef int array[n];

        n = 10;
        array a;

        (void) printf(&quot;%ld\n&quot;, sizeof(a));

        exit(0);
}</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:type_compatibility&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>type_compatibility</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:type_compatibility&amp;rev=1414807369&amp;do=diff</link>
        <description>类型兼容性（Type Compatibility）

两个类型兼容（compatible），是指两个类型是同一个类型，或者“足够相近”可当作同一类型看待。由于typedef并没有引入新的类型，所以不影响兼容性的判断。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:type_conversions&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>type_conversions</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:type_conversions&amp;rev=1414807369&amp;do=diff</link>
        <description>类型转换（Type conversions）

在很多场合都会发生类型转换（Type conversions），比如：

	*  强制转换（cast）表达式；
	*  赋值运算（assignment）时；
	*  进行算术和逻辑运算时；
	*  函数调用时的实参转换；</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:type_conversions_rules&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>type_conversions_rules</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:type_conversions_rules&amp;rev=1414807369&amp;do=diff</link>
        <description>类型转换规则

转换成整数（Conversions to Integer Types）

能转换成整数的类型包括算术类型（arithmetic）和指针类型（pointer）。

布尔型（_Bool）

C99引入了布尔类型_Bool，任何非零的算术类型和指针类型变量转换成布尔型时，值都是1；零值（如0，0.0，NULL指针）则转换成0。</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:unary_conversions&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>unary_conversions</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:unary_conversions&amp;rev=1414807369&amp;do=diff</link>
        <description>一元转换（Unary conversions）

一元转换主要发生在一元运算之前（包括!、-、+、~、*），也包括&lt;&lt;和&gt;&gt;这两个特殊的二元运算。

整型（Integer）

一元转换最需要注意的地方是整型（integer）转换，也称为整型提升（integer promotion），规则如下：</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:unary_minus_and_unsigned&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>unary_minus_and_unsigned</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:unary_minus_and_unsigned&amp;rev=1414807369&amp;do=diff</link>
        <description>一元减号与无符号数

当e是一个无符号整数时，-e的结果可能不是负数，而依旧是一个无符号数，这点要注意。

其中的原理是，-e等价于0-e，根据二元减法规则，如果e经类型转换后仍是无符号类型，则结果依旧是无符号类型，结果值为2</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:undef_command&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>undef_command</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:undef_command&amp;rev=1414807369&amp;do=diff</link>
        <description>#undef取消定义

使用#undef来取消一个宏的定义。

取消一个本来就没有定义的宏，不算错误。取消之后，可以使用#define给宏一个新的定义。

#undef中不进行宏扩展。

标准C允许使用#define重复定义同一个宏，但要求宏的定义是一样的，包括使用的符号和空白的位置，当然具体的空白字符可以不同。如：</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:use_of_unsigned&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>use_of_unsigned</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:use_of_unsigned&amp;rev=1414807369&amp;do=diff</link>
        <description>无符号类型的使用建议

很多地方都提到了无符号数（unsigned）：

	*   char类型的符号问题
	*   一元转换（Unary conversions）
	*   二元转换（Binary conversions）
	*   关于溢出（Overflow）
	*   一元减号与无符号数
	*   二元减法与无符号数
	*   移位操作符的注意事项

C语言中无符号类型的一些特性与“直觉”不同，因此，在处理无符号数时要多加小心。

比如下面这个有符号数和无符号数混用的例子：…</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:void&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>void</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:void&amp;rev=1414807369&amp;do=diff</link>
        <description>void的用法

1. 作为函数的返回类型，表示函数没有返回值。如：


void scm_detach_fds_compat(struct msghdr *kmsg, struct scm_cookie *scm);


2. 用在强制转换（cast）表达式中，表示丢弃该值。如：


(void) printf(&quot;hello, world\n&quot;);</description>
    </item>
    <item rdf:about="https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:whitespace&amp;rev=1414807369&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2014-11-01T02:02:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>whitespace</title>
        <link>https://www.gwduan.com/wiki/doku.php?id=computer:c:tips:whitespace&amp;rev=1414807369&amp;do=diff</link>
        <description>空白字符（Whitespace）

在C源程序里，空白字符包括：

	*  空格（Space）
	*  行结束符（End-of-line）
	*  竖向制表符（Vertical tab）
	*  换页符（Form feed）
	*  横向制表符（Horizontal tab）
	*  注释（Comment）</description>
    </item>
</rdf:RDF>
