zoukankan      html  css  js  c++  java
  • 《C专家编程》读书笔记

    第二章 这不是Bug,而是语言特性

    2.1 这管语言特性何事,在Fortran里这就是Bug呀

    ------------------------------------------------

    malloc(strlen(str)+1); //注意字符串结尾的‘\0’字符

    ------------------------------------------------

    一个'L'的NUL用于结束一个ACSII字符串,

    两个'L'的NULL用于表示什么也不指向(空指针)。

    -------------------------------------------------

    2.2 多做之过

    switch语句的fall through会带来麻烦,fall through指:若case后无break,程序将继续执行下个case/default(有的话)的内容。

    switch语句中尽量避免使用标签,否则将产生意想不到的麻烦。

    软件信条:缺省采用“fall through”,97%的情况下都是错误的。

    另外,注意,break语句事实上跳出的是最近的哪层虚幻语句或switch语句,不能用来跳过if语句。

    ------------------------------

    ANSI C特性:相邻的字符串常量将被自动合并成一个字符串的约定。

    旧风格:

    1 printf( " A favorite children's book \
    2 is 'muffy Gets It: the hilarious tale of a cat,\
    3 a boy, and his machine fun'");

    新风格:

    1 printf( “A second favorite children's book"
    2 "is 'Thoms the tank engine and the Naughty Enginedriver who"
    3 "tied down Thomas's boiler safety value'");

    然而,这种自动合并意味着字符串数组在初始化时,如果不小心漏掉了一个逗号,编译器将不会发出错误信息,而是悄无声息地把两个字符串合并在一起。

    ---------------------------------------------------

    使一段代码第一次执行时的行为与以后执行不同。这种方法能是分支和条件检测减少到最小程度。

    1 generate_initializer(char * string)
    2 3     static char separator = ' ';
    4     printf( "%c %s \n", separator, string);
    5     separator = ',';
    6 }

    在第一次执行时,函数首先打印一个空格,然后打印一个初始化字符串。所有初始化字符串(如果有的话)的前面将加上一个逗号。

    “第一次执行的前面加个空格”相比“最后一次执行,省略逗号后缀”对程序而言更简单了。

    ----------------------------------------------------------------------

    2.3 误做之过

    C语言中的符号重载

    符号   意义  
    static

    在函数内部,表示该变量的值在各个调用间一直保持延续性

    在函数这一级,表示他在其他地方定义

    extern  

    用于函数定义,表示全局可见(属于冗余)

    用于变量,表示它在其他地方定义

    void

    作为函数的返回类型,表示不返回任何值

    在指针声明中,表示通用指针类型

    位于参数列表中,表示没有参数

    重载存在问题:第一条语句中一个乘号还是两个?

    1 p = N * sizeof * q;
    2 r = malloc(p);

    答案是:一个。因为当sizeof的操作数是个类型名(如int)时,两边必须加上括号(这常常使人误以为它是个函数),但操作数如果是个变量,则不必加括号。

    所以,它是把指针q指向的东西(即*q)作为操作数,它返回q所指向对象的类型的字节数,便于malloc函数分配内存。

    -----------------------------------------------------

    C语言运算符优先级存在的问题

    优先级问题   表达式   实际结果  

    .的优先级高于*

    ->操作符用于消除这个问题

    *p.f

    等效于p->f

    *(p.f)

    []高于* int *ap[]

    安排是个元素为int指针的数组

    int*(ap[])

    函数()高于* int*fp() 

    fp是个函数,返回int*

    int*(fp())

    ==和!=高于位操作符 (val & mask != 0) val & (mask != 0)
    ==和!=高于赋值符 c = getchar() != EOF c = (getchar() != EOF)
    算术运算高于以为运算符 msb<<4+lsb msb << (4 + lsb)
    逗号运算符在所有运算符中优先级最低 i = 1, 2 (i = 1), 2

    ...

  • 相关阅读:
    yaml文件执行后常见错误解决
    动态存储管理实战:GlusterFS
    Kubernetes角色访问控制RBAC和权限规则(Role+ClusterRole)
    Kubernetes 存储系统 Storage 介绍:PV,PVC,SC
    在容器中管理数据的两种方式
    k8s 如何关联pvc到特定的pv
    Mysqldump 的 的 6 大使用场景的导出命令
    Docker 容器日志管理
    k8s中节点级别的日志
    k8s中pod的容器日志查看命令
  • 原文地址:https://www.cnblogs.com/xlmeng1988/p/2492628.html
Copyright © 2011-2022 走看看