找回密码
 立即注册
首页 业界区 业界 《C语言程序设计》琐碎知识点总结笔记

《C语言程序设计》琐碎知识点总结笔记

擘塞 5 小时前
《C语言程序设计》琐碎知识点总结笔记

本篇笔记旨在拾掇干净一些琐碎的小/冷知识点,免得给之后的学习留不必要的念想。
一、变量的存储类别

变量的定义形式:
[存储类别] 类型标识符 变量名
现对“存储类别”加以说明。
存储空间分为程序区数据区数据区分为静态存储区动态存储区
存储类别有:自动型(auto)、寄存器型(register)、静态型(static)、外部型(extern)。
1.局部变量的存储类别

局部变量的存储类别有:自动型、静态型、寄存器型。
(1)自动型局部变量

动态存储区分配存储空间,调用函数时分配存储空间,调用结束后自动释放存储空间。
默认的存储类别,相当于最常使用的、定义时不加“存储类别”的变量。
auto float m;
auto int a,b,c=10;
(2)静态型局部变量

静态存储区分配存储空间,调用函数时分配存储空间,调用结束后不会释放存储空间,并保留变量的值。
人话:只记住初始化的值,之后的一切变量值的改变都无视。
static int c=3;
上述代码中变量c的值便永远是3了(在其作用域内)。
(3)寄存器型局部变量

将局部变量的值放在CPU通用寄存器中。
只有自动型局部变量和形式参数可以说明为寄存器型变量。(说明寄存器型满足自动型的特性,如可改变值)
register int a,b;
ps:曾见过有人将循环语句中的 \(i\) 声明为寄存器型来进行常数优化,但我的C语言老师又说寄存器型已经“名存实亡”,由此可见还是不要随便用寄存器型为好。
2.全局变量的存储类别

通过引用声明可以扩展全局变量的作用域(类似于函数的引用说明),引用声明的形式为:
extern 数据类型 变量名
全局变量的存储类别有:静态型、外部型。
(1)静态型全局变量

静态型全局变量只能被它所在文件中的函数使用,不能被其他文件中的函数使用。
可以通过引用声明在本文件内扩展其作用域。
举例如下:
  1. extern int a,b;// a,b的引用说明语句
  2. int fun()
  3. {
  4.         if(a>b) return a;
  5.         else return b;
  6. }
  7. static int a,b;// a,b的定义语句
复制代码
上述代码也可直接写成:
  1. static int a,b;
  2. int fun()
  3. {
  4.         if(a>b) return a;
  5.         else return b;
  6. }
复制代码
(2)外部型全局变量

若没有给出存储类别(即前面什么也不加),则定义的变量为外部型全局变量。
通过引用声明,可以将全局变量作用域扩展到定义它之前的函数,也可以扩展到程序中的其他文件。
举例如下:
(源文件1)
  1. int a,b;// 定义外部型全局变量a,b
复制代码
(源文件2)
  1. extern int a,b;// 外部型全局变量引用说明
复制代码
二、函数的存储类别

函数的定义形式:
  1. [函数存储类别][函数返回值类型]函数名([函数形式参数表])
  2. {
  3.         函数体说明部分
  4.         函数功能语句序列
  5.         [return 表达式;]
  6. }
复制代码
现对“函数存储类别”加以说明。
根据函数能否被其他源文件的函数调用,函数可以分为内部函数(static)和外部函数(extern)。
1.内部函数

存储类别为static,又称静态函数。
只能被它所在文件中的函数调用。
不同文件中的内部函数可以同名,互不干扰。
  1. static int fun(int a,int b)
  2. {
  3.         return (a>b?a:b);
  4. }
复制代码
2.外部函数

