C语言学习,从入门到进阶系列(二)

C语言学习,从入门到进阶系列(二)

承接上文,这边帮大家解决printf里面的一些%。
%a(%A) 浮点数、十六进制数字和p-(P-)记数法(C99)
%c 字符
%d 有符号十进制整数
%f 浮点数flot
%lf 浮点数double
%e(%E) 浮点数指数输出
%g(%G) 浮点数不显无意义的零"0"
%i 有符号十进制整数(与%d相同)
%u 无符号十进制整数
%o 八进制整数
%x(%X) 十六进制整数
%p 指针
%s 字符串
%% “%”
这边帮大家整理了一些。当然还有好多好多。
然后我们继续来了解一些C语言的其他知识。
## 全局变量与局部变量
我们可以想象整个C语言环境是宇宙。局部变量是整个宇宙中每个星球上的生物。他们没有超能力,只能在各自的星球上生活。全局变量就是超人,可以遨游整个宇宙。
这样说还是有点抽象的我们上代码。

int m = 0;  //全局变量
int main()
{
	printf("%d ", m);
	while (1)
	{
		int m1 = 10;  //局部变量
		printf("%d ", m1);
		break;
	}
	printf("%d ", m);
	return 0;
}

我们可以看到我们的m是超人,m1呢是像我们一样的常人。
超人可以到main()函数里面旅游,可是我们的m1只能在whil循环里面生活。当然我们的m1有理想,想去警察局去改自己的名字。把自己的名字改成m。那么问题来了,它能改名成功吗?
警察局的警察叔叔看到这份请求之后当然是同意的啦。毕竟名字自由。但是警察叔叔还是提出了建议,希望大家尽量不要改成名字一样的,每个人都是独特的,不要为了一己私欲,一味的模仿别人,要做自己。

回到学术点的东西。介绍两个知识点:

作用域和生命周期

局部变量的作用域:局部变量所在的局部范围
全局变量的作用域:整个工程
局部变量的生命周期:进入局部变量所在的范围,生命周期开始,出局部范围生命周期结束
全局变量的生命周期:程序的生命周期

当我们要引用外部全局变量的时候要用extern来提取。

extern int abc;

这样就能提取一个工程内的外部变量。(注意要标识是什么类型的变量)

const修饰的常变量

#include<stdio.h>
const int m = 0;
int a = 0;
int main()
{
	a = 100;
	m = 20;
	printf("%d %d", a, m);
	return 0;
}

我们定义了两个全局变量。a和m。m前面有一个怪怪的“帽子”const;那这个“帽子”是干什么的呢?当我们运行上面的代码的时候,相信大家都会遇到报错。为什么呢?
都是“帽子”惹的祸。因为const修饰的变量是不能被修改。所以当我们在main函数里面m = 20的时候会出现错误。
注意:常变量的定义,不是常量,只是带有了常属性。不能用于数组的大小定义。

#define定义的标识符常量

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

这个标识符定义的Max是常量可以用于数组的大小定义。

枚举常量

#include<stdio.h>
enum color
{
	//枚举的可能取值 是常量不能更改
	green,
	blue,
	red
};
int main()
{
	enum color s = green;
	printf("%d %d %d ", green, blue, red);   //输出是   0 1 2 
	return 0;
}

enum是用来定义枚举常量的。枚举里面的初值是从0开始往下衍生的。我们也可以给他赋初值。

#include<stdio.h>
enum color
{
	//枚举的可能取值 是常量不能更改
	green = 3,
	blue = 9,
	red
};
int main()
{
	enum color s = green;
	printf("%d %d %d ", green, blue, red);   //输出是    3 9 10
	return 0;
}

我们可以看到我们没有给red赋初值,但与之前的red的输出不一样。所以可以知道enum里面接下来的值是依靠之前的值往下衍生的。

常量的知识差不多就是这样子啦。
那我接下来学习的知识

字符串

我们先前在第一章里面知道了char类型,是用于定义字符变量的,这个变量可以获取的字符只有一个的。是用单引号来获取的。

#include<stdio.h>
int main()
{
	char a = 'a';
	printf("%c", a);   //输出是  a;
	return 0;
}

当我们要获取一连串的字符的时候应该怎么办呢?
这个时候我们想一想,我们是不是要用一连串的地方来放这些东西。
这时候我们想到了一个东西。数组。

#include<stdio.h>
int main()
{
	char a[10] = "abcdef";
	printf("%s", a);   //输出是  abcdef;
	return 0;
}

