本文都是自己重读《c程序设计语言》时的笔记:
自己的一些思考:
1、printf和getchar的区别:
scanf printf 可以输入输出各种类型的变量,比如int float char,而且同时输入 输出多个也可以 如scanf("%d,%d",&a,&b);
getchar putchar 只能输入输出char类型的变量,而且只能同时输入输出一个字符
scanf()函数取数据是遇到回车、空格、TAB就会停止.。而getchar不会。
2、c语言中哪个键代表EOF?
Windows的控制台里面可以通过Ctrl + Z来通知系统达到了文件结束
Linux/Unix的Shell里面可以通过Ctrl + D来表示达到文件结束
3、有关类型转换的注意事项:表达式中float类型的操作数不会自动转换为double类型,这一点与最初的定义不同。
使用float类型主要是为了在使用较大的数组时节省存储空间,有时也为了节省机器执行时间(双精度算术运算特别费时)。
原文笔记:
(一)导言
1、在C语言中,所有的变量都必须先声明,后使用。声明通常放在函数起始处,在任何可执行语句之前。
2、C语言各个类型的长度跟机器字长和编译器有关。
3、C语言以及许多其他语言中,整数除法操作将执行舍位。
4、符号常量通常用大写字母拼写,这样可以很容易与用小写字母拼写的变量名相区别。注意,#define指令行的末尾没有分号。而struct结构体的末尾要加分号。
5、C语言的语法规则要求for循环语句必须有一个循环体,单独的分号表示空语句。
6、外部变量:(1)外部变量可以在全局范围内访问,因此,函数间可以通过外部变量交换数据,而不必使用参数表。
(2)声明外部变量时可以用extern语句显式声明,也可以通过上下文隐式声明。
(3)某些情况下可以忽略extern声明。在源文件中,如果外部变量的定义出现在使用它的函数之前,那么在那个函数中就没有必要使用。
(4)如果程序包含在多个源文件中,而某个变量在file1中定义,在file2和file3中使用,那么在文件file2跟file3中就必须使用extern声明来建立该变量与其定义间的联系。
(5)外部变量的用途还表现在它们与内部变量相比具有更大的作用域和更长的生命周期。
(6)如果在外部变量的定义之前使用该变量,或者外部变量的定义与变量的使用不在同一个源文件中,则必须在相应的变量声明中强制性的加上关键字extern。
(7)外部变量的初始化只能出现在其定义中。
7、定义与声明的区别:定义表示创建变量或者分配存储单元,而声明指的是说明变量的性质,而不分配存储单元。
(二)类型、运算符与表达式
1、标准库函数strlen(s)可以返回字符串参数S的长度,但是长度不包括末尾的‘\0’
2、字符和字符串之间的区别:‘x’ 和”X“是不同的。前者是一个整数,其值是字母X在机器字符集中的数值;后者是一个包含一个字符x以及一个结束符'\0'的字符数组。
3、枚举相对于#define来说,他的优势在于常量值可以自动生成。
4、如果变量不是自动变量(相对于静态变量而言),则只能进行一次初始化操作,从概念上来讲,应该是在程序开始执行之前进行,并且初始化表达式必须为常量表达式。
默认情况下,外部变量和静态变量将被初始化为0.未经初始化的自动变量的值为未定义值,即无效值。
5、由&&与|| 连接的表达式按从左往右的顺序进行求值,并且在知道结果值为真或假后立即停止计算。这一点容易在面试中考查。
(三)控制流
1、在switch语句最后一个分支default分支的后面也加上一个break语句,这样做在逻辑上没有必要,但是当我们需要向该switch语句后添加其他分支时,这种防范措施会降低犯错误的可能性(大神就是严谨)。
2、静态变量:
(1)用static声明限定外部变量与函数,可以将其后声明的对象的作用域限定为被编译文件的剩余部分。通过static限定外部对象,可以达到隐藏外部对象的目的。
(2)如果把函数声明为static类型,则该函数名除了该函数声明所在的文件可见外,其他文件都无法访问。
(3)static也可以声明内部变量。是某个特定函数的局部变量,只能在该函数中使用,但是它与自动变量不同的是,不管其所在的函数是否被调用,它一直存在,而不像自动变量那样,随着函数的被调用和退出而存在或消失。
即static类型的内部变量是一种只能在某个特定函数中使用但是一直占用存储空间的变量。
3、寄存器变量:
register声明告诉编译器,它所声明的变量在程序中使用频率较高。
4、递归并不节省存储器的开销,因为递归调用过程中,必须在某个地方维护一个存储处理值得栈。递归的执行速度并不快,但是递归代码比较紧凑。
5、include
(1)引号:源文件中查找
(2)尖括号:根据相关规则查找,这个规则同具体的实现有关。
6、宏
#define指令定义的名字的作用域从其定义点开始,直到被编译的源文件的末尾处结束。
可以通过#undef指令取消名字的宏定义,这样可以保证后续的调用是函数调用,而不是宏调用。
阅读(568) | 评论(0) | 转发(0) |