《Expert C Programming》总结(一)


      1.  关键字const并不能把变量变成常量! 在一个符号前加上const限定符只是表示这个符号不能被赋值。也就是它的值对于这个符号来说是只读的,但它并不能防止通过程序的内部(甚至是外部)的方法来修改这个值。const最有用之处就是用它来限定函数的形参。


     2.  算术转换。如果其中一个操作数的类型是:unsigned,那么另一个操作数被转换为:unsigned,计算结果的类型也是unsigned。  当执行算数运算时,操作数的类型如果不容,就会发生转换。数据类型一般朝着浮点精度更高,长度更长的方向转换,整形数如果转换为signed不会丢失信息,就转换为:signed,否则就转换为:unsigned。


    3.  对无符号类型的建议:

      (1) 尽量不要在你的代码中使用无符号类型,以免增加不必要的复杂性。尤其是,不要仅仅因为无符号数不存在负值而用它来表示数量。

       (2)只有在使用位段和二进制掩码时,才可以用无符号数。应该在表达式中使用强制类型转换,使操作数均为符号数或者无符号数,这样就不必由编译器来选择结果的类型。


   4.   switch中,如果没有匹配的,也不会提示:“无匹配”。另一个问题就是:它的内部的任何语句都可以加上标签,并在执行时跳转到那里,这就有可能破坏程序流的结构化。

         在c语言中,几乎从来不进行运行时错误检查。


    5.  printf("abc"

           "is abc.");    

    输出的结果为:abcis abc.  因为它们在编译的时会自动合并。除了最后一个字符串外,其余每个字符串末尾的‘\0’字符会被自动删除。


   6.   p = N * sizeof *q;  这里是sizeof操作符把指针q指向的东西作为操作数。当sizeof的操作数是个类型名时,两边必须加上括号。但是操作数如果是变量则不必加括号。


   7.   有些专家建议牢记两个优先级就够了:乘法和除法高于加法和减法,在涉及其他的操作符时一律加上括号。

    

   8.所有的赋值符(包括复合赋值符)都具有右结合性。


   9. 在函数调用中,各个参数的计算顺序是不确定的。

   10. ANSI C 规定了最大一口策略。表示如果下一个标记有超过一种的解释方案,编译器将选取能组成最长字符序列的方案。比如:z = x+++y. 编译器翻译成为: z = x++  + y;

  


你可能感兴趣的:(c,语言,编译器)