前言
这篇文章写得是容易忘记的知识点,对于一些非常基础的知识点这里就不再阐述。
正文
一.变量
1.1 变量的命名
1.只能由字母(包括大写和小写)、数字和下划线( _ )组成。
2. 不能以数字开头。
3.长度不能超过63个字符。
4.变量名中区分大小写的。
5.变量名不能使用关键字。
1.2 变量的分类
1.局部变量
2. 全局变量
注:当局部变量和全局变量同名的时候,局部变量优先使用。而在同一个函数体内局部变量不可以同名。
int main()
{
int n = 0;
int n = 0;
printf("%d", n);
return 0;
}
1.3 变量的作用域和生命周期
1. 局部变量的作用域是变量所在的局部范围。
2. 全局变量的作用域是整个工程。
那么大家可能会问局部范围和整个工程具体指的是什么,接下来我就教给大家一个小妙招:
所谓的局部范围大家可以简单的记为{ }就是一个局部范围,举个例子:
int main()
{
int a = 0;
a = 10;
{
int b = 0;
b = 100;
printf("%d\n", a);
}
printf("%d\n", b);
return 0;
}
编译结果说明a是可以正常打印,但是b是未打印的标识符 。可以清晰的看到第二个{}的范围就是b的作用域。
那全局变量的作用域是整个工程又是什么意思呢?我们都知道一个文件里面只能有一个main函数main函数结束也就代表整个程序结束,那么我们可以整个工程理解为main函数的寿命,那这里又要细说一下。在我们刚刚接触C语言是普遍认为只需要一个main函数就万事大吉了,但是事实却不是如此,我们整个工程还可以包含一下几种情况:
1.自定义函数
2.多个文件
等等(我现在接触的就这些)
自定义函数我就不多说,主要是多个文件的情况
之前我们说过全局变量的作用域包括多个文件的情况,但是为什么在这里就不行了呢?让我们在看一段代码
可见想要在文件里使用其他文件里的全局变量需要加一个extern才可以使用。
二、转义字符
这里我只说几个点
1、当 \ 出现在printf函数中时只要没有形成转义字符就不会造成影响,比如printf("\c");打印出来的内容是c。
2、当 \ 与其他字符构成转义字符那二者只能算一个字符。
3、想打印一些具有特殊含义的字符例如:‘’,“”’,\ 等需要在前面加一个 \ 改变原有的意义才可打印。
4、\ddd,在使用时如果超过127时有两种情况
其一:超过255(无符号char的最大存储值)编译器报错
其二:大于127小于256,能成功运行,但是值不是我们想要的
为什么n是-70呢?这里就又涉及到了一个知识点(可以不做了解):当数值超出最大范围的ASCII码值,编译器会将超出的部分再从-128累加。先计算超出部分:186-127=59;再从-128累加:-128+59-1=-70。所以n中存储的值就是-70。
然后又有人要问了:计算完超出部分,从-128累加时为什么还要减去1?
这就很简单了,前面有个条件是大于127小于256,假如我们要算的是255,那255-127=128,128-128=0,但是255的ASCII码值不能为0,所以为了让128~255都可以用对应的数来表示所以多减了个1。由此可算出128对应的值为-128。
三、操作符(这里只讲一小部分)
3.1 条件操作符
表达式1 ? 表达式2 : 表达式3
意思是:表达式1为真则整个表达式的值为表达式2的值,表达式1为假则整个表达式的值为表达式3的值。这个例如m = a > b ? a : b。
3.2 逗号操作符
表达式1,表达式2,表达式3······
表达式从左向右依次计算,但整个表达式的结果是最后一个表达式结果,例如:d=(a+=2,b=a-5.c=a+b),d的值为a+b的值。
四、关键字
4.1 register(寄存器)
register int num = 100;这个代码表示建议将100放入寄存器中,注意这里只是建议,编译器会自动判断num是否常被调用,从而判断是否要将num放入寄存器中。实际上现在的编译器已经可以自动进行判断了,所以这个关键字常被遗忘。
4.2 typedef
typedef 顾名思义是类型定义,这里应该理解为类型重命名。就是将一个复杂类型(比如结构体)的名称改为其他简单的标识符来表示。
4.3 static
在C语言中: static是用来修饰变量和函数的
1. 修饰局部变量-称为静态局部变量
2. 修饰全局变量-称为静态全局变量
3. 修饰函数-称为静态函数
4.3.1 修饰局部变量
这里就不得不说到计算机内存区的划分。在计算机内存可简单分为栈区,堆区以及静态区
处于栈区的量的特点:进入作用域时创建,出作用域时销毁。
而static修饰局部变量时使其变成了静态变量改变了它的存储位置,使其数据在出作用域时不被销毁,到程序结束,生命周期才结束。值得注意的是static修饰局部变量的语句只执行一次之后在到应该执行该语句时编译器会自动跳过。
4.3.2 修饰全局变量
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。
之前我们说全局变量的作用域是整个程序包括多个文件的情况,这是因为全局变量具有外部链接属性,使其完成了内部链接。而当static修饰的全局变量时会导致全局变量的外部链接属性丧失,从而使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。
4.3.3 修饰函数
一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。可以与全局变量类比来记。
五、常量
C语言中的常量分为以下以下几种:
字面常量
const 修饰的常变量
#define 定义的标识符常量
枚举常量
int main()
{
//1.字面常量
100;//整型字面值
'w';//字符字面值
3.14;//浮点型的字面值
"abcdef";//字符串常量
//2. const 修饰的常变量
const 是常属性的
const int num = 10;//num本质上是个变量,但是具有了常熟悉,不能被修改
printf("%d\n", num);//10
num = 20;//err
printf("%d\n", num);//20
//数组
const int n = 10;
//(下面是一段错误代码)
int arr[n] = {0};//n虽然被const修饰,具有了常属性,不能被修改,但是本质上还是变量,所以不能用来指定数组的大小
//下面的代码在支持C99的编译器上可以编译的
//C99中,引入了:变长数组的概念,变长数组的大小是可以使用变量来指定的,但是数据不能初始化。
//VS2019是不支持C99中的变长数组的,所以没法验证
int n = 10;
int arr[n];
return 0;
}
从这里我们可以得到一个判断变量的小技巧:将标识符放入数组的下标中并进行初始化,看编译器有没有报错。
六、#define 定义常量和宏
这里不深入讲解#define定义宏的情况
//define定义标识符常量
#define MAX 1000
//define定义宏
#define ADD(x, y) ((x)+(y))
#include <stdio.h>
int main()
{
int sum = ADD(2, 3);
printf("sum = %d\n", sum);
sum = 10*ADD(2, 3);
printf("sum = %d\n", sum);
retur
被#define定义的标识符常量,在工程中出现该标识符则代表着对应的常量。
总结
这是我整理的一些我容易忘记的知识,如果有不正确的地方还请指出。先在这里说声谢谢了。