期末考试结束了,真是感慨良多啊......
C语言编程题大家都做对了多少呢?
不管怎么样,都已经过去了。不管你学得怎么样,都可以在接下来的时间里,我们一起重新回顾一遍C语言初阶的知识。
为什么我要在博客上讲解C语言初阶的知识?不都会了吗?
我的代码有14道题都通过了,看起来学得也不算差,是什么促使我做出了这样的决定?
是这样的,故事发生要从平方根说起......
某道编程题对我来说伤害性不大,侮辱性极强。只是一个分段函数的编程题,要求输入不同范围的数根据不同的式子进行计算。这???也太简单了吧!不是有手就行?用几个if()else if()语句就能解决。
然而当看到某个范围里的式子,里面有平方根。
这就给我整不会了。
从始至终我都没想到平方根要调用哪个函数!引用math.h的头文件,然后再用sqrt()不就算出来了吗?
可惜那时候就是没想起来。
归根到底还是平常学习太浮夸了,自认为好多东西都已经会了,甚至很多时候老师的课都不去听......结果就是连怎么算平方根都给忘了。
正因如此,我才决定要温习C语言初阶的知识,用空杯心态来学习C语言。
对的,空杯心态。不论是在CCtalk还是训练营里,张老师都不止一次强调空杯心态。
我自己来学习一遍,然后写下博客,写博客的过程能帮助我更深层次地理解和巩固,也给了大家一些学习上的参考。
当然,您也可以写自己的博客文章,帮助自己更好地理解。
或许接下来我要讲解的知识对读者来说都太简单了,大家可以根据需求选择是阅读还是不去阅读。
而一旦选择继续阅读,那么请持空杯心态去学习C语言初阶知识。
再简单的知识点,也要像初学者、像小白那样去学习。
Stay Hungry, Stay Foolish.
奥里给,干哪!(有画面没
有任何问题都可以私信我。
C语言初阶系列先从《初识C语言》讲起,在《初识C语言》中只是基本了解C语言的基础知识,对C语言有一个大概的认识。每个知识点都只是简单认识,不做仔细讲解,在后边的章节中会细讲。
目录
凡是过往,皆为序章
什么是C语言
第一个C语言程序
数据类型
变量、常量
局部变量和全局变量
在搞清楚什么是C语言之前,应该先搞懂什么是计算机的编程语言。简单地说就是计算机语言。
在生活中,不论是汉语、英语还是日语,它们都人和人交流的语言。
那么,计算机语言就是人和计算机交流的语言。
计算机语言都有哪些呢?
计算机语言有很多,如C/C++、Java、Python、go、Rust等,它们都是人和和计算机交流的语言,人通过写出相对应的语言的代码,用这些计算机语言和计算机沟通。
计算机语言有上千种,C语言只是其中一种。
C语言广泛地用于底层开发。
那么问题来了,什么是底层开发?
我们的计算机是硬件,那么操作系统就是凌驾于硬件之上的,它能让我们的硬件正常工作。
而在操作系统和硬件之间的,是驱动。
操作系统通过调用驱动来驱动硬件来进行工作。
在操作系统之上的就是应用软件,如QQ、360安全卫士。
我们把操作系统以上的部分称为“上层”,那么操作系统及以下部分是“下层”或是“底层”。
我们说C语言广泛地用于底层开发,如Linux操作系统就是用C语言去写的,诸多驱动程序、游戏引擎也是用C语言去写的。
事实上,C语言也可用于应用软件的开发,早期的QQ就是用C语言写的。马化腾说过:“我们最终是靠C打天下的。”(吴晓波《腾讯传》记载)
早期人们写程序用的是01序列,但只用0和1来写程序太繁琐了,程序员还需要手册去查找相应的指令。
想想就知道,用0和1来写程序太困难了。
于是就有人想,能不能用单次来替代0和1呢?
如
100001 - ADD
000101 - SUB
这些单词是”助记符“。
后来出现了由助记符组成的编程语言,叫做汇编语言。
后来人们发明了B语言,再后来人们发明了C语言。
相对于机器语言和汇编语言来说,像C/C++、Java这些语言被称为高级语言。
机器语言和汇编语言就是低级语言。
如果有人体验过汇编语言或是二进制代码,那对他来说能使用C太幸福了。
问题也随之而来,当时各个厂商都有自己的C语言,都对C语言修修补补,出现了很多版本的C语言。
也就是说,别人家的C语言代码在自己家根本不能用!
C语言标准应运而生。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制 定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。
据说,当年蟹堡王用了有标准的C语言后,自家产品迅速流行起来,以致利润翻倍!这下欢呼的不只是员工海绵宝宝了,还有BOSS蟹老板。
目前2011年12月8 日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
事实上,很多C语言标准并没有流行起来,我们最常用的C语言标准是C89和C90。
如果一门计算机语言有国际标准,这门语言才能走得长远。
如果你去学习一门计算机语言,它没有国际标准,这其实是没必要去学的,它很可能在某天就会被淘汰。
那么我们该用什么工具去写C语言代码呢?
编译器!!
C语言的编译器主要有Clang、GCC、MSVC、Turbo C、DevC++等。
Clang是苹果公司的,GCC在Linux上用得比较多,MSVC是最常用的微软的编译器。
关于DevC++......
如果你将来想从事软件开发相关的工作,那么能不用DevC++就别用!
如果你的电脑上没有Visual Studio,那现在就给我安装!
VS2013及更高得版本都可以。
如果你只是想让C语言这门课不挂科,那就用DevC++吧,体积小巧、安装方便。
什么是IDE?IDE就是集成开发环境(IDE,Integrated Development Environment )。
常用的IDE - Visual Studio的底层就是MSVC编译器。
Visual Studio里集成了编辑器、编译器、链接器、调试器,既能编辑代码,又能编译代码,又能链接代码,又能调试代码。它把各种功能集成在一起,所以叫集成开发环境。
如何写C语言代码?
打开Visual Studio,选择“创建新项目”。
语言选择C++,然后选空项目
选择下一步,给项目命好名,选好存放项目的位置,然后点击创建。
这里建议:
项目名称最好不要用中文,并且名称要有实际意义,方便以后查找。
创建一个专属的文件夹用来存放代码或是项目,方便以后查找、整理。
在创建好项目之后,请将目光注视到解决方案资源管理器。
右键”源文件“,选择添加,选择新建项
出现以下界面,接着选择Visual C++,点击C++文件。
名称建议用是.c的后缀,当然.cpp也可以。
点击添加就可以完成C语言文件的创建了。
注意:
不同于其它编译器,在Visual Studio中请在代码第一行添加
#define _CRT_SECURE_NO_WARNINGS 1
在后面我们会作解释。
接下来我们写一个C语言代码,让它实现打印输出”Hello World!“。
首先要创建一个main函数,也就是主函数。
代码如下:
int main()
{
return 0;
}
关于C语言的主函数,有很多种......
如果你所用的教材上是这样写主函数的:
void main()
{
}
那么这本书可以扔掉了!这是非常古老的写法。
某人在计算机领域做出过许多贡献,然而某人出版的C语言教材被骂的狗血喷头......
说到教材,希望大家擦亮眼睛,下边的文章供参考:
很多编程书籍都是垃圾,大家一定要擦亮眼睛,不要被误导
你也可以这样写:
int main(void)
{
return 0;
}
main后边的括号里写void,说明这个主函数不需要参数。
还有一种高级写法:
int main(int argc,char* argv[])
{
return 0;
}
这种写法,感兴趣的可自行查阅相关知识。
return 0代表这个函数返回的值是0,整数0。
int是整型的意思,说明这个函数返回的值是整型的。
这就是对C语言主函数写法的介绍。
别忘了我们是来打印Hello World的!
当我们想在屏幕上打印”Hello World!“的时候,只需要在主函数内部加上printf("Hello World!");
由于使用了printf,那就要引用头文件,在主函数前加上#include
完整地下来,这个代码就是这样的:
#include
int main()
{
printf("Hello World!");
return 0;
}
按下Ctrl+F5即可。
什么是printf?printf是打印函数,是专门用来在屏幕上打印数据的。是C语言标准库中提供的一个一个库函数。
想打印字符串的话,只需将双引号里的内容替换成自己想要打印的内容。
由于printf函数是放在stdio.h的头文件里的,那么在调用此函数之前就要声明一下,在主函数前面加上#include
include是包含的意思,在C语言中意思为下面的代码包含stdio.h头文件。
stdio是什么?是缩写,全称是standard input output,”标准输入输出“。
除了printf,在stdio.h中还有scanf,用于输入数据。
如果想计算两个数的和,可以用scanf,代码实现如下:
#include
int main()
{
int num1=0;
int num2=0;
scanf("%d%d",&num1,&num2);
printf("%d",num1+num2);
return 0;
}
一定要注意!scanf里,num1和num2前都有&符号,&的功能是取地址,意思是找到要给赋值的变量所在的地址,然后把值放在这地址相对应的内存空间中。
执行代码,输入1空格1,再回车,可得到2。
为什么要用空格?是因为如果不用空格,就相当于给num1赋值了11,而不是分别给num1和num2赋值1。
那么什么是地址?在这里简单讲一下,后续会详细讲解。
现在定义一个变量,因为一个int类型的变量在内存中占4个字节,那么计算机就在内存中开辟一块4个字节的空间。
这块空间就属于n的空间。那么我们给n赋的值就存放在这块内存中。
此外,每块内存空间都有其对应的编号,假如计算机给变量n分配的空间的编号是0x0000709,那当通过输入数字给n赋值时,就要先取出n所在的地址,通过地址找到这块内存,然后把值存入这块内存中。
如果你的代码不需要printf或scanf,那么就不需要#include
问题又来了,C语言里为什么要有主函数呢?
我们先在Visual Studio上调试以下代码。按下F10即可。
#include
int main()
{
printf("Hello World!");
printf("Hello World!");
printf("Hello World!");
printf("Hello World!");
printf("Hello World!");
printf("Hello World!");
return 0;
}
我们会发现这时出现了一个箭头,指向主函数的第一行。
可以发现程序是从主函数的第一行开始执行的。
主函数是程序的入口,C语言中必须要有主函数!并且只能有一个 ,不能有多个主函数。
如果我们创建两个主函数去调试,编译器会发出警告。
主函数是程序的入口,如果是两个主函数的话,编译器也不知道该从谁开始。
如果在此项目中再创建一个.c文件,在新的.c文件里创建主函数会如何呢?
同样不能执行。
所以说:
一个项目(工程)中可以有多个.c文件,但是多个.c文件中只能有一个主函数。
现在我们创建了多个主函数了,怎么办?
用注释把多余的主函数屏蔽掉!
注释不仅有解释代码的功能,还可以用来屏蔽代码。
选中要屏蔽的代码,点击Visual Studio上方的这个按钮
若想恢复,选中要恢复的代码,点右边相邻的按钮就可以。
除了用两个斜杠屏蔽代码外,还可以用/**/屏蔽代码。
下边来到了数据类型。
C语言的数据类型有这些:
你知道为什么刘华强说郝哥的秤有问题吗?就是因为秤上有吸铁石。
C生万物,那块吸铁石是C语言编写的!
在《征服》里,我们看到吸铁石的存在让生瓜蛋子称出来的质量偏重。
事实上郝哥乐善好施,胸怀天下,不忍心出那么高的价钱卖生瓜蛋子,又不想得罪同行,于是他想用算法改变世界。
在自学了C语言后,郝哥写了一种能让秤显示的生瓜蛋子的质量更轻的算法,这样一个生瓜蛋子,就变得很轻,顾客肯定满意了吧,同行也不会来故意找茬。
郝哥把C语言写进了吸铁石,把吸铁石安到了秤上,然后永远期待美好的事情即将发生......
但是郝哥犯了一个天大的错误!
郝哥没学好数据类型,这样一来秤上显示的生瓜蛋子的质量就更重!
所以刘华强才会说”你这哪够十五斤啊?“。
悲剧,真是悲剧!
我们为什么要写代码?
写代码是为了解决生活中的问题、重复的问题。
为了解决问题,C语言必须有能力描述我们的生活。
比如,生瓜蛋子的价格其实就是数值,为了描述价格,那么C语言引入了数据类型。
请看代码:
#include
int main()
{
printf("%d",100);
return 0;
}
在这里,%d代表打印十进制的整数。
双引号后边的数值也好、字符也好、变量也好,和双引号里的%一一对应。
如:
#include
int main()
{
int a = 100;
int b = 200;
printf("%d%d",a,b);
printf("%d%d",a,b);
return 0;
}
经调试可发现双引号后边的变量和双引号里的%d一一对应。
若想让两个数值见用空格隔开,在两个%d之间加上空格即可
#include
int main()
{
int a = 100;
int b = 200;
printf("%d %d",a,b);
return 0;
}
当打印两行数据时,可用换行符\n实现换行。\n不会出现在控制台窗口中。
#include
int main()
{
int a = 100;
int b = 200;
printf("%d%d\n", a, b);
printf("%d%d\n", a, b);
return 0;
}
char是字符型,一个字符型变量存放一个字符。
如,调试以下代码:
#include
int main()
{
char a='A';
printf("%c",a);
return 0;
}
可以发现屏幕上打印了A这个字符。
如果我们给字符型变量赋值两个字符,会只打印了一个字符:
#include
int main()
{
char a='AB';
printf("%c",a);
return 0;
}
那么其它的数据类型到底又有什么特点呢?
不同的数据类型在使用的时候又需要多大的空间呢?
一个字符占多大空间??一个整型占多大空间???
在不同的平台上,部分变量占用内存空间大小不同。
不同变量间除了占用内存大小不同,所标示的范围也不同。
例如short int的表示范围是-32768~32767,int表示的范围是-2147483647~2147483647等等。
更多数据类型的表示范围请见下表:
在C语言中有一个关键字叫做sizeof ,是一个用于判断数据类型或者表达式长度的运算符。
执行以下代码:
#include
int main()
{
char a='A';
int b=0;
long c=0;
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(char));
printf("%d\n",sizeof(b));
printf("%d\n",sizeof(int));
printf("%d\n",sizeof(c));
printf("%d\n",sizeof(long));
return 0;
}
可以看到运用了sizeof操作符,不论是让变量参与其运算还是让数据类型参与其运算都能得到相应的结果。
之前我们说过,%+字母和后边的变量或是具体的值相对应,我们通过以下代码再来演示一遍:
#include
int main()
{
int num=5;
char a='A';
double master=93.9;
float king=8844.43;
printf("%d\n",num);
printf("%c\n",a);
printf("%lf\n",master);
printf("%f\n",king);
return 0;
}
可以看到,正是因为用了不同的字母,打印后才能得到我们所期望的值。
除了这些常用的打印符号,还有更多,想了解请自行查阅。
生活中的有些值是不变的,如圆周率、身份证号、血型。
有些值是可变的,如年龄、体重、薪资。
在C语言中,通常用常量来表示不变的值,用变量来表示会变的值。
定义变量的方法如下:
int age=18;
float weight=45.5f;
char ch='w';
定义变量很简单,变量类型加上变量名即可。
但是请注意,变量名有其对应的命名规则
1.不能以数字开头
2.只能由字母、数组和下划线组成
3.不能与C语言中的关键字重合
什么是关键字?这些就是关键字,是C语言中本来就有的:
现在来定义两个类型、名称一样的变量,分别放在主函数内外:
#include
int num=666;
int main()
{
int num=888;
printf("%d",num);
return 0;
}
第一个num是全局变量,第二个num是局部变量。
全局变量,就是定义在代码块({})之外的变量,
局部变量,就是定义在代码块({})内部的变量。
大家觉得打印出的数组是666还是888?
经调试发现打印出的数字是888:
所以说局部变量和全局变量的名称最好不要相同,容易引起误会,产生bug。
当全局变量和局部变量名称相同时,局部变量优先。
如果执行这样的代码:
#include
int main()
{
{
int num=888;
}
printf("%d",num);
return 0;
}
编译器就会提示未声明
C语言语法规定,变量要定义在当前代码块的最前端。
如果执行以下代码,Visual Studio就会报错
int main()
{
int num1=0;
int num2=0;
scanf("%d%d",&num1,&num2);
printf("%d",num1+num2);
int x=0;
return 0;
}
关键在于定义x时没有在最前端。
这样的代码可能在别的编译器上能够执行,比如我把相同的代码放在DevC++就没有报错
但是,我们还是按C语言语法规定的来吧......
变量的作用域和生命周期下节再讲!
之前留了一个小问题,那就是为什么在Visual Studio中要在代码开头加上#define _CRT_SECURE_NO_WARNINGS 1呢?
如果不加,当你用printf或是别的函数时编译器就会提示不安全,然后让你使用Visual Studio提供的函数。真的不安全吗?用了Visual Studio提供的函数就真的安全了吗?
这个我们不去探讨,而一旦用了Visual Studio提供的函数,我们的C语言代码就无法在别的平台上跑起来了。
就好比你想用一种很冷门的、全世界都不通用的语言,来和世界交流......这不是痴人说梦吗?
创作不易,好几个小时才写完了博客,码了八千多字,求各位老铁三连支持下!