C Primer Plus (第6版) 中文版
好久没有整理读书笔记了,从今天起整理下最近几个月的读书笔记,先从C Primer Plus开始,其中大部分都是书中的只是点总结,也有一些个人的理解和扩展,书中部分内容与个人观点相左也有标记,欢迎指正和技术性留言。
- **第一章 初识C语言
- **第二章 C语言概述
第一章 初识C语言
- 编程(使用C语言)的7步:定义程序目标、设计程序、编写代码、编译、运行程序、测试和调试程序、维护和修改代码。
- 在编译的过程中,程序会经历:C程序->中间代码+其他代码->目标代码/文件(可执行文件.exe)。这个过程中编译器的工作就是把源代码转换为中间代码,连接器把中间代码和其他代码(比如库代码)合并,生成可执行文件。(如下图所示)
在《程序员的自我修养 链接、装载和库》中有关于预处理(包含宏替换、清除注释、去掉多余空格、省略缩进等)、编译(包含编译:词法分析、语法分析、语义分析、源代码优化,生成汇编代码、汇编)、链接(包含链接、添加库等)等程序底层逻辑的详细描述,C Primer Plus只是一个简单的介绍,如果有兴趣详细了解可以去查看《程序员的自我修养》。 —— 扩展
UNIX上编译C程序命令:
cc main.c
linux上编译C程序命令:
gcc main.c
main.c为C程序文件
第二章 C语言概述
C语言中只有6种语句:标号语句、复合语句、表达式语句、选择语句、迭代语句、跳转语句。
C语言中没有函数调用语句,函数调用语句在C标准中没有,它本质上是表达式语句(圆括号是运算符,函数名是运算对象)。以此类推:赋值语句也在C中没有。 —— 注意
C中的命名:字母/_+数字(值得注意的是在C语言标准中下划线打头的函数/变量是作为库函数默认的命名规则,在C标准中却并没有,但是目前大多推荐命名时最好不要下划线开头一面与库中的代码混淆)
声明变量的4个理由:
- 由于C标准提倡把变量的声明都放在程序的开头并且放一起,方便读者查找和理解程序的用途;
- 声明变量会促使程序员在写代码之前做一些计划(想好再些);
- 声明变量还有助于发现隐藏在程序中的小错误;
- C的强制规定在使用变量前必须声明否则不能通过编译;
而且可能的话,要给每一个声明的变量初始化!
提高程序可读性的技巧这一部分个人分享一个感受:
// 网传微软的编码风格
int main( int argc , int argv[])
{
// 很多代码
return 0;
}
// 国内的一些编码风格
int main (int argc , int argv[]){
// 很多代码
return 0;
}
对于以上2种编码风格的比较个人倾向于微软的,不对齐的{}在很多时候会产生问题,特别是一些带有默认折叠功能的IDE,会将不对齐的{}折叠得乱七八糟。
printf与scanf函数:
这2个可以接受任意个参数,而且printf()与scanf()是函数!
语法错误和语义错误:
语法错误是不遵循C语言语法规则而导致的,而语义错误是语法没有问题,但是程序的结果和原本的设计(或者程序的编写想要的效果)不一致。
// 语法错误
#include "stdio.h"
int main(int argc, int argv[])
{
printf("%d",n);// 语法错误,n未定义
return 0;
}
// 语义错误
#include "stdio.h"
int main(int argc, int argv[])
{
int n = 0;
n += 2; // 语义错误,希望求得n+1的结果但是实际求得的是n+2
printf("%d",n);
return 0;
}
C语言的词汇—-关键字和保留标识符
C语言的词汇这几个字是我自己加的属于私活。 —— 注
常见的就不列了,列一些不常见的(具体细节后面会有介绍):
auto
extern
inline
register
restrict
volatile
_Complex
_Generic
_Imaginary
_Static_assert
_Noreturn
_Thread_local