编译过程的一点心得体会:
.h文件其实只在预处理的过程用到,用来将类似#include <stdio.h>这样的行展开为具体内容。
那些标准库或者其他库中的函数,是在链接的过程中连接器把相应部分从库中提取出来的,和头文件无关,头文件其实只是做一个函数声明,使编译通过。

Chapter 1:

1.词法分析的贪心贪心法,即大嘴法:每一个符号应该包括尽可能多的字符。
2.如果一个整型常量的第一个字符是数字0,那么该常量会被视作是八进制数。
3.不要使用嵌套注释这种东西,即使编译器支持。


Chapter 2:
1.加法运算符的优先级高于移位运算符。
2.单目运算符是自右向左结合的。
3.任何一个逻辑运算符的优先级低于任何一个关系运算符。
4.移位运算符的优先级比算术运算符,但是比关系运算符
5.如果声明结尾的分号被省略,编译器可能会把声明的类型视作函数的返回值。


Chapter 3:

1.C语言只有一维数组,而且数组的大小在编译期就作为一个常数确定下来

2.确定一个数组,只能做两件事情,确定该数组的大小,和获取指向该数组下标为0的元素的指针。

3.malloc函数使用时候要考虑无法提供请求内存的情况,该情况会返回一个空指针,用完后一定要释放。

4.使用malloc为字符串分配空间的时候需要注意一点,strlen计算的字符串长度是不包括结尾的'\0'的,因此在申请的时候需要考虑是否加+1.

5.main函数中的main(int argc,char* argv[]),argv[]中的元素为字符指针类型。

6.n++和实际过程是,先保存n,从n中+1,然后将保存值进行相应运算后再执行,而往往++n比n++更有效率。

7.数组中实际不存在的溢界元素的地址位于数组所占内存之后,这个地址可以用于进行赋值和比较,当然如果要引用该元素就是非法的了。

8.逗号运算符,先对左侧操作数进行求值,然后该值被丢弃,然后再对右侧操作数进行求值。
而分隔函数参数的逗号运算符并非逗号运算符。例如,x和y再函数f(x,y)中的求值顺序是未定义的,而在函数g((x,y))中却是先x,后y的顺序。再后面的这个例子中,函数g的参数只有一个。(x,y)便是进行上述的逗号运算符。

9.赋值运算符不保证任何求值顺序。例子:从数组x中复制前n个元素到数组y中。
int i = 0;
while(i<n)
{
y[i] = x[i++];
}
5
1
int i = 0;
2
while(i<n)
3
{
4
    y[i] = x[i++];
5
}
因为此时不确定这个赋值语句中y[i]实在i++之前被赋值还是i++之后被赋值。
正确的写法:
int i = 0;
while(i < n)
{
y[i] = x[i];
i++;
}
6
1
int i = 0;
2
while(i < n)
3
{
4
    y[i] = x[i];
5
    i++;
6
}

10.运算符&和&&不同,运算符&两侧的操作数都必须被求值。

11.判断有符号整数溢出的方式(当然也只有有符号整数才有溢出的情况)
int a = 0;
int b = 0;
if((unsigned)a+(unsigned)b>INT_MAX)
complain(); 或者是不转换成无符号
if(a>INT_MAX-b)
complain();
x
1
int a = 0;
2
int b = 0;
3
if((unsigned)a+(unsigned)b>INT_MAX)
4
    complain();
5

6

7
或者是不转换成无符号
8
if(a>INT_MAX-b)
9
    complain();

12.一个返回值为整数的函数如果返回失败(没有return)则实际上是隐含的返回了某个“垃圾”整数。
该数是未知的,如果用不到,确实没什么关系,但是为了安全起见,函数的一般加上return 0;或者exit(0);

Chapter 4:
1.如果一个函数再被定义或者声明之前被调用,那么他的返回类型就默认为整型。
2.scanf和printf的时候,如果"%d",但是给的量是char,那么就会覆盖其他内存或者读到其他的量的聂村区域。
3.保证一个特定的名称的所有外部定义在每个目标模块中都有相同的类型。
例子:一个文件中定义 char filename[] = "/etc/passwd";
另一个文件中声明extern char* filename;
虽然数组和指针非常的相似,但是两者使用的存储空间方式是不同的。

Chapter 5:
1.如果要对文件同时进行输入和输出操作,必须在其中插入fseek函数的调用。

Chapter 6:
1.宏定义调用的时候注意输入参数可能产生的多次自加活着自减类似操作。
2.宏定义的调用时,注意宏定义内部的if之类的语句和外部紧接着的else 之类的语句。
3.使用宏定义定义新类型的时候,当其中的类型为指针时
例如#define T1 struct foo *
T1 a,b;这样定义出来的a为结构体指针变量,b为结构体变量。

Chapter 7:

C陷阱与缺陷的个人知识点摘录的更多相关文章

  1. 读书笔记--C陷阱与缺陷(一)

    要参与C语言项目,于是作者只好重拾C语言(之前都是C++,还是C++方便). 看到大家都推荐看看  C陷阱与缺陷(C traps and pitfalls),于是好奇的开始了这本书的读书之旅. 决定将 ...

  2. C陷阱和缺陷学习笔记

    这段时间把<C陷阱和缺陷>看了,没时间自己写总结.就转一下别人的学习笔记吧http://bbs.chinaunix.net/thread-749888-1-1.html Chapter 1 ...

  3. 读书笔记--C陷阱与缺陷(七)

    第七章 1.null指针并不指向任何对象,所以只用于赋值和比较运算,其他使用目的都是非法的. 误用null指针的后果是未定义的,根据编译器各异. 有的编译器对内存位置0只读,有的可读写. 书中给出了一 ...

  4. 阅读《C陷阱与缺陷》的知识增量

    版权声明:本文为Focustc原创文章.转载请注明作者及出处. https://blog.csdn.net/caozhankui/article/details/35925939 看完<C陷阱与 ...

  5. [C陷阱和缺陷] 第1章 词法“陷阱”

    有感自己的C语言在有些地方存在误区,所以重新仔细把"C陷阱和缺陷"翻出来看看,并写下这篇博客,用于读书总结以及日后方便自身复习. 第1章 词法"陷阱" 1.1 ...

  6. C语言学习书籍推荐《C陷阱与缺陷》下载

    下载地址:点我 凯尼格 (作者), 高巍 (译者) <C和C++经典著作:C陷阱与缺陷>适合有一定经验的C程序员阅读学习,即便你是C编程高手,<C和C++经典著作:C陷阱与缺陷> ...

  7. 《C陷阱与缺陷》读书笔记

    1. 词法“陷阱” = 不同于 == , 可以通过if( 1 == a )来避免 & | 不同于 && || 词法分析中的“贪心法” 编译器将程序分解成符号的方法是,从左到右一 ...

  8. 程序员必知的Python陷阱与缺陷列表

    本文关注的主要是python陷阱,具体而言,是指CPython,而且除非特别说明,所有代码示例都是在python2.7运行的. 我个人对陷阱的定义是这样的:代码看起来可以工作,但不是以你“想当然“”的 ...

  9. 《C陷阱与缺陷》阅读笔记(个人版)

    笔记: 第一章:词法陷阱 提倡显示比较if((x = y) != 0) foo(); 第二章:语法陷阱 已知一个类型的声明 该类型的类型转换:吧声明中的变量名和声明末尾的分号去掉,再将剩余的部分用括号 ...

随机推荐

  1. pssh命令详解

    基础命令学习目录首页 原文链接:https://www.cnblogs.com/kevingrace/p/6378719.html pssh提供OpenSSH和相关工具的并行版本.包括pssh,psc ...

  2. [东北师大软工]Week2-作业2:个人项目实战 初步测试结果

    作业地址 https://edu.cnblogs.com/campus/nenu/2016SE_NENU/homework/1656 测试须知 测试机为Windows环境,所有提交到Coding.ne ...

  3. 人and绩效and职业道德

    人行走在这个世界上 避免不了的是各种悲哀 人就像是一个茶几 上面放满了各种杯具 而要做的是要么把杯具打碎了咽下去,要么被杯具打晕 本布衣 躬耕于南阳 不求闻达于诸侯 每个人都可以选择自己的生活方式 或 ...

  4. android 的helloworld没跑起来 原因

    <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com. ...

  5. SpringMVC(四)-- springmvc的系统学习之文件上传、ajax&json处理

    资源:尚学堂 邹波 springmvc框架视频 一.文件上传 1.步骤: (1)导入jar包 commons-fileupload,commons-io (2)在springmvc的配置文件中配置解析 ...

  6. Teamwork(The eighth day of the team)

    在经过算是蛮艰辛的努力后吧,我们终于有了一点点成果.虽然还离理想中的蛮遥远的,但是我们相信,虽然我们走得很慢,但是我们一直都会坚持前进.

  7. Java编写的电梯模拟系统《结对作业》

    作业代码:https://coding.net/u/liyi175/p/Dianti/git 伙伴成员:李伊 http://home.cnblogs.com/u/Yililove/ 对于这次作业,我刚 ...

  8. Java通用oracle和mysql数据库连接

    Java中oracle数据库连接写一个通用类UBUtil(){} import java.io.InputStream; import java.sql.*; import java.util.Pro ...

  9. Scrum团队 《构建之法》第6~7章

    Scrum团队成立 团队名称: 22# 团队目标:做好每次布置的任务 还有提升自己 团队口号:做好现在,展望未来 团队成员:陈楷淇,张裕发,陈泽展,彭一建 角色分配 产品负责人(决定开发内容和优先级排 ...

  10. 个人作业-week3案例分析

    第一部分 软件调研测评(必应词典移动端) 找到的bug: 在词汇量测试中每个单词给用户思考的时间太短,只有五秒钟.导致很多似曾相识的单词还没来得及想起就已经过了.如果说测的是用户记忆深刻的单词,那些记 ...