存储类别为extern或省略存储类别。
既能被它所在文件中的函数调用,也能被其他文件中的函数调用。
如果一个文件要调用另一个文件中定义的外部函数,则在调用函数的文件中一定要对被调用的外部函数进行引用声明。
引用声明的形式:
extern 函数名([函数形式参数表])
举例如下:
(源文件1)
  1. #include<stdio.h>
  2. int main()
  3. {
  4.     extern fun(int a,int b);
  5.         int a,b;
  6.     scanf("%d%d",&a,&b);
  7.         printf("%d\n",fun(a,b));
  8.         return 0;
  9. }
复制代码
(源文件2)
  1. #include<stdio.h>
  2. int fun(int a,int b)
  3. {
  4.         return (a>b?a:b);
  5. }
复制代码
三、编译预处理

在编译之前进行的处理,以“#”开头。
1.宏定义

宏定义的本质是在程序编译前进行替换。
注意替换后的运算优先级,在必要时使用括号。
(1)不带参数的宏定义

定义与取消定义:
  1. #define 宏名 宏体
  2. #undef 宏名
复制代码
举例如下:
#define PI 3.1415926
(2)带参数的宏定义

定义与取消定义:
  1. #define 宏名(形参列表) 宏体
  2. #undef 宏名
复制代码
使用:
宏名(实参列表)
举例如下:
#define s(a,b) a>b?a:b
s(3,4)
宏替换为:3>4?3:4
2.文件包含

#include "文件名"
#include
3.条件编译

形式1:
  1. #ifdef 标识符
  2.         程序段1
  3. [#else
  4.         程序段2]
  5. #endif
复制代码
若标识符已经被定义(使用#define 标识符),则对程序段1进行编译,否则对程序段2进行编译。
形式2:
  1. #ifndef 标识符
  2.         程序段1
  3. [#else
  4.         程序段2]
  5. #endif
复制代码
若标识符未被定义,则对程序段1进行编译,否则对程序段2进行编译。
形式3:
  1. #if 常量表达式
  2.         程序段1
  3. [#else
  4.         程序段2]
  5. #endif
复制代码
若表达式的值为真,则对程序段1进行编译,否则对程序段2进行编译。
四、主函数与命令行参数

主函数的格式为:
  1. void main([int argc,char *argv[]])
  2. {
  3.         ...
  4. }
复制代码
()中的信息称为命令行参数。
argc用于保存用户命令行中输入的命令中参数的个数,命令名本身也是一个参数。
argv[]是一个字符指针数组,用于保存各个参数的首地址(包括命令名本身)。
五、变量的作用域

ps:只提几个关键点。
1.{}括起来的是一个复合语句,其中定义的局部变量只能在该复合语句中使用。
2.主函数中定义的变量也是局部变量,只在主函数中有效。
3.不同函数中定义的局部变量可以同名,它们互不干扰。
4.形式参数也是局部变量,只在它所在的函数中有效。
5.全局变量的作用域从定义点开始直到文件尾,可以被作用域内的所有函数共用。
6.在同一个源文件内,如果全局变量和局部变量同名,则在局部变量的作用域内全局变量不起作用。(强权难压地头蛇)
六、运算符与表达式

1.算术运算符和算术表达式

(1)算术运算符

双目:+加法        -减法        *乘法        /除法        %取模
单目:+取正        -取负        ++自加        --自减
取负不改变变量的值。
自加自减运算符只能用于变量,不能用于常量和表达式。
(2)算术表达式

单个的常量和变量都是算术表达式。
算术表达式的值是数值型。
(3)优先级

高:-(取负)、++、--
中:*、/、%
低:+、-
(4)结合方向

右结合:-(取负)、++、--
左结合:+、-、*、/、%
当++、--、+、-混合运算时,应自左向右尽可能多地组合运算符。
(5)类型转换

自动类型转换:从低精度类型转换成高精度类型。
精度从高到低:double->long->unsigned->int->char
强制类型转换
(类型标识符) (表达式)
2.关系运算符和关系表达式

(1)关系运算符


双目:>        >=        <        、>=、

相关推荐

您需要登录后才可以回帖 登录 | 立即注册