目录
目录
1,认识c语言
语言;人与人交流的工具
包括:汉语,日语,英语~~~~~
那么人和计算机如何交流呢
当然,也是使用语言,人和计算机交流的语言有很多
包括:c语言/c++/java/pythen
其中目前所有的语言中,截止到2024.7.18
c语言排名第二,那很多人就想了解第一名的语言
其实不必,语言都是有互通性的,而且c语言的稳定性还是很靠得住的
接下来对于一个复杂的概念做一些解释
电脑为什么可以工作
当然是各个部分的齐心协力
可以简单的分为上层和下层
如图 : 上层 : 应用软件 列如:qq/ 百度网盘
下层(底层):操作系统
驱动层
:硬件
正是由于如此的结构,才使得硬件和我们的显示屏上的操作系统联系起来
而c语言广泛用于底层开发,是一种高级语言
何为高级呢?
任何语言的发展都是由低级到高级
以计算机的发展为例
从二进制指令 到汇编指令 到b语言、再到c语言
像极了汉字从甲骨文发展至今的过程,经历曲折,抵达彼岸
故此语言的排名就并不是那么重要的,毕竟都有很大的互通性
但是发展,必然是不统一的
要不全国至今为什么没有统一语言呢?
考虑到如此因数
c语言的国际标准(ANSIC)应运而生
列如:c89,c99,c11等等
而c语言是一名编译性语言,那么需要哪些步骤呢?
高级点可以写成xxx.c_______xxx.exe
如何完成这样子的转换呢?
首先对xxx.c进行编译然后输出
然后对输出进行连接然后生成xxx.exe
故此,一个好的编译器至关总要
在此,个人推荐GCC,MSVC、(后期有用)
2,vs手把手教你使用
想在电脑上正常运行c语言
一个趁手的软件少不了
市面上有许许多多的软件
在此我推荐使用vs
即visual stadio
有2019和2022甚至更古老的版本
用2019和2022比较推荐
当然如果有趁手的就用下去就可以了
这两个软件用360软件管家就可以安装不过vs2022可能某些系统不兼容,
2019还是比较通用的
正常安装完成后
第一步打开vs(或其他)
创建新项目
点击后
创建源文件
此时算是打开了vs
若想编写程序则需要进行源代码的添加
在源代码处右键
点击新建项后便出现如下界面
更改为.c为重点
若以.cpp则为c++语法
然后点击添加
便创建完成
3,第一个c语言程序
c语言可以理解为一种语法
而语法规定c语言必须含有main函数
任何语言都是慢慢熟悉的过程
我们不妨写下一个最简单的c语言程序
然后对此进行刨析
main函数是程序的入口
有且只有一个
stdio.h
std:标准
i:input
o:out put
若使用库函数printf,则需要“打招呼"
即在int main 上一行前加#include<stdio.h>
可能很多初学者不能完全理解这很正常
刚开始学英语也是一个一个单词翻译
此处标记重点
语言代码中一定含有main函数
即main()
{
return 0//在字母和数字见要以空格隔开
}
如上格式是每一个c语言中必须含有的
没有什么理解不理解的
背下来、背下来背下来!
还有一点要强调的就是全部要使用英文里面的标点
汉语中的标点无法识别
还有一种古老的写法(不是很推荐)
至少十年及以上的书本可能会出现
void main()
{
}
这种写法有些编译器无法识别
因此不推荐
4,Main函数
每个 C 语言程序不管有多少行代码
都是从 main 函数开始执行的
main 函数是程序的入口
main 函数也被叫做:主函数。
main 前⾯的 int 表示 main 函数执行结束的时候返回⼀个整型类型的值
所以在 main 函数的最后写 return 0; 正好前后呼应。
• main函数是程序的入口
• main函数有且仅有⼀个
• 即使⼀个项目中有多个.c⽂件,但是只能有⼀个main函数(因为程序的入口只能有⼀个)
第⼀次写代码,⼀些常见的错误总结:
• main 被写成了mian
• main后边的()漏掉了
• 代码中不能使⽤中⽂符号,⽐如括号和分号
• ⼀条语句结束后,有分号
5,Printf和库函数
代码中使用 printf 函数,实现了在屏幕上的信息的打印。
这里简单的介绍⼀下 printf , printf 是⼀个库函数
它的功能是在标准输出设备(⼀般指屏幕)上进⾏信息的打印。
上⾯的代码是使用 printf 函数打印字符串。
只要把想要打印的⼀串字符放 在双引号中并传递给printf函数就可以打印。 printf函数也可以用来打印其他类型的数据,⽐如:
printf("%d\n", n); //printf打印整型
printf("%c\n", 'q'); //printf打印字符
printf("%lf\n", 3.14); //printf打印双精度浮点型
这里的 %d , %c 等是占位符,会被后边的值替换。
同时我们在使⽤库函数的时候,是需要包含头文件的
⽐如: printf 函数需要包含的就是 stdio.h 这个头⽂件
具体的方法就是: 1 #include<stdio.h>
那什么是库函数呢?
为了不再重复实现常见的代码,让程序员提升开发效率
C语言标准规定了⼀组函数,这些函数再由不同的编译器厂商根据标准进⾏实现,提供给程序员使用。
这些函数组成了⼀个函数库,被称为标准库,这些函数也被称为库函数
在这个基础上⼀些编译器厂商可能会额外扩展提供部分函数(这些函数其他编译器不⼀定支持)。
⼀个系列的库函数⼀般会声明在同⼀个头文件中
所以库函数的使用,要包含对应的头文件。
库函数比较多,提前了解可参考链接:https://cplusplus.com/reference/clibrary/
6,数据类型
我们可以问一下自己
为什么写代码?
为了解决生活中的问题
购物,存钱,都需要代码的应用
而应用的类型可能不同
比如购物时需要付款66.6
上高速时扫描车牌号E XX520
因此数据类型应运而生
数据类型分为多种
比如66.6 浮点型
66 整形
Q字符
等等
可以分为以下几类
char 字符数据类型 字节1
short 短整型 2
int 整形 4
long 长整型 4
long long 更长的整形 8
float 单精度浮点数 4
double 双精度浮点数 8
虽然int和long字节相同
但是在c语言中规定
size of(long)>=size of (int)
7,计算机中的单位
可能各位都看到了后面标的字节
字节是计算机中的单位
单位还有比特位(bit)
字节(byte)
kb
mb
gb
tb
pb
在这些单位中,bit和byte之间的转化为8
其他都为1024
列如1byte=8bit
1024bit=1kb
我们当下处于一个十进制的世界中
但是计算机仅仅可以理解2进制
因此对于计算机
将十进制转化为二进制
一个比特位用来存储1或者0
通过多个比特位来存储数据
8,变量
在我们的日常生活中,有许许多多变化的值,也有不变的
比如身高,体重,可能一直处于变化
血型,性别就是不变的
而在c语言中
也有相同的概念
被称为变量和常量
而变量又分为全局变量和局部变量
列如下面一串代码
int b=20;//全局变量
int main()
{
int b=1;//局部变量
printf("b=%d",b);
return 0;
}
如这串代码
便可以清楚了解到全局变量和局部变量的大概位置
即
全局变量(外部)
局部变量(内部)
而在如上程序中出现了全局变量和局部变量
那么如果运行程序
b的值为多少呢
由结果不难看出答案为1
由此可得出结论
当全局变量和局部变量同时出现时
局部变量优先
9,变量的作用域和生命周期
在数学中,我们可能学过函数,而在函数中,我们又了解到了定义域
定义域指该函数自变量的取值范围 有限制作用
而在c语言中也有类似定义域的东西,被命名为作用域
同理也起限制作用
而在上一章中提到
变量分为全局变量和局部变量,不同的变量对应的作用域固然不同
局部变量的作用域是局部变量的作用范围
全局变量全局范围均可用(作用于整个工程)
那么,全局变量和局部变量在内存中存储于哪个区域呢?
一般我们在学习c语言和c++的时候,会关注内存中的三个区域
即:栈区,堆区,静态区
1,局部变量放在内存中的栈区
2,全局变量放在内存中的静态区
3,堆区是用来动态内存管理的
局部变量的生命周期为;进入作用域生命周期开始,出作用域生命周期结束
全局变量的生命周期为整个程序的生命周期
作用域约等于生命周期
10,字符及ascll编码
在键盘上我们可以敲出各种字符如:a,q,@,#等,这些符号都被称为字符
C语⾔中字符是⽤单引号 括起来的,如:'a','b','@'。
我们知道在计算机中所有的数据都是以二进制的形式存储的
那这些字符在内存中分别以什么样的二进制存储的呢?
如果我们每个人自己给这些字符中的每个字符编⼀个⼆进制序列,
这个叫做编码
为了方便大家相互通信,不造成混乱
后来美国国家标准学会(ANSI)出台了⼀个标准 ASCII 编码
C 语言中的字符就遵循了 ASCII 编码的⽅式。
• 字符A~Z的ASCII码值从65~90
• 字符a~z的ASCII码值从97~122
• 对应的⼤⼩写字符(a和A)的ASCII码值的差值是32
• 数字字符0~9的ASCII码值从48~57
• 换行 \n 的ASCII值是:10
• 在这些字符中ASCII码值从0~31 这32个字符是不可打印字符,⽆法打印在屏幕上观察
如果我们想把所有的可打印字符给展现出来的话
不妨尝试一下这段代码
#include <stdio.h>
int main()
{
int i = 0;
for (i = 32; i <= 127; i++)
{
printf("%c ", i);
if (i % 16 == 15)
printf("\n");
}
return 0;
}
运行的结果是
11,字符串
在c语言中
形如‘a' ’b' ‘c' 等单个字母被命名为字符常量
而形如“abcdef”等则被命名为字符串
在c语言中,有整形,单精度浮点数,字符数据类型
但却没有字符串类型
所以在初始化字符串时与初始化字符相同
列:
char ch=’w‘
char arr[10]
尤为注意的是在[ ] 中可以不写或写大,不可写小
在c语言语法中规定\0是字符串的结束标志
而打印字符串用
printf(“%s\n”,arr);
那么为社么说\0是字符串的结束标志呢?
不妨看下面的一串代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
char arr1[100] = "abcde";
char arr2[100] = { 'a','b','c','d','e' };
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}
得到的arr1和arr2的结果截然不同,原因就是出于此处
arr2没有\0即在打印过程中会打印字符常量后面的内容,直至出现下一个\0
而字符串默认会附带\0
由此我们可知\0在字符串中非常重要
12,转义字符
转义字符作为c语言的基础在代码的书写过程中经常应用
下面我便列下几个常用的转义字符,在应用中记住
\’用于表示字符常量‘
\“用于表示一个字符内部的双引号
\\用于表示一个反斜杠,防止它们被解释为一个转义序列符
\n换行
\r回车
\t水平制表符
\ddd ddd表示1-3个八进制的数字
\xdd dd表示2个16进制数字
如上即是较为重要的转义字符
还有一些不是很重要的
类如
\? 在连续书写多个?中使用,防止他们被解析成三字母词
而在原来的一些编译器中
??)的意思为]
那么如何解决呢?
只需要写成
\?\?)
即为??)
很神奇吧
还有一个很重要的
空格也算字符!
接下来再扩展一些打印符号
%d 打印整形
%c 打印字符
%s 打印字符串
%f 打印float类型的数据
%lf 打印double类型的数据
13,注释
注释是对代码的说明,编译器会忽略注释,也就是说,注释对实际代码没有影响。 注释是给程序员⾃⼰,或者其他程序员看的。
好的注释可以帮我们更好的理解代码,但是也不要过度注释,不要写没必要的注释。
当然不写注释可能会让后期阅读代码的⼈抓狂。
写注释⼀定程度上反应了程序作者的素质,建议⼤家写必要的注释,在未来找⼯作的时候,写代码时 留下必要的注释也会给⾯试官留下更好的印象。
注释的2种形式
C 语⾔的注释有两种表⽰⽅法
/**/ 的形式
第⼀种⽅法是将注释放在 /*...*/ 之间,内部可以分⾏。
/* 注释 */
/* 这是一行注释 */
这种注释可以插在行内。
int fopen(char* s /* file name */, int mode);
上⾯⽰例中, /* file name */ ⽤来对函数参数进⾏说明,跟在它后⾯的代码依然会有效执⾏。
这种注释⼀定不能忘记写结束符号 */ ,否则很容易导致错误。
上⾯⽰例中, /* file name */ ⽤来对函数参数进⾏说明,跟在它后⾯的代码依然会有效执⾏。 这种注释⼀定不能忘记写结束符号 */ ,否则很容易导致错误。
printf("a "); /* 注释⼀
printf("b ");
printf("c "); /* 注释⼆ */
printf("d ");
上⾯⽰例的原意是,第⼀⾏和第三⾏代码的尾部,有两个注释。
但是,第⼀⾏注释忘记写结束符号,导致注释⼀延续到第三⾏结束。
/**/ 的这个注释也不⽀持嵌套注释,
/* 开始注释后,遇到第⼀个 */ 就认为注释结束了。
// 的形式 第⼆种写法是将注释放在双斜杠 // 后⾯,从双斜杠到⾏尾都属于注释。
这种注释只能是单⾏,可以 放在行首,也可以放在一行语句的结尾。
这是 C99 标准新增的语法。
// 这是一行注释
int x = 1; // 这也是注释
不管是哪⼀种注释,都不能放在双引号⾥⾯。
双引号里面的注释符号,会成为字符串的⼀部分,解释为普通符号,失去注释作用。
printf("// hello /* world */ ");
上⾯示例中,双引号⾥⾯的注释符号,都会被视为普通字符,没有注释作用。
注释会被替换
14,关系操作符
C 语言用于比较的表达式,称为 “关系表达式”(relational expression),里面使用的运算符就称 为“关系运算符”(relational operator),主要有下面6个。
• > 大于运算符
• < 小于运算符
• >= 大于等于运算符
• <= 小于等于运算符
• == 相等运算符
• != 不相等运算符
关系表达式通常返回 0 或 1 ,表示真假。 C 语言中, 0 表示假,所有⾮零值表示真
⽐如, 20 > 12 返回 1 , 12 > 20 返回 0
关系表达式常用于 if 或 while 结构。
注意:相等运算符 == 与赋值运算符 = 是两个不一样的运算符,不要混淆。有时候,可能会不小心写出下面的代码,它可以运行,但很容易出现意料之外的结果。
类如
为了防⽌出现这种错误,有的程序员喜欢将变量写在等号的右边。
这样子的话,编译器会报错
另⼀个需要避免的错误是:多个关系运算符不宜连⽤。
i < j < k 上面例子中,连续使用两个小于运算符
这是合法表达式,不会报错,但是通常达不到想要的结果
即不是保证变量 j 的值在 i 和 k 之间。
因为关系运算符是从左到右计算
所以实际执行的是下面的表达式
(i < j) < k
上面例子中, i < j 返回 0 或 1
所以最终是 0 或 1 与变量 k 进行比较
15,条件操作符
条件操作符也叫三⽬操作符,需要接受三个操作数的,形式如下:
exp1 ? exp2 : exp3
条件操作符的计算逻辑是:
如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果
如果 exp1 为假, exp3 计算,计算的结果是整个表达式的结果
类如
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
main()
{
printf("猜下我的年龄;\n");
int a = 0;
scanf("%d", &a);
a < 18 ? printf("嘻嘻嘻") : printf("我有那么老嘛");
return 0;
}
来看一下运行结果吧
想必通过这个代码,大家便已经对条件关系符有了充分的认识,那么继续进行逻辑操作符的学习吧
16,逻辑操作符
逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下面三个运算符。
• ! :逻辑取反运算符(改变单个表达式的真假)。
• && :逻辑与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
• || :逻辑或运算符,就是或者的意思(两侧至少有⼀个表达式为真,则为真,否则为假)。
注:C语言中,非0表示真,0表示假
17,短路
C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是 保证的。
如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。
这种情况称为“短路”。
if(month >= 3 && month <= 5)
表达式中&& 的左操作数是 month >= 3 ,右操作数是 month = 3 的结果是0的时候,即使不判断 month <= 5 ,整个表达式的结果也是0。 所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执行。
if(month == 12 || month==1 || month == 2)
如果month == 12,则不用再判断month是否等于1或者2,整个表达式的结果也是1。 所以, || 操作符的左操作数的结果不为0时,就无需执行右操作数。
像这种仅仅根据左操作数的结果就能知道整个表达式的结果
不再对右操作数进行计算的运算称为短路求值。