都是介绍C语言的一些基础,许多知识都很浅,后续会单独的写文章深入的介绍C语言的各个知识!!!
C语言介绍
C语言是一种编译型语言
一.main主函数
C语言代码中一定要有main函数,main函数就是主函数,C语言规定main函数是程序的入口,main函数有且只有一个。
标准的主函数写法:
#include <stdio.h>
int main()
{
printf("");
return 0;
}
C语言其实还有一种写法,但是这种写法太古老了,所以不推荐使用,当然如果想尝试的话也可以。
主函数古老的写法:
#include <stdio.h>
void main()
{
printf("");
return 0;
}
#include <stdio.h>在C语言中被称为编译预处理命令,它在告诉C编译器在编译时包含stdio.h文件,如果在代码中,调用了这个头文件中的函数或者宏定义,则需引用该头文件。
#include <stdio.h>
std -标准
i - input
o - output
printf("");是一个库函数,在C语言中专门打印数据的,printf("");包含在#include <stdio.h>头文件中的,如果没有头文件就不能使用printf("");
printf(" ");
二.变量和常量的概念
变量
什么是变量?
在程序运行过程中会发生改变的数据,就称为变量
变量的命名
1.有意义的
int age;
float salary;
2.名字必须是字母,数字,下划线组成,不能有特殊字符,同时不能以数字开头3.变量名不能是关键字
变量分为:
- 局部变量 - {}里面的变量
- 全局变量 - {}外面的变量
例:
#include <stdio.h>
int b = 10;//全局变量
int main()
{
int a = 20;//局部变量
printf("");
return 0;
}
注意:不要将全局变量和局部变量的名字写成一样!!!
如果全局变量和局部变量名字相同
#include <stdio.h>
int a = 10;
int main()
{
int a = 20;
printf("%d\n",a);//当全局变量和局部变量名字相同的情况下,局部优先打印
return 0;
}
例题:写一个代码,计算2个整数的值
1.scanf();是一个输入函数
2.printf();是一个输出函数
3.scanf_s();这个函数是VS编译器自己提供的函数非标准C提供的函数,那也就是只有VS编译器认识,其他编译器不认识!建议使用scanf
#define _CRT_SECURE_NO_WARNINGS 这个一定要放在最上面,不然会报错!!!
//与scanf对应
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1 = 0;//初始化
int num2 = 0;
int sun = 0;//两数相加的和存放在该变量里
//用户输入两个数
printf("输入两个整数:");
//scanf_s("%d %d",&num1,&num2);
scanf("%d %d",&num1,&num2);
//求和
sun = num1 + num2;
//打印输出
printf("%d/n",sum);
return 0;
}
变量的作用域
1.局部变量
局部变量的作用域是变量所在的局部范围
2.全局变量
全局变量的作用域是整个工程(程序)
变量的生命周期
- 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束
- 全局变量的生命周期是:整个程序的生命周期
第一个源文件:
#include <stdio.h>
extern int a;//extern是一个声明来自外部的符号,这一段的意思是获取另外一个源文件中变量int a
void test()
{
printf("test--%d\n", a);
}
int main()
{
test()
{
printf("%d\n", a);
}
return 0;
}
第二个源文件:
int a = 10;
常量
什么是常量?
在程序运行过程中不会发生改变的数据,就称为常量
在C语言中常量分为:
- 字面常量
- const修饰的常变量
- #define定义的标识符常量
- 枚举常量
1.字面常量
30;
11.5;
‘w’;
"abc"
...
这些都是字面常量
2.const修饰的常变量
在C语言中,const修饰的a,本质是变量,但是不能直接修改,有常量的属性,综合起来叫常变量
const int a = 10;
a = 20;
printf("%d\n", a);//报错:左值指定const对象
例子:
[ ]里面必须含有常量值,放入n报错,因为被const修饰的n本质上是一个变量,所以会报错
注意:被const修饰的常变量在C语言中只是在语法层面限制了变量不能直接被改变,但是本质上还是一个变量,所以叫常变量
const int n = 10;
int arr[n] = {0};
3.#define定义的标识符常量
#define MAX 100
#define STR "abcdef"
...
#include <stdio.h>
#define MAX 100
#define STR "abcdef"
int main()
{
printf("%d\n", MAX);
int a = MAX;
printf("%d\n", a);
printf("%d\n", STR);
MAX = 200;//报错
return 0;
}
4.枚举常量
#include <stdio.h>
enum Color
{
//枚举常量
RED,
GREEN,
BLUE
}
int main()
{
//三原色
//RGB Red Green Blue
int num = 10;
enum Color c = RED;
RED = 20;//报错 把新的值赋给了枚举常量,常量的值是不会发生改变的,也不能发生改变,不然会报错!
return 0;
}
三.char字符类型
问:C语言中有字符串类型吗?
没有
字符串就是由一对双引号括起来的一串字符
注意:字符串的结束标志是一个 \0的转义字符,在计算字符串长度的时候\0是结束标志,不算作字符串内容
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "abcdef";
char arr2[] = { 'a','b','c','d','e','f' };
char arr3[] = { 'a','b','c','d','e','f','\0'};
printf("%s\n", arr1);//a b c d e f \0
printf("%s\n", arr2);//a b c d e f 烫烫烫烫烫烫烫烫烫烫烫慄资 ,因为f后面没有\0作为结束标,所以还会持续打印
printf("%s\n", arr3);//a b c d e f
int len = strlen("abc");//求字符串长度的一个函数 string length 头文件 string.h
printf("%d\n", len);
int arrs1 = strlen(arr1);
printf("%d\n", arrs1);//6
int arrs2 = strlen(arr2);
printf("%d\n", arrs2);//38
int arrs3 = strlen(arr3);
printf("%d\n", arrs3);//6
return 0;
}
四.转义字符
%d - 打印整型
%c - 打印字符
%s - 打印字符串
%f - 打印float类型的数据
%lf - 打印double类型的数据
%zu - 打印sizeof的返回值
1.转义字符:\'用于表示字符常量'
2.转义字符:\"用于表示一个字符串内部的双引号"
3.转义字符:\\用于表示一个反斜杠 \ ,防止它被解释为转义序列符4.转义字符:\a警告字符,蜂鸣
5.转义字符:\b退格符
6.转义字符:\f进纸符(没什么用)
7.转义字符:\n换行
8.转义字符:\r回车
9.转义字符:\t水平制表符
10.转义字符:\v垂直制表符
11.转义字符:\ddd ddd表示1~3个八进制的数字。如:\130X
printf("%c", '\130');//打印X 为什么呢?因为130这个八进制转换十进制88之后,作为ASCII值代表一个字符X12.转义字符:\xdd dd表示两个十六进制数字。如:\x30 0
printf("%c", '\x63');//打印c
请问输出多少字符?
解析:\t它在字符串里面是一个字符,它的效果相当于4个字符
printf("%d\n", strlen("c:\test\628\test.c"));// 14
五.注释
1.代码中有不需要的代码可以直接删除,也可以注释掉
2.代码中有些代码比较难懂,可以加一下注释文字
- C语言的注释风格:/* */ (不可嵌套)
- C++语言的注释风格://
写注释的好处:
1.注释可以梳理代码
2.对复杂的代码进行解释
3.写代码的时候写注释,是帮助自己,也帮助别人
六.选择语句和循环语句
C语言是【结构化】的程序设计语言
-顺序结构
-选择结构
-循环结构
C语言如何实现选择呢?
- if else
- switch
C语言如何实现循环呢?
- while语句
- for语句
- do...while语句
七.函数
int 返回类型
Add 函数名
(int x, int y) 函数参数
int Add(int x, int y)
{
//函数体
int z = 0;
z = x + y;
return z;
}
int main()
{
int n1 = 0;
int n2 = 0;
//输入
scanf("%d %d", &n1, &n2);
//求和
int sum = Add(n1, n2);
//输出打印
printf("%d", sum);
return 0;
}
八.数组
C语言中给了数组的定义:一组相同类型元素的集合
int main()
{
//存入0~9
//数组的定义
int arr[10] = {0,1,2,3,4,5,6,7,8,9 };
char ch[5];
double d[10];
//C语言规定:数组的每个元素都有一个下标,下标是从0开始的
// 数组可以通过下标来访问
// []中不写数字也可以,下标的长度通过给定的数值的多少来决定(根据后面出什么内容来决定)
//printf("%d\n", arr[8]);
//循环打印
int i = 0;
while (i < 10)
{
printf("%d ", arr[i]);
i++;
}
return 0;
}
0 - 数字0
'0' - 字符0 -ASCII值是48
'\0' - 字符 - ASCII值是0
EOF - end of file 文件的结束标志 值是-1
#include <stdio.h>
int main()
{
int arr[10];//10个元素 这是整型类型的数组,所以它不以\0来当结束标志
int arr2[] = { 1,2,3 };//arr2数组有3个元素 根据初始化的多少来决定数组有几个元素
return 0;
}
代码输出什么?
随机值
#include <stdio.h>
#include <string.h>
int main()
{
//char arr[] = { 'b', 'i', 't' };//这是char(字符)类型的数组
//[b i t] 后面还有字符,直到找到 \0才结束
//strlen 求的是字符串的长度
char arr[4] = { 'b', 'i', 't' };//打印 3
//不完全初始化,剩余的部分默认初始化为0(这个0与\0没区别,遇到就结束)
printf("%d\n", strlen(arr));//随机值
return 0;
}
VS对C99中的一些语法支持不是很好,不支持变长数组
#include <stdio.h>
int main()
{
//C99标准之前,数组的大小都是用常量或者常量表达式来指定
//C99标准之后,支持了变长数组,这个时候允许数组的大小是变量,但是这种指定方式的数组是不能初始化的
int n = 10;
int arr[n] = { 0 };//初始化就报错了
return 0;
}
九.操作符
C语言是非常灵活的
C语言提供了非常丰富的操作符,使得使用起来就比较灵活
#include <stdio.h>
int main()
{
int a = 7 / 2;
int b = 7 % 2;//取模
printf("%d", a);//打印3
printf("%d", b);//打印1
//除号的两端都是整数的时候,执行的是整数除法,如果两端只要有一个浮点数就执行浮点数的除法
float a = 7 / 2.0;
//取模操作符的两个操作数只能是整数
int b = 7 % 2;//取模
printf("%.1f", a);//打印3.5
printf("%d", b);
return 0;
}
#include <stdio.h>
int main()
{
int a = 0;//第一次赋值就是初始化
a = 20;//最后的都是赋值
//a + b 两个操作数相加,这个时候 + //双目操作符
//单目操作符 - 只有一个操作数
return 0;
}
在C语言中,0表示假,非0表示真
sizeof操作符
#include <stdio.h>
int main()
{
//sizeof是操作符,是单目操作符
//是一个判断数据类型或者表达式长度的运算符(计算变量所占空间大小)
int a = 10;
printf("%d\n", sizeof(a));
int arr[10] = { 0 };
printf("%d\n", sizeof(arr));//40 计算的是整个数组的大小,一个整型有4个字节,单位是字节
printf("%d\n", sizeof(arr) / sizeof(arr[0]));//10 数组的元素个数
return 0;
}
前置++,后置++,前置--,后置--,的使用
#include <stdio.h>
int main()
{
int a = 10;
int b = a++;//后置++,先使用,后++
//b=a,a=a+1
printf("%d\n", b);//10
printf("%d\n", a);//11
int a = 10;
int b = ++a;//前置++,先++,后使用
//a=a+1,b=a
printf("%d\n", b);//11
printf("%d\n", a);//11
int a = 10;
int b = a--;//后置--,先使用,后--
//b=a,a=a-1
printf("%d\n", b);//10
printf("%d\n", a);//9
int a = 10;
int b = --a;//前置--,先--,后使用
//a=a-1,b=a
printf("%d\n", b);//9
printf("%d\n", a);//9
return 0;
}
强制类型转换
#include <stdio.h>
int main()
{
//只要写的是浮点类型的,编译器就默认为是double类型的值
int a = 3.14;
//3.14 字面浮点数 编译器默认理解为double类型
//强制类型转换
int a = (int)3.14;
//int a = int(3.14)这种写法是错误的
printf("%d\n", a);
return 0;
}
逻辑与和逻辑或
#include <stdio.h>
int main()
{
//&& 逻辑与 - 并且
//|| 逻辑或 - 或者
//例子:如果有个东西需要搬,我说张三并且李四来帮忙,张三和李四都要过来帮忙,张三或者李四过来帮忙,张三来可以,李四来也可以,张三李四一起来也可以
return 0;
}
条件操作符(三目操作符)
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
//表达式 ? 操作数1 : 操作数2
//表达式为真时,结果为操作数1
//表达式为假时,结果为操作数2
int r = a > b ? a : b;
printf("%d", r);//打印20
return 0;
}
逗号表达式:逗号隔开的表达式
逗号表达式的特点是:从左到右依次计算,整个表达式的结果是最后一个表达式的结果
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
int c = 0;
//从左到右依次计算,整个表达式的结果是最后一个表达式的结果
// c=8 a=28 5
int d = (c = a - 2, a = b + c, c - 3);
printf("%d\n", d);//5
return 0;
}
[ ]下标引用操作符
#include <stdio.h>
int main()
{
//int arr[10]定义数组语法形式
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//下面才是作一个操作符
//访问元素的时候下标可以用变量
int n = 3;//这里为什么可以用变量?因为变量的值一定是程序运行起来才有的
arr[n] = 2;//[]就是下标引用操作符 arr和3就是[]的操作数
return 0;
}
( )函数调用操作符
#include <stdio.h>
int Add(int x, int y)
{
return x + y;
}
int main()
{
int sum = Add(2, 3);//()就是函数调用操作符,Add,2,3都是()的操作数
return 0;
}
关键字
C语言本身内置的,关键字不是自己创建出来的,也不能自己创建
#include <stdio.h>
int main()
{
//局部变量默认是自动变量,即auto
//所有的局部变量都是auto类型
int a = 10;//自动变量 变量自动创建自动销毁,auto省略了
return 0;
}
常见关键字
const 常属性
signed 有符号的
unsigned 无符号的
extern 声明外部符号
register 寄存器
static 静态的
return 函数返回值
enum 枚举
struct 结构体
union 联合体(共用体)
typedef 类型重命名
void 无(函数的返回类型,函数参数)