C语言入门
程序基本概念
- 程序和编程语言
- C语言--(编译器)--汇编语言--(汇编器)--机器语言(目标代码 / 可执行代码)
- 可移植 / 平台无关:平台指计算机体系结构或操作系统,或二者的组合。不同的平台有不同的指令集,可识别不同的机器指令格式
- 直接用某种计算机的汇编或机器指令写出来的程序只能在这种计算机上运行,各种计算机上都有C编译器可以把C程序编译成计算机自己的机器指令
- 编译 / 解释语言:解释语言不需生成目标代码,由解释器一行行地,边翻译边执行
- 自然语言和形式语言
- 自然语言是人类讲的语言,如汉语、英语、法语
- 形式语言是为了特定应用认为设计的语言,如数学符号、分子式、编程语言
- 形式语言有严格的语法(Syntax)规则
- 语法规则有关于符号(Token)和结构(Structure)的规则所组成
- 符号:事先定义好的运算符,关于符号的规则为词法(Lexical)规则
- 结构:符号的排列方式,关于结构的规则为语法(Grammar)规则
- 解析(Parse):分析句子结构的过程
- 自然语言与形式语言的区别
- 歧义性(Ambiguity):形式语言的设计要求清晰、毫无歧义,每个语句都有明确含义而不管上下文如何
- 冗余性(Redundancy):自然语言为消除歧义引入冗余,形式语言极少冗余
- 与字面意思的一致性:自然语言充满隐喻(Metaphor),形式语言字面意思就是真实意思
- 阅读形式语言(包括计算机程序)的建议
- 形式语言远比自然语言紧凑,要多花时间阅读
- 结构很重要,不要从上到下或从左到右地读,而应在大脑里解析,识别Token,分解结构
- 关注细节,如拼写错误和符号错误等
- 程序调试
- Bug的分类
- 编译时错误:语法错误导致编译失败
- 运行时错误:编译器检查不出,但运行时出错导致程序崩溃(注意区分编译时和运行时两个概念)
- 逻辑错误和语义错误:编译和运行都很顺利,但没有实现预计结果
- 编程建议
- 编程=调试:编程就是逐步调试直到获得期望结果
- 总是从一个能正确运行的小规模程序开始,每做一步小的改动就立即调试
- Bug的分类
常量、变量和表达式
- 定义、赋值、初始化
- 定义:分配一块内存空间,并给它命名,如 int hour;
- 赋值:把一个值存储在内存空间中,如 hour = 11;
- 初始化:定义 + 赋值,如 int hour = 11;
- 初始化是一种特殊的变量定义语句,而不是赋值语句
- 变量名除了用在等号左边表示赋值外,其他情况都表示把它的值取出来,替换在那里
- 表达式(Expression)由运算符(Operator)和操作数(Operand)组成
- 赋值语句是表达式的一种
- 运算符有优先级(Precedence),如不希望按默认的优先级运算需加括号(Parenthesis)
- C语言规定等号运算符的结果就是等号左边被赋予的那个值
- 常量可以赋值给变量,也可以和变量、运算符一起组成表达式
- 最简单的表达式由单个常量或变量组成
- 任何表达式都有一个值,表达式可以加 ; 号构成表达式语句
简单函数
- sin是函数(Function),sin(pi/2)是函数调用(Function Call),pi/2是参数(Argument)
- 函数调用sin(pi/2)也是表达式,由函数调用运算符() 和两个操作数组成,表达式的值为函数返回值(Return Value)
- C语言的函数可以有副作用(Side Effect),这是它和数学函数在概念上的根本区别
- 如表达式a=b,返回值是a的值,副作用是a的值被改变
- 很多时候我们关心函数的副作用,而非返回值,如printf(),其返回值是实际打印的字符数,而非打印内容
- 对于完全利用Side Effect的函数,可将其返回值定义为void
- 函数原型(Prototype):函数名 + 参数类型和个数 + 返回值类型
- 函数要先声明后使用
- 定义变量时可以把同类型的变量列在一起,但定义函数参数时不可以,如void print_time(int hour, minute){}; 是错误的写法
- 形参(Parameter)相当于函数中定义的变量,调用函数传递参数的过程相当于定义形参变量并用实参(Argument)的值来初始化
- 函数提供了一个接口(Interface),调用函数就是使用这个接口,使用的前提是必须和接口保持一致
- 能用函数传参代替的就不要用全局变量
- 全局变量只能用常量表达式初始化,而局部变量可以用任意类型的表达式初始化
- C语言规定全局变量的初始值保存在编译生成的目标代码中,所以必须编译时就能计算出来,如全局变量pi的初始化语句double pi = 3.14 + 0.0016;是合法的,而double pi = acos(-1.0);是不合法的
- 若全局变量在定义时不初始化,则初始值是0(或"