目录
前言
在第一篇文章当中我们大概了解了C语言的一些基础的概念,从本文开始,我们要一起进入C语言的正式学习。我们按照下面的顺序依次来学习C语言的相关知识:
1. 数据类型
2. 变量、常量
3. 字符串+转义字符+注释
4. 选择语句
5. 循环语句
6. 函数
7. 数组
8. 操作符
9. 常见关键字
10. define 定义常量和宏
11. 指针
12. 结构体
本文主要介绍数据类型、常量与变量和字符三大部分。
定义与初始化、输入和输出
在开始讲解之前,我们要先了解C原因的两个知识点:定义与初始化,输入和输出。
1 定义与初始化
当我们开始使用变量的时候,首先我们要对变量进行定义,作用就是告诉计算机,我们的代码当中有这个变量,可以在后续的代码中引用:
//变量的初始化格式为:数据类型+变量名字
int a ;
char c ;
float d ;
...
当我们定义好了变量之后,还要对变量进行初始化,初始化的作用就是给定义好的变量赋一个初始值:
//初始化格式为:变量名 = 值
a = 0;
c = 'w';
d = 3.142f;
//一般不建议初始化与变量分开书写,应当书写为:
int a = 0;
char c = 'w';
float d = 3.142f;
...
当我们对变量进行定义与初始化全部完成以后,我们就可以在接下来的代码当中使用我们的变量了。
2 输入与输出
一个程序不可能只有自己在运行,更多的是用户输入初始的数据,计算机由用户提前设定好的代码对用户输入的数据进行处理和计算后,将最终的结果进行反馈:
#include<stdio.h>
//标准输入输出,当程序当中使用scanf和printf函数的时候必须引用头文件
int main()
{
int i = 0;
//变量的初始化和定义
scanf("%d",&i);
//按照用户的格式从键盘上面将数据输入到指定的变量当中去
printf("%d\n",i);
//按照用户的格式将处理后的数据打印到屏幕上
return 0;
}
- 输入:当我们需要输入数据的时候,最常用到的就是scanf函数,它的作用就是按照用户指定的格式从键盘上面将处理好的数据输入到指定的变量当中。
scanf("%d %c %lf",&a,&b,&c);
//函数的作用是按照双引号当中的格式将数据输入到a,b,c当中
//按照a,b,c的格式进行输入
//%d,%c,%lf就是数据类型
其中&就是取地址操作符,可以这么理解,我们把计算机的内存比作为一大块的空间,变量的定义就好比在这一大块空间上面开辟出来了一个小房间,用来存放我们的变量。每个小房间都有自己的门牌号,当我们通过取地址操作符“&”向计算机表示我们想要修改的数据所在的位置,这个时候就是需要通过门牌号进行查找,而取地址操作符表示的就是这个“门牌号”。
- 输出:当我们需要程序把我们想要看到的结果打印到屏幕上的时候,我们通常来使用printf函数来进行打印,他的作用就是按照用户指定的格式将数据输出到屏幕上面。
printf("%d %c %lf",a,b,c);
//函数的作用是按照双括号当中的格式将数据打印到屏幕当中
//按照a,b,c的格式进行打印
//其中\n表示转义字符当中的换行,当使用printf函数的时候我们不需要取地址操作符
scanf函数需要取地址操作符而printf函数不需要取地址操作符的原因就是:当我们使用scanf函数输入数据的时候,要通过取地址操作符来找到变量并且对它进行修改,而使用printf函数进行输出数据的时候,打印的就是该地址的变量,所以不需要取地址操作符。
一、变量
所谓变量,顾名思义就是可以变化的数值。用编程语言来说,变量就是用来存放数值和字符等的“盒子”。
1.1 代码展示
int main()
{
short i = 0;
double weight = 72.2;
int age = 23;
char ch = 'w';
long number = 13885221455666666;
return 0;
}
1.2 变量的命名
1. 只能由字母(包括大写和小写)、数字和下划线( _ )组成
2. 不能以数字开头。
3. 长度不能超过63个字符。
4. 变量名中区分大小写的。
5. 变量名不能使用关键字。
1.3 变量的分类
1.变量的分类主要分为局部变量和全局变量。
#include <stdio.h>
int global = 2019;//全局变量
int main()
{
int local = 2018;//局部变量
printf("global = %d\n", global);
return 0;
}
所谓局部变量,也就是指的是大括号内部的变量。定义在函数内部的变量成为局部变量。它的作用域仅限于函数内部,出了函数内部就会失效。
全局变量就是在整个工程的变量,定义在函数外部的变量称为全局变量。如上面的代码展示。当局部变量和全局变量一起出现的时候,遵循局部优先的原则。
二、局部变量和全局变量
2.1 局部变量的作用域
局部变量的作用域就是就是变量所在的局部范围。局部变量的适用范围是由一定的局限性的,局部变量只能在其所在的中括号内调用。倘若在中括号的外部调用,则会出现编译器无法识别的问题。代码示例:
int main()
{
int a = 10;
printf("%d\n", a);
{
int b = 20;
printf("%d\n", b);
}
printf("%d\n", b);
return 0;
}
如代码所示,局部变量的作用域主要是在大括号内部,出了大括号内部,则编译器就会报错。
2.2 全局变量的作用域
全局变量的作用域就是在整个工程。如果在一个工程里面,但是不在一个文件里面,这时候我们就需要调用extern用来声明一下变量,这个时候程序就会正常运行。
int a = 100;
void test()
{
printf("2: %d\n", a);
}
int main()
{
printf("1: %d\n", a);
test();
return 0;
}
2.3 生命周期
所谓生命周期,是指程序当中的变量从创建到销毁之间的时间段。
- 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
- 全局变量的生命周期是:整个程序的生命周期。
三、常量
通常来讲,常量就是输入程序后不会发生改变的量。(比如性别,身份证号码等等。)
3.1 常量的分类
C语言当中的常量大概分为以下4种,分别为:
- 字面常量 :就是指直接输入到程序当中的值,包括:整型常量,字符型常量,字符串常量等等。需要注意的是不存在数组常量,结构体常量的字面常量。但是存在结构型的符号常量。
- const 修饰的常变量:主要是指被关键字const修饰后的一些具有常变量属性的变量,经过const修饰后的常变量在C语言当中只是在语法层面限制了变量不能被直接改变,但是本质上依然是变量,所以称为常变量。
- #define 定义的标识符常量 :是指将标识符定义为其后的变量,经过定义之后,程序当中就可以用标识符来表示这个常量。可以给变量赋值,但是不可以给常量赋值。
- 枚举常量:可以创建一个新类型,然后定义新的类型变量,这些变量的取值定义为一组可能值。
3.2 代码展示
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修饰,具有了常属性,不能被修改,但是本质上还是变量,所以不能用来指定数组的大小
return 0;
}
#define定义的常量和枚举常量,其中重点说一下枚举常量,需要用到enum。
#define 定义的标识符常量
#define MAX 1000
int main()
{
int arr[MAX];
#define MIN 0
printf("%d\n", MAX);
//MAX = 2000;
printf("%d\n", MIN);
return 0;
}
枚举常量的代码:
声明的一个表示性别的枚举类型
enum Sex
{
//下面三个符号是Sex这个枚举类型的未来的可能取值
//枚举常量
MALE=5, //0
FEMALE,//1
SECRET //2
};
int main()
{
//enum Sex s = FEMALE;
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
//MALE = 5;
return 0;
}
四、字符串和转义字符
4.1 字符串
"hello world"
这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。
#include <string.h>
int main()
{
//char c1 = 'a';
//char c2 = 'b';
//数组
//字符数组
//char arr1[] = "abc";
//char arr2[] = {'a', 'b', 'c', '\0'};
//printf("%s\n", arr1);
//printf("%s\n", arr2);
char arr1[] = "abc";
char arr2[] = {'a', 'b', 'c'};
int len = strlen(arr1);
printf("%d\n", len);
len = strlen(arr2);
printf("%d\n", len);
//strlen 是一个库函数,专门用来求字符串长度的
//int len = strlen("abcdef");
//printf("%d\n", len);
return 0;
}
这就是一个典型的例子,字符串的结束标志是’\0’,但是第二个数组就是随机检测,知道检测到’\0’的时候才结束。
4.2转义字符
\n | 换行 |
---|---|
\’ | 表示‘ |
\" | 表示" |
\t | 表示水平制表符 |
\b | 表示退格 |
\ddd | ddd表示1~3个八进制的数字。 如: \130 X |
\xdd | dd表示2个十六进制数字。 如: \x30 0 |
//程序输出什么?
#include <stdio.h>
int main()
{
printf("%d\n", strlen("abcdef"));
// \62被解析成一个转义字符
printf("%d\n", strlen("c:\test\628\test.c"));
return 0;
}
\62表示8进制的数字,转化为十进制的数值,再表示对应的ASCII码表示的字符。因此,输出的值是14。
4.3注释
在我们书写代码的时候,不需要的代码可以直接删除。但是如果是暂时不需要,以后还想使用的时候,这个时候我们就可以使用注释。
#include<stdio.h>
int main()
{
//C++的风格注释
// int a = 1;
/*
printf("%d\n",a)
*/
/*C语言的注释风格*/
return 0;
}
关于注释,一般建议选择采用C++的注释风格,因为这种风格更加简洁,更加简单明了。