我们可以看到a[10] 之后获取的字符串被 ” “双引号包围了。所以这个就是字符和字符串不同的地方。
那我们了解一下,这个字符串是怎么保存的呢?
依据字符的保存可以知道,一个地方放一个字符。那么我们上个代码可以想到。字符只有6个。但是地方有十个,那剩下的怎么办呢?
其实字符不止6个而是7个。为什么呢,因为我们的电脑在读取的时候,要知道字符串什么时候会结束,所以f字符之后会自带一个结束标志 \0 。这个标志来标识结束。剩下的空间也是\0

#include<stdio.h>
int main()
{
	char a[10] = "abcdef";
	char b[] = { 'a','b','c','d','e','f' ,'\0'};
	char c[] = { 'a','b','c','d','e','f' };
	printf("%s\n%s\n%s", a ,b,c);
	return 0;
}

在这里插入图片描述
我们可以从上面的代码发现,c数组的输出有点问题。因为什么呢?
眼尖的同学会发现,c比b少了一个元素 \0.就是因为这个偷懒,让电脑不知道什么时候结束。所以 之后会输出一串我们不知道的东西。
所以字符串的\0很重要!!!!!
所以字符串的\0很重要!!!!!
所以字符串的\0很重要!!!!!

转义字符

\a 响铃
\b 退格(BS) ,将当前位置移到前一列
\f 换页(FF),将当前位置移到下页开头
\n 换行(LF) ,将当前位置移到下一行开头
\r 回车(CR) ,将当前位置移到本行开头
\t 水平制表(HT) (跳到下一个TAB位置)
\v 垂直制表(VT)
\ 代表一个反斜线字符’’
’ 代表一个单引号(撇号)字符
" 代表一个双引号字符
\0 空字符(NULL)
\ddd 1到3位八进制数所代表的任意字符
\xdd 1到2位十六进制所代表的任意字符
? (三字母词)一个比较古老的概念现在的编译器大都不用了这边提一提
转义字符是 ‘\’ 这个可以把原本字符转变一个意思。

选择语句

#include<stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a > 0)
	{
		printf("正数");
	}
	else
	{
		printf("负数");
	}
	return 0;
}

这边的if else语句就是选择语句。
if(判断条件)
{
(判断条件许可之后的操作);
}
else if(判断条件)
{
(判断条件许可之后的操作);
}
else
{
(判断条件不许可之后的操作);
}

这边是if else语句嵌套的模板。

循环语句

循环语句有三种。
for
whil
do
这三种循环语句的模板都不同。
for循环的代码模板
int i = 1;
for( i = 1 ; i <= n ; i ++){ //运用了for循环
fact *= i;
}
while循环的模板
while( 循环的条件)
{
循环内部的执行语句; //循环条件判断的变量要改变,要不然就会死循环。
}
do while循环模板
do
{
循环语句
}while(循环条件);
## 函数
还记得我们第一期的那个加法实现吗?
如果我们要实现减法,除法等等。那我们就会发现,我们的main函数越来越长,而且到时候寻找的时候又很麻烦。那我们就像main函数一样,创建一个函数。这个函数可以帮我们简化main函数里面的内容。

#include<stdio.h>

//加法函数:
int jf(int m, int n) //当中的m和n是用来接收变量的桥梁。这边的int时决定这个函数的返回值。
{
	return m + n;    // 实现m+n;并返回值。返回值的类型与定义时的类型相同
}


int main()
{
	int m = 0;
	int n = 0;
	scanf("%d %d", &m, &n);
	printf("%d", jf(m, n));
	return 0;
}

这样子我们的main函数做的事情就少了。虽然这个函数不能淋漓尽致的把函数的好处体现,但我相信,现在在读文章的你,之后会慢慢体会,作者的能力有限,而且限于篇幅,只能稍微点到为止。在此表示歉意。

数组

当我们要存储一连串的东西的时候,就会用到数组。
数组由数组名和下标组合。

#include<stdio.h>
int main()
{
	int a[10];   //a是数组名,10是下标,用于查找,并且标识能存储多少数据。int是这个数组的类型。数组的定义类型同变量定义
}

注意:数组的下标是从0开始到最大值 - 1.就比如上面这个代码的下标是:0,1,2,3,4,5,6,7,8,9。
数组的初始化:

#include<stdio.h>
int main()
{
	int a[10] = { 0,1,2,3,4,5,6,7,8,9 };   //a是数组名,10是下标,用于查找,并且标识能存储多少数据。int是这个数组的类型。数组的定义类型同变量定义
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);   //输出结果   0 1 2 3 4 5 6 7 8 9 
	}
	return 0;
}

数组的初始化是用{}来初始化的
学到这里,我们还不知道+ - * / 这些都是什么东西。还有没有像这些,一样的东西。我们下期再见。
我是来自江南的大学生,我们一起进步。乾坤未定,你我皆是黑马。

  • 10
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值