C陷阱与缺陷的学习笔记
1
用单引号括起的字符实际代表一个整数,整数值对应于该字符在编译器中采用的字符集对应的序列值;
双引号括起的字符串,代表的是一个指向无名数组起始字符的指针,该数组被双引号之间的字符和‘\0’初始化。
对于'yes'这种形式的表示,不同的编译器采取的方式不同,但大都理解为"一个整数值,由y e s 所代表的整数值按照特定编译器实现定义的方式组合得到",vc采用用后一个字符覆盖前一个字符,最后得到的是最后一个字符的值
2
词法分析中的"贪心法则"----每一个符号应该包含尽可能多的字符,
所以n-->0的含义是 n-- >0,而不是n- ->0;
3
注意分号结束的标志可能会引起错误,比如定义了
struct log{ int date; int time}若没有分号 则struct会被编译器认为是主函数返回类型
main(){}
使用case分支语句时若没有用 break就要注释出来,防止被误认为写错;
4
c语言的数组需要注意的两点:
1----c语言只有一维数组,而且数组的大小在编译期间就作为一个常数而存在,但是数组中的元素可以是任何对象,所以可以仿真出一个多维数组;
2----通过数组可以获得指向下标为0 的元素的指针,有关数组的其他操作看上去是下标运算,其实是指针运算,因此可以根据指针的行为来确定下标的行为
如*(a+i)即为下标为i的元素的引用,这种写法如此常用,因此被简记为a[i];
数组作为参数毫无意义,因此c将自动地将作为参数的数组声明转换成相应的指针声明
int strlen(int a[])
int strlen(int *a)等价
main(int argc, char *argv[])强调argv指向某数组的起始元素的指针,数组的元素为字符指针类型
main(int argc, char **argv)等价
我们需要记住的是,复制指针并不同时复制指针所指向的数据。
5
为main函数提供返回值,默认的是int,一般情况下系统会根据返回值来判断程序是否执行成功,0代表执行成功;
若函数仅被文件内的其他函数调用就可以声明为static,因为它对外部是不可见的
6
库函数setbuf(stdout,buf)
程序输出有两种形式,一种是即时输出,会造成较高的系统负担,另一种是先暂存起来,然后大块写入的方式,通过setbuf控制在实际 的写之前控制产生数据的量
输出库的stdout----buf缓冲区---实际写入到stdout
main()
{
int c;
char buf[BUFSIZ];
setbuf(stdout,buf);
while((c=getchar())!=EOF)
putchar(c);
}
问题是buf被清空是在main结束之后,实际在此之前buf已经被释放;
解决方法1---在main外面声明static char buf[BUFSIZ];
动态分配缓冲区,在程序中不主动去释放分配的缓冲区,所以在main函数结束时并不会释放缓冲区,
char *malloc();
setbuf(stdout, malloc(BUFSIZ));
ANSI c标准 ----C99最新的c语言标准
处理64位数据可以用C99标准的long long来表示
typedef和#define有什么区别?
一般来说最好使用typedef,能够正确处理指针类型,
#define的优点是可以使用#ifdef来处理头文件的重复包含;
另外不能在定义typedef之前使用它;
函数调用只能出现在局部非静态变量中;
C陷阱与缺陷的学习笔记的更多相关文章
- 《C陷阱与缺陷》学习笔记(一)
前言和导读 "得心应手的工具在初学时的困难程度往往超过那些easy上手的工具."比較认同这句话. 我至今认为自己事实上还是个刚入了门的刚開始学习的人. 第一章 "词法&q ...
- 《C陷阱与缺陷》阅读笔记(个人版)
笔记: 第一章:词法陷阱 提倡显示比较if((x = y) != 0) foo(); 第二章:语法陷阱 已知一个类型的声明 该类型的类型转换:吧声明中的变量名和声明末尾的分号去掉,再将剩余的部分用括号 ...
- 《C陷阱与缺陷》读书笔记
1. 词法“陷阱” = 不同于 == , 可以通过if( 1 == a )来避免 & | 不同于 && || 词法分析中的“贪心法” 编译器将程序分解成符号的方法是,从左到右一 ...
- 我的《C陷阱与缺陷》读书笔记
第一章 词法“陷阱” 1. =不同于== if(x = y) break; 实际上是将y赋给x,再检查x是否为0. 如果真的是这样预期,那么应该改为: if((x = y) != 0) break; ...
- 读书笔记--C陷阱与缺陷(七)
第七章 1.null指针并不指向任何对象,所以只用于赋值和比较运算,其他使用目的都是非法的. 误用null指针的后果是未定义的,根据编译器各异. 有的编译器对内存位置0只读,有的可读写. 书中给出了一 ...
- 【转】C缺陷和陷阱学习笔记
http://www.cnblogs.com/hbiner/p/3591335.html?utm_source=tuicool&utm_medium=referral 这段时间把<C陷阱 ...
- C陷阱和缺陷学习笔记
这段时间把<C陷阱和缺陷>看了,没时间自己写总结.就转一下别人的学习笔记吧http://bbs.chinaunix.net/thread-749888-1-1.html Chapter 1 ...
- 读书笔记--C陷阱与缺陷(一)
要参与C语言项目,于是作者只好重拾C语言(之前都是C++,还是C++方便). 看到大家都推荐看看 C陷阱与缺陷(C traps and pitfalls),于是好奇的开始了这本书的读书之旅. 决定将 ...
- C语言学习书籍推荐《C陷阱与缺陷》下载
下载地址:点我 凯尼格 (作者), 高巍 (译者) <C和C++经典著作:C陷阱与缺陷>适合有一定经验的C程序员阅读学习,即便你是C编程高手,<C和C++经典著作:C陷阱与缺陷> ...
随机推荐
- spring boot更换日志为log4j2
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ...
- iOS开发-使用宏自定义输出(NSLog)
前言: 1)输出日志是会大量损耗系统性能 2)输出的信息很容易会被截取到,导致信息不安全. 所以我们会在发行版(Release)取消所有的Log.如果一行一行地去注释掉Log,显然不是一个明确的选择. ...
- C#编写的 8种初级+高级排序方法(转)
摘自:http://blog.csdn.net/mevin/article/details/6714520 程序代码: view plaincopy to clipboard using System ...
- PHP-数据库永久连接
以下为PHP官网上对数据库永久连接做的解释: 永久的数据库连接是指在脚本结束运行时不关闭的连接.当收到一个永久连接的请求时.PHP 将检查是否已经存在一个(前面已经开启的)相同的永久连接.如果存在,将 ...
- springmvc多视图配置
http://blog.csdn.net/yaerfeng/article/details/23593755
- C#中的Invoke和BeginInvoke
一.Control#Invoke() 和Control#BeginInvoke() 在非UI线程中调用MessageBox.Show()结果是非模态对话框: 在UI线程中调用MessageBox.Sh ...
- vue学习01
vue学习01 1. 创建一个Vue实例官网-学习-教程-安装-(开发/生产版本)-与jQuery的引用相似 <!DOCTYPE html> <html> <head ...
- JMeter学习-内存溢出解决方法
现象:使用jmeter进行压力测试时遇到一段时间后报内存溢出outfmenmory错误,导致jmeter卡死了 方法一: windows环境下,修改jmeter.bat: set HEAP=-Xms2 ...
- Linux内核(7) - 设备模型(上)
对于驱动开发来说,设备模型的理解是根本,毫不夸张得说,理解了设备模型,再去看那些五花八门的驱动程序,你会发现自己站在了另一个高度,从而有了一种俯视的感觉,就像凤姐俯视知音和故事会,韩峰同志俯视女下属. ...
- gulp#4.0
gitbook教程: https://dragon8github.gitbooks.io/gulp-webpack/content/an-zhuang-gulp-4-0.html gulpfile.j ...