初次识得C语言,以后就是同路人
大家好啊,我是四年过后,是一名双非本科的大二学生
这个春暖花开的季节,让我们相约,一同进步一同成长
编程学习的道路,我要稳扎稳打,为自己树立目标和确定前进的方向
我会不断地对学过的知识进行自我复述,多练习题目,会多多拜读编程类的书籍
每周至少学习40个小时,及时进行对所学内容的总结
学习的历程:C语言->初阶数据结构->C/java->高阶数据结构->linux->计算机网络->Mysql
C语言总体概述
灵魂系列三连问
什么是C语言?-----what
C语言是一门编程语言,是我们与计算机交流的一种手段
C语言是底层开发工具,因为在语法问题每个国家上各执己见,其标准是由(美国国家标准协会(ANSI))制定的ANSI C标准其发展历程经过C89 C90 C99 C11 … 现在常用的标准是C89 C90的标准
像上面图上的信息一样,C语言是在底层进行开发的工具
它是一门面向过程的编程语言,常用的编译器有devc++ ,visual studio,GCC… 这里我给大家推荐一款编译器
是 visual studio 2019(VS 2019)
为什么学习C语言?-----why
在大学里面,我们当中的很多人肯定首先接触到的是C 这门语言,学习C语言能够帮助我们很好地感知学习编程的思维逻辑,学了C这门语言,如果我们想要再学习其他的语言,那也是上手特别快的,C生万物这个说法我们是很熟悉的
学了C语言我们能干什么?-------how
C语言和JAVA语言不通,JAV语言能够在学习的过程中即时写出一些东西,而C语言可能学了很久,也是在黑框框里面运行一些程序,并不很快地做出实际类型的东西,但C语言的用途很广泛,包括java都是用C为底层进行实现的
因为偏注重底层开发,要研究操作系统 网络 数据库等等相关的知识
第一个C程序
学习了这个程序意味着编程之路的开启
数据类型
sizeof关键字是计算所占内存大小的
单位是字节
单位 | 转换关系 |
---|---|
bit | 8bit=1Byte |
Byte | 1024 Byte=1KB |
KB | 1024 KB=1 MB |
MB | 1024 MB=1 GB |
GB | 1024 GB= 1 TB |
TB | 1024 TB= 1 PB |
PB | … |
数据类型 | 名称 | sizeof(数据类型) |
---|---|---|
char | 字符类型 | 1 |
short | 短整型 | 2 |
int | 整型 | 4 |
long int | 长整型 | 4 |
long long int | 更长的整型 | 8 |
float | 单精度浮点数 | 4 |
double | 双精度浮点数 | 8 |
这里可能有人会问到几个问题:
1、float和double都是浮点数,有什么区别呢?
答:对编程人员来说,double 和 float 的区别是double精度高,有效数字16位,float精度7位。
但double消耗内存是float的两倍,double的运算速度比float慢
2、为什么long int 和int 的sizeof大小一样?
答:标准上只是说long 至少要跟Int 一样大,但都要有一个确定的标准
sizeof(char) == 1
sizeof(char) <= sizeof(short)
sizeof(short) <= sizeof(int)
sizeof(int) <= sizeof(long)
sizeof(long) <= sizeof(long long)
3、为什么有那么多类型呢?
答:我问你啊,我们世界上那么多东西,他们代表的数值大小都是一样的吗?就比如一个人的存款和一个人的年龄一样,他们的数值大小显然是不同的,当然了也有可能,不过,你要知道,我们的计算机内存有限,不可能说在创造一个程序的时候,不考虑内存的限制,比如short和int 我们在定义年龄的时候,完全可以用short类型的变量,short则有可能储存不下这些存款,所以在面对任何事物的时候,我们要选择不同的类型进行定义才能既节省空间又不容易出错。
我敢打赌后面的题目你都会:
题解:
可以看到,引入一个头文件#include<stdio.h> 有一个主函数main ,利用库函数scanf输入一个变量 用库函数printf输出这个变量,输出整型默认用%d形式
有几个知识点需要注意一下:printf输出的时候,输出的是.3lf ----->是因为保留几位小数的时候,需要用%.mlf的格式进行输出,m代表数字
double的输出是用%lf来进行输出和输入
字符类型是需要用%c来进行输入输出的
我们很快就会学到数据在内存中的存储,感兴趣的铁汁们可以去看一看
变量
我们知道,生活中有些东西是不变的,身份证号码、血型等,这些都不会变化
但还有一些,是会变的,年龄体重等。
在前面我们学习到了数据类型
那我们就来讲一讲,定义变量的方法
数据类型 变量名=初始化的值----->这样一个变量就定义完成了
把变量进行分类
①局部变量
②全局变量
在这个程序中,在大括号内部的global是局部变量,在大括号外部的global是全局变量
全局变量和局部变量同名时,局部变量优先
作用域和生命周期
什么是作用域和生命周期?
作用域就是代码的可执行范围
生命周期指的是变量的创建到变量的销毁之间的一个时间段
1、局部变量的作用域:局部变量的作用域是变量所在的局部范围
局部变量的生命周期:进入作用域生命周期开始,出作用域生命周期结束
2、全局变量的作用域:整个工程
全局变量的生命周期:整个程序的生命周期
灵魂问答
作用域和生命周期有关系吗?
答:作用域可以看成约等于生命周期,就像局部变量出了可执行范围生命周期就结束,全局变量直到整个工程结束才销毁,正好是与它的生命周期相关联。
常量
常量有:
1、字面常量
30 整型常量
3.14浮点型常量
2、const修饰的常变量
很奇怪,常量就是常量m,变量就是变量,常变量是什么呢?
其实本质上是 具有常属性,本质是变量,不能直接修改值
3、#define定义的标识符常量
此时的MAX被标识为MAX=10 定义方式为#define
在下面的数组中,数组定义的时候,[]内是不能放变量的,所以也可验证此时的MAX是常量
字符串
由双引号引起来的一串字符称为字符串字面值,或者简称字符串。
字符串的结束标志是\0字符
转义字符
转义字符 | 释义 |
---|---|
\’ | 用于表示字符常量‘ |
\\ | 用于表示一个反斜杠,防止被解释为一个转义序列符 |
\n | 换行 |
\t | 水平制表符 |
\ddd | ddd表示1-3个八进制数字 |
\xdd | dd表示2个十六进制数字 |
这是一道面试题:
#include<stdio.h>
int main()
{
printf("%d\n",strlen("abc def"));
printf("%d\n",strlen("c:\test\328\test.c"));
return 0;
}
问:分别输出什么?
我们来分析一下:
“ abcdef”有6个字母,c后面有一个空格,我们知道,字符串结束的标志是遇到\0 那空格算不算是字符呢?
我们能够在这张ASCII码表上找到32 这个位置,就是 空格的ASCII码值 所以空格也是一个字符。第一个printf就输出7。
第二个printf 画圈的部分都是转义字符,你可能会有疑问,为什么\328不是\ddd类型的转义字符,八进制有8吗?还有一种解释是\328这个转义字符已经超出了范围,由ASCII码表我们知道最大才127 但是八进制的328很明显要比127大很多。所以第二个printf输出14.
注释有两种风格:
C语言是 /* */ 缺陷是不能嵌套注释
C++是 // 可以注释一行野可以注释多行
我们更习惯于用C++的方式进行注释
选择与循环
if/else
if/else语句是我们很常用的、用来判断的分支语句
就好比我们对一个人他的年龄进行判断
我们在判断的时候,if的括号里面是判断的条件,栗子🌰中的&&符号是一个操作符,大家可以提前了解一下
我们来分析一下这道题目:
我们在实现代码的时候可以这样来实现
switch
在C语言中,可以利用switch+case+break+default 完成选择,具体我们来看一个关于日期的栗子🌰
我们来看一下这个栗子,定义了一个n之后,我们要通过输入一个数字来进行选择今天是星期几,default顾名思义是缺省情况,只有任何条件都不匹配的情况下才会执行。
循环语句
循环有for循环,while循环,do…while循环
for循环是我们最常用的一种循环,我们把循环就想象成每天都在重复做的事情
比如说写代码,假设一个程序员至少需要20000行代码才能熟练敲代码,那么,在我们没有做到这个事情之前,我们就要持续地去写代码
我们看到,通过for循环,我们就能持续地进行写代码这件事,直到它完成
有三个要点:
for循环的括号里 i=0是初始化部分 i<=20000是判断部分 i++是调整部分
当然while循环也能做成这项工作
while的括号内也是判断部分,只要是没有完成这项工作之前,它都会一直进行下去。
我们要进行输入一行 就是要有一个scanf,再进行一次循环的判断
关于循环和分支的更深一步的学习,我会在以后的博客中详细介绍并有大量的题目。
函数
关于函数我总结了一篇博文,大家可以转到这个地方进行学习,里面包含了函数的基本知识和相关的用法,大家尽情享用
题解一:普通函数方法解决
在main函数外部定义一个函数,并实现其功能,我们通过在main函数中,调用这个函数,完成这个程序
有几个需要注意的点是:
1、emp在赋值的时候,要对表达式进行浮点数化,就是17行所示的*1.0这个操作,是对表达式结果进行浮点数化
2、三目运算符我们很容易就能用到,我之前总结过一篇关于操作符的博文,可以去了解一下
3、x>y?x:y----------这个操作符很容易理解
白话一点说就是:x大于y吗?如果大于就输出x,否则就输出y
题解二:
函数嵌套调用的方法
这个解题方式和第一种略有不同,用的是函数的嵌套调用,我们可以看到,函数定义了一个max3以后,又在max3中调用了max2这个函数,可实际上max3中并没有max2这个函数,只有在外部寻找,max2的值又返回给max3,就完成了函数的嵌套调用。输出的方式和题解一相似。
操作符
【操作符看这一篇你就通透了】———操作符详解_爱学习的诸葛大力的博客-CSDN博客
数组
数组可以理解为一组相同类型元素的集合。
其定义方式为:
我们来看一下数组的使用方法:
对于数组的使用我们之前介绍了一个操作符 [ ] 它叫下标引用操作符 它其实就是数组的访问符
补充小知识:
1、数组是使用下标来访问的,下标从0开始
2、数组的大小可以通过计算得到
其他数组相关的知识我们慢慢再跟大家讲解。
一、逆序输出_牛客题霸_牛客网 (nowcoder.com)
==一、==正向输入反向输出的方法:
二、交换的方法
总结
我们共同努力,我们一定会在未来的日子里慢慢地成长,这是我们的目标,
抑或我们的期待,就让我们在未来一点一点地学习,不断探索不断进步。