1.初识C语言

一、什么是C语言

1.介绍

语言
人与人交流:汉语,英语,日语

计算机语言:人和计算机交流的语言
C\C++\JAVA\python\GO

C语言是一门通用计算机编程语言,广泛应用于底层开发,C语言的设计目的是提供一种能以简易的编程的方式编译、处理低级储存器、产生少量的机器码以及不需要如何运行环境支持便能运行的编程语言。

在这里插入图片描述

二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。 [1] 目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。

C语言有国际标准
C89,C90,C99,C11

在这里插入图片描述

既然了解了C语言那么怎么写代码呢???
工具:编译器
其编译器主要有:Clang,GCC(如:VScode),WIN-TC,MSVC(如:VS2019),Turbo,C等
我用的主要是VS2019
VS2019------集成开发环境------集成了MSVC这样的编译器------可以编写+编译C语言的代码

2.第一个C语言程序

1.创建一个项目
2.创建一个源文件
3.写代码
4.编译代码

这里就不详细讲了要过程的看下载C语言创建项目链接

在控制台上打印Hello World的代码

#include <stdio.h>
int main()
{
	printf("Hello World");
	return 0;
}

二、main函数

我们在写C程序的时候会发现每一个程序都有一个main函数,这是为什么呢?每一个C程序都必须有吗?
答案是:是的!!!

1.介绍

main函数,又称主函数,是程序执行的起点,main是相对来说的,如同音学理论之主调于泛音,泛音即程序中的除main之外的其他函数,迎合人们的思考方式而生成的而非必定的模式。有主有次,执行起来条清缕析,既可将程序模块化又实现了一个闭合的整体。

2.用法

在任何一个C程序中,main函数都是必不可少的,main函数是程序唯一的入口,也就是说,程序运行时,首先从main函数开始执行。

看这样一个代码:

#include <stdio.h>
int main()
{
    int n = 0;
    int= 0;
    scanf("%d", &n);
    if (n < 12)= 2;
    else= n / 12 * 4 + 2;
    printf("%d\n",);
    return 0;
}

描述图

3.注意

同时我们要注意一个C程序必须有且仅能有一个main函数,如果一个程序中出现了多个main函数,那么必定会出错。

#include <stdio.h>
int main()
{
	return 0;
}
int main()
{
	int a = 0;
	printf("%d\n", a);
	return 0;
}

描述图

三、常见的数据类型

C语言中常见的数据类型都有哪些?
char //字符数据类型
short //短整型
int //整形
long //长整型
long long //更长的整形
float //单精度浮点数
double //双精度浮点数

1.为什么出现这么多的类型?

存在这么多的类型,其实是为了更加丰富的表达生活中的各种值。不同的数据可以用不同的类型来表示。

2.每种类型的大小是多少?

可以使用sizeof操作符来计算不同数据类型所占空间的大小

#include <stdio.h>
int main()
{
    printf("%d\n", sizeof(char));
    printf("%d\n", sizeof(short));
    printf("%d\n", sizeof(int));
    printf("%d\n", sizeof(long));
    printf("%d\n", sizeof(long long));
    printf("%d\n", sizeof(float));
    printf("%d\n", sizeof(double));
    printf("%d\n", sizeof(long double));
    return 0; 
}

在这里插入图片描述

3.类型的使用

#include<stdio.h>
int main()
{
	int a = 0;      //使用关键字int定义一个整型变量a
	char ch = 'p';  //使用关键字char定义一个字符变量p
	float b = 3.14; //使用关键字float定义一个单精度浮点数b
	return 0;
}

四、输入输出函数

C语言的输入输出
c语言一般使用scanf()、fscanf()、getchar()、getch()、getche()和gets()等进行输入,printf()和fprintf()等进行输出

1.C语言的输入

(1).使用scanf()函数进行输入

scanf()函数的原型是

int scanf(const char * restrict format,...);

scanf()函数位于C标准库头文件<stdio.h>中
format 是 类似于 %d %s %e %f %lf %lld之类的格式串
格式后面按格式串里面定义的先后顺序 依次书写变量的地址 如&a和&b 但是字符数组的变量名就代表了该字符数组的首地址了 不用加上&取地址运算符

简单来说:
如:

#include <stdio.h>
int main()
{
	int i;
	scanf("%d", &i); 
	return 0;
}
scanf("%d",&i);//&i表示变量i的地址,&是取地址符
scanf语法("格式控制符",输入取值地址);//取值地址&(要输入的变量值).

(2).scanf() 常见的格式控制符汇总

格式控制符含义
%d输入一个int型整数
%ld输入一个long型整数
%lld输入一个long型整数 输入一个long long型整数
%c输入一个字符
%s输入一个字符串(遇到空格截断)
%f输入一个float单精度浮点数
%lf输入一个double双精度浮点数
%o %x %u输入一个八进制整数到int型变量 输入一个十六进制整数到int型变量 输入一个无符号整数到int型整数
%e %le输入一个指数形式的小数到float单精度浮点数 输入一个指数形式的小数到double单精度浮点数

