C语言--读书笔记(一)

来源:互联网 发布:点击图标打不开软件 编辑:程序博客网 时间:2024/04/30 04:48

1.C语言中的符号重载
  static 在函数内部,表示该变量的值在各个调用间一直保持延续性,在函数这一级,表示该函数只对本文件可见。
  exter/缺省时 用于函数的定义,表示全局可见。用于变量,表示它在其他地方定义


2. 当sizeof的操作数是个类型名时,两边必须加上括号,但操作数如果是变量名则不必加括号。
    例如: apple = sizeof(int)*P 
                                          |————————>'*'被编译器认为是乘号


3. C语言中的优先级

圆下箭头一顿号
非凡增减富强针地长
三乘除,四加减,五移位
千万别把鱼忘记,它在盛饭的厨子里
小灯大灯灯灯不等
爸喂鱼,舅疑惑,裸鸡也疑惑
十三姨,十四父,十五逗,兜到低

   “圆下箭头一顿号”指的是第15级的运算符。其中圆指的是运算符(),下指的是下标运算符[],箭头指的是指向结构体成员运算符->,顿号指的是结构体成员运算符、
    “非凡增减富强针地长”指的是第14级的运算符。其中非指的是逻辑运算符!,凡指的是按位取反运算符~,增减指的是自增和自减运算符++和--,富指的是负号运算符-,强指的是类型转换运算符(类型),针指的是指针运算符*,地指的是地址运算符&,长指的是长度运算符Sizeof
    “三乘除,四加减,五移位” 指的是第13级到第11级的运算符。其中三四五并无实际意义,只是起区分级别而已。也可以想象三指的是第13级运算符。乘除指的是乘法运算符*和除法运算符/,加减指的是加法运算符+和减法运算符-,移位指的是左移运算符<<和右移运算符>>
    “千万别把鱼忘记,它在盛饭的厨子里”指的是求余运算符%,它位于盛饭的厨子里,即指和乘法运算符、除法运算符在一起。
    “小灯大灯灯灯不等” 指的是第10级到第9级的运算符。其中小灯大灯指的是关系运算符<、<=、>和>=,灯灯指的是等于运算符==,不等指的是不等于运算符!=
    “爸喂鱼,舅疑惑,裸鸡也疑惑”指的是第8级到第4级的运算符。其中,爸喂鱼之指的是第8级的按位与运算符&,舅疑惑指的是第7级的按位异或运算符^和第6级的按位或运算符||,裸鸡也疑惑指的是第5级、第4级的逻辑与运算符&&和逻辑或运算符||
    “十三姨,十四父,十五逗,兜到低”指的是第3级到第1级的运算符。其中,十三姨指的是条件运算符?: (三有双重含义,即指?:的优先级别是三,它的运算符类型也是三目,?难道不是姨即疑惑吗?),十四父的十四没有实际意义,父指的是赋值运算符=、+=、-=、*=、/=、%=、>>=、<<=、&=、^=和|= ,十五逗指的是第1级的运算符,兜到低指的是15级运算符以,结束。

   1: Operators                                                   Associativity 
   2: () [] –> .                                                   left to right 
   3: ! ~ ++ -- + - * (type) sizeof                                 right to left 
   4: * / %                                                         left to right 
   5: + -                                                           left to right 
   6: <<  >>                                                        left to right 
   7: < <= > >=                                                     left to right 
   8: == !=                                                         left to right 
   9: &                                                              left to right 
  10: ^                                                               left to right 
  11: |                                                                left to right 
  12: &&                                                             left to right 
  13: ||                                                               left to right 
  14: ?:                                                               right to left 
  15: = += -= *= /= %= &= ^= |= <<= >>=                          right to left 
  16: ,                                                                left to right

例子:
优先级                       表达式      实际结果            注释
—————————————————————————————————————————————————————————————

'.'的优先级高于'*'             *P.f        *(P.f)              对P去f偏移,作为指针,
->操作符可取消这个问题                                     然后进行解除应用操作
—————————————————————————————————————————————————————————————

[]高于*                       int *ap[]   int *(ap[])        ap是个元素为int指针的数组
—————————————————————————————————————————————————————————————

函数()高于*                  int *fp()   int *(fp())        fp是个函数,返回int *

 

4. 自动变量在堆栈中分配内存,当包含自动变量的函数或代码块退出时,他们所占用的内存便会被回收,解决方案:
   a. 返回一个指向字符串常量的指针。
   b. 使用全局声明的数组。
   c. 使用静态的数组。
   d. 要求使用者分配内存来保护函数的返回值,为了提高安全性,调用者应该同时质地昂缓冲区的大小

原创粉丝点击