zoukankan      html  css  js  c++  java
  • C的陷阱和缺陷研读笔记01

    词法分析:

    编译器将程序分解成符号的方法是 从左到右一个一个字符的读入,如果该字符可能组成一个符号,再读入下一个字符

    而c语言里的符号 / * =只有一个字符长, 是单字符的, /* == 一些事双字符符号。

    故因此有以下陷阱

    a---b     等价     a-- -b

    y= x/*p      /*被编译器理解成一段注释的开始

    因此应该写成y = x / *p 或者 y = x/(*p)

    整型常量 :

    如果一个整形常量的第一个字符是数字0 那么该常量将被视作八进制,有时候在上下文中为了格式的对齐的需要,可能无意将十进制写成了

    八进制。

    字符和字符串:

    单引号的一个字符实际上代表一个整数,对应该编译器采用的字符集中的序列值,ASCII字符集最常见。

    双引号引起的字符串,代表的是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及额外的二进制位0

    的字符''初始化

    嵌套注释:被双引号括起的字符串中,注释符/*属于字符串的一部分,而在注释中出现的双引号又属于注释的一部分

    语法陷阱:

    函数声明:

    运算符的优先级:

    !=高于 &

    操作符高于单目运算符 *p++  等价 *(p++)

    接下来是双目运算符 其中算数运算符优先级最高 移位次之,关系运算符再次之

    接着是逻辑运算符 赋值运算符 最后是条件运算符

    三目运算符的优先级是最低的

    注意循环语句中的;分号

    函数调用:

    C语言要求在函数调用即使函数不带参数也应该包括参数列表

    数组:

    C语言中只有一维数组 C99VLA

    NULL指针 不能被解除引用就是访问使用该指针指向的内存中存储的内容

    连接器:

    通常把目标模块堪称一组外部对象external object组成

    每个外部对象代表机器内存的某个部分,并通过一个外部名称来识别 

    因此程序中的每个函数和每个外部变量如果没有被声明为static 就都是一个外部对象 某些C

    编译器会对静态函数和静态变量的名称做一定改变 将他们也作为外部对象 由于经过了名称修饰 所以他们不会和其他源程序中的同名函数或

    变量发生命名冲突

    定义和声明:

    extern int a;说明a是一个外部整形变量 但是因为它包括了extern关键字 这就显示说明了a的存储空间是在程序的其他地方分配的

    从连接器的角度看 这是个对外部变量a的引用 不是对a 的定义 

    extern int a 和定义int a也可以在同一个源文件中

  • 相关阅读:
    查找list中的重复数据,并得到不重复数据索引位置
    sql server 存储过程中使用事务
    C#获取web.config配置文件内容
    SendKeys.Send 方法
    C# 获取当前路径方法(转载)
    asp.net中URL参数传值中文乱码的三种解决办法
    无法 连接到SQLEXPRESS 已成功与服务器建立连接,但是在登录过程中发生错误。管道的另一端无任何进程
    Windows7 IIS7 无法启动计算机上的服务W3SVC如何修复,计算机上无法找到.was解决方案 visita iis 7.0
    EXCEL开发Interior.ColorIndex 色彩列表
    asp.net web 登录文本框的回车设计
  • 原文地址:https://www.cnblogs.com/huoxl/p/4629715.html
Copyright © 2011-2022 走看看