(3).3.fscanf()是文件输入的函数

目前暂不了解,要了解的点链接 fscanf()

(4).getchar()是从输入流中读取一个字符的函数

语法格式如下:

char ch;
getchar(ch);

getchar()函数位于C标准库头文件<stdio.h>中
后续的getchar()调用是不会等待用户按键,而直接读取缓冲区中的字符

(5).getch()是从控制台中读取一个字符的函数

char ch;
getch(ch);

getch()函数位于C标准库头文件<conio.h>中
getch()调用等待用户按键,从控制台读入字符 并不会回显到控制台

(6).getche()是从控制台中读取一个字符的函数

char ch;
getche(ch);

getche()函数位于C标准库头文件<conio.h>中
getche()调用等待用户按键,从控制台读入字符 并立刻回显到控制台

(7).gets()是从输入缓冲区读入一个字符串赋值到指定的字符数组中

char str[2048];
gets(str);

代码基本等价于scanf("%s", str);
但是使用scanf("%s", str); 遇到空格会截断字符串 使用gets(str); 遇到空格不会截断字符串
gets()函数位于C标准库头文件<stdio.h>中
gets() 函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间。
gets() 可以直接用于输入带空格的字符串,遇到换行符才结束输入

2.C语言的输出

printf()函数的原型为

int printf(const char *format, ...);

printf()函数位于C标准库头文件<stdio.h>中
printf的控制格式和scanf是差不多的 printf还可以输出相关的转义字符

#include <stdio.h>
int main()
{
	// \n表示换行的转义字符
    printf("Hello World!\n");  
    return 0;
}

printf中想要输出’‘必须要使用转义字符’'才能输出成功
printf("Hello World!\\");
就能输出Hello World!\

简单来说
printf函数的调用格式为:printf(“格式化字符串”,输出表列)。
示例如:
在这里插入图片描述

五、常量、变量

生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等等)
有些值是可变的(比如:年龄,体重,薪资)。
不变的值,C语言中用常量的概念来表示,变得值C语言中用变量来表示。

1.定义变量的方法

语法:数据类型 变量名 = 要初始化的值

int 年龄 = 18;
float 重量 = 45.5f;
char 字母 = 'w';

2.变量命名的要求

1.只能由字母(包括大写和小写)、数字和下划线( _ )、(unicode(UTF-8)可用中文)、组成。
2.不能以数字开头。
3.长度不能超过63个字符。
4.变量名中区分大小写的。
5.变量名不能使用关键字。

#include <stdio.h>
int main()
{
	int d_9 = 8;
	//int 6_p = 7;
	int a = 3;
	int A = 4;
	printf("a=%d A=%d", a, A);
	//int if = 9;
	return 0;
}

1.变量命名不能以数字开头,不能以关键字命名

在这里插入图片描述

2.变量名区分大小写

在这里插入图片描述

3.变量名为中文

在这里插入图片描述

3.变量的分类

变量分为局部变量和全局变量,我们可以这样理解:

1.全局变量就是定义在{ }外部的变量,全局变量如果不初始化默认值为0。

在这里插入图片描述

2.局部变量就是定义在{ }外部的变量。

在这里插入图片描述
然后思考一个问题,局部变量和全局变量可以同名吗?
答案是可以的!

看这样一段代码:

#include <stdio.h>
int 全局 = 2019;//全局变量
int main()
{
    int 局部 = 2018;//局部变量
    //下面定义的 全局 会不会有问题?
    int 全局 = 2020;//局部变量
    printf("全局 = %d\n", 全局);
    return 0;
 }

在这里插入图片描述
但是,不建议将局部变量和全局变量的名字写成一样的。
真的不建议

4.变量的作用域和生命周期

首先我们要知道什么是作用域?
作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的而限定这个名字的可用性的代码范围就是这个名字的作用域。

1. 局部变量的作用域是变量所在的局部范围。
2. 全局变量的作用域是整个工程。

看一段代码:

#include <stdio.h>
int p = 8;
void text()
{
	int i = 9;
	printf("%d\n", p);
}
int main()
{
	text();
	printf("%d\n", i);
	printf("%d\n", p);
	return 0;
}

在这里插入图片描述
在这里插入图片描述
那接下来讨论,什么是生命周期呢?
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段

1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
2. 全局变量的生命周期是:整个程序的生命周期。

在这里插入图片描述

5.常量

C语言中的常量和变量的定义的形式有所差异。
C语言中的常量分为以下以下几种:

字面常量
const 修饰的常变量
#define 定义的标识符常量
枚举常量

(1).字面常量

1.首先介绍字面常量:

就像3.14,100,‘a’ , “abcdf”.这些都是字面常量

int main()
{
	3.14;
	5;
	300;
	's';
	"adsfis";//这些都是字面常量
	"hello world";
	return 0;
}

