《C陷阱与缺陷》笔记

第一章 词法陷阱
  1. 整数常量
      int a = 010;      //如果整数常量的第一个字符是0开头的,那么该常量表示的是八进制
      int a = 10;
      //上面两个定义是完全不一样的,第一个是八进制表示的。
    
第二章 语法陷阱
  1. 理解函数声明

    float f;
    float f();
    float *f;
    float *f();
    float (*f)();
    
    float (*f)();   //函数声明,函数的参数是void,返回值是float
    (*f)();    //执行对应的地址的函数
    
    (float (*)())  
    //"指向返回值是float参数是void的函数指针的"的类型转换符
    
    // typedef 简化函数指针类型
    float add(float a,float b)
    {
        cout<<a<<"  "<<b<<endl;
        return a+b;
    }
    
    typedef float(*pfunType)(float, float);
    
    int main()
    {
        pfunType p = add;
        p(3.33, 2.22);
        return 0;
    }
    
  2. 注意作为结束语句的分号
    if之后不小心多写了一个分号

    if(a>b);   //一不小心多写了一个分号
    a = 100;
    

    那么,代码变成

    if(a>b) {  }
    a = 100;
    
第三章 语义陷阱
  1. 指针与数组
  • 声明

    int * p;
    int arr[];
    
  • 定义

    int * p = &val;
    int arr[]=[1,2,3,4,5];
    
  • sizeof

    char * p = "1234567";
    sizeof(p);   // 4 ,指针的大小
    strlen(p);    //
    
    char arr[]="1234567";
    sizeof(arr);   //8,字符串的真实的大小,包含最后的\n
    
  1. 非数组的指针
    char * p = NULL;
    //试图打印内存地址是0的内容
    printf("printf null addr : %s \n",p);     //这个行为是未定义的,取决于不同的编译器的实现方式
    
第四章 连接
  1. 检查外部类型

    • 分析下面的代码:
      file_a.c

      int val = 100;
      

      file_b.c

      extern char val;
      cout<<val<<endl;
      

      文件的定义的类型和外部声明的类型,不一致,会出现什么情况?

      大多数编译器不能检出这样的错误,所以,这是一种很危险的行为。尤其是下面的这个情况

      char  p[] = "1234567";   //定义是数组,却声明为指针
      
      char * p;   //定义是数组,却声明为指针
      cout<<p[1]<<endl;    //妥妥的core掉
      

    原因:

  2. 头文件

    • 头文件的“比较科学”写法:
      头文件只写对应.c文件里面的变量声明
//head.h
extern int config_ip;
extern int config_pwd;
int config_ip;
int config_pwd;

static int val;   //不对外部可见
第六章 预处理

基本用法:

#宏常量
#define num 100

#宏函数
#define max(a,b)  return a>b?a:b
#define swap(a,b) \
  int tmp = a;\
  a = b;\
  b = tmp;

但是,宏的本质是文本替换,但是在很多场景下面会出现问题。用inline和const更加安全一点。

#define max(a,b) a>b?a:b

max(a,b)+1;
//替换之后,a>b?a:b+1       //和原来的有一些歧义,在某些case上面是错误的。
  1. typedef (类型定义)与宏的区别

    • 区别1: 比宏更加安全的定义
    typedef char* PCHAR;
    PCHAR pa,pb;  // = char * pa;char * pb;
    
    如果写成宏的话,可能是这样
    #define PCHAR char
    PCHAR pa,pb;   // = char * pa,pb; //= char * pa; char pb;
    
    • 区别2:用在旧的C代码中,帮助struct。
    // 用在旧的C代码中,帮助struct。以前的代码中,声明 
    // struct新对象时,必须要带上struct,
    // 即形式为: struct   结构名对象名,如:
    struct tagPOINT1
    {
      int x;
      int y; 
    } ;
    struct tagPOINT1 p1;
    
    //而在C++中,则可以直接写:结构名对象名,即:        
    tagPOINT1 p1;
    typedef struct tagPOINT
    {
      int x;
      int y;
    }POINT;
    POINT p1; // 这样就比原来的方式少写了一个struct,比较省事,
    
    • 区别3:
      在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版。
    原声明:int *(*a[5])(int, char*);
    变量名为a,直接用一个新别名pFun替换a就可以了:
    typedef int *(*pFun)(int, char*); 
    原声明的最简化版:
    pFun a[5]; 
    
    • 关于typedef


      image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容