(2).const 修饰的常变量

2. const 修饰的常变量

const 修饰的常变量在C语言中只是在语法层面限制了该变量不能直接被改变,但是本质上还是一个变量,所以叫常变量。
举个例子:

#include <stdio.h>
int main()
{
	const int i = 9;
	i = 0;
	return 0;
}

在这里插入图片描述

(3).#define 定义的标识符常量

语法:
#define 常量名 值

//#define 定义的标识符常量

#define max 100
int main()
{
	max = 99;
	int arr[max]={0};
	return 0;
}

在这里插入图片描述

(4).枚举常量

枚举常量即可以一一列举的常量,定义枚举类型需要使用枚举关键字enum。

enum是计算机编程语言中的一种数据类型。

枚举类型:在实际问题中,有些变量的取值被限定在一个有限的范围内。

例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等。如果把这些量说明为整型,字符型或其它类型显然是不妥当的。

为此,C语言提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围。应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型。

举个例子,比如说性别,对于性别来说,男和女,我们是可以一一列举出来的,上代码:
#include <stdio.h>
int main()
{
	enum 性别	//enum枚举关键字
	{
		男性,
		女性,
		保密	,	//性别枚举类型的可能取值
	};
	printf("%d\n", 男性);
	printf("%d\n", 女性);
	printf("%d\n", 保密);
	enum 性别 s = 男性;
	//注:枚举常量的默认是从0开始,依次向下递增1的
	return 0;
}

在这里插入图片描述

6.注意!!!多文件(extern)

创建两个cpp文件,文件2调用文件一的变量

在这里插入图片描述

很显然调用不了,那要如何调用呢?
extern声明一下变量

在这里插入图片描述

成功运行

六、字符串+转义字符+注释

1.字符串

什么是字符串呢?

“hello world!”——这就是一个字符串。

这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
那现在有一个问题,这个字符串里有几个字符呢?
是只有’h’, ‘e’, ‘l’, ‘l’, ‘o’,’ ’ ', ‘w’ , ‘o’, ‘r’, ‘d’, ‘!’. 这12字符吗?
不是的!!!
为什么呢?因为在C语言中,字符串的末尾都有一个 '\0’这样的转义字符作为它的结束标志。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。

来看一段代码:

#include <stdio.h>
//下面代码,打印结果是什么?为什么?(突出'\0'的重要性)
int main()
{
	char arr1[] = "hello";
	char arr2[] = { 'h','e','l','l','o'};
	char arr3[] = { 'h','e','l','l','o','\0'};
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	printf("%s\n", arr3);
	return 0;
}

运行看结果:

在这里插入图片描述
这就很好地证明了’\0’是字符串的结束标志,隐藏在字符串结尾,%s打印字符串遇到’\0’结束。

2.转义字符

上面我们提到了字符串的结束标志“\0’是一个转义字符,那么什么是转义字符呢?

定义:
转义字符是很多程序语言、数据格式和通信协议的形式文法的一部分。对于一个给定的字母表,一个转义字符的目的是
开始一个字符序列,使得转义字符开头的该字符序列具有不同于该字符序列单独出现时的语义。因此转义字符开头的字

符序列被叫做转义序列。

字符表
所有的转义字符和所对应的意义:
在这里插入图片描述
这里是具体的转义字符点击它

3.注释

在编写C语言源代码时,应该多使用注释,这样有助于对代码的理解。在C语言中有两种注释方式:

一种是以/*开始、以*/结束的块注释(block comment);

另一种是以//开始、以换行符结束的单行注释(line comment)。

七、关键字static的作用

在C语言中,关键字static通常用来修饰变量和函数

  1. 修饰局部变量-称为静态局部变量
  2. 修饰全局变量-称为静态全局变量
  3. 修饰函数-称为静态函数

1.static修饰局部变量

下面我们通过两段代码来理解static修饰局部变量的意义。

//代码1
#include <stdio.h>
void test()
{
	int i = 0;
	i++;
	printf("%d ", i);
}
int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		test();
	}
	return 0;
}
//代码2
#include <stdio.h>
void test()
{
	//static修饰局部变量
	static int i = 0;
	i++;
	printf("%d ", i);
}
int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		test();
	}
	return 0;
}

大家可以自己先思考一下答案,这两段代码有什么不同的地方,输出结果分别是什么,会有什么不一样?
然后我们来对比一下它们的结果:

在这里插入图片描述
在这里插入图片描述

我们可以看到,两段代码只有一处不同,代码1test函数中的整型变量i没有被static修饰,而代码2test函数中的整型变量i有被static修饰,就因为这一处不同,导致了输出结果的差异。
相信代码1 的输出结果大家都能明白,那代码2 为什么是这样的结果呢?
接下来就给大家解释一下:
首先,我们先来补充一个知识:

一般来说,内存分为栈区,堆区和静态区。

具体请看下一章内存四区

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值