代码是从main函数开始,从上往下,从左往右执行; C语言中只有 逗号',' 、 分号';' 、 括号'() 或者 {} 或者 []'、引号 不可写成中文
• C语言是什么?
一门人与计算机交流的计算机语言,是一门编译型语言,是一种结构化的程序设计语言(支持三种结构: 顺序结构、选择结构、循环结构)--下方控制语句会讲解
1) 编译型语言:C/C++
xxxx.c/xxxx.cpp(本质上就是一个文本文件,与txt文件一致可由记事本打开,不能被计算机是不可以读懂,也就是说不可以被计算机执行)
---> 通过编译器(MSVC、clang、gcc)将 xxxx.c/xxxx.cpp 文件处理 生成xxxx.exe (xxxx.exe称为可执行程序,里面存的都是二进制的指令)
--> 编译器先是编译
一个项目由多个源文件构成,多个源文件经由 cl.exe(编译器) 生成了对应的 xxx.obj文件,这个步骤就叫编译
--> 然后是链接
多个源文件对应的多个xxxx.obj文件+'链接库' 经由 link.exe(链接器) 生成了一个 xxxx.exe可执行程序,这个步骤就叫链接
2) 既是编译型又是解释型语言:Java
Java既不属于传统的编译型语言, 也不属于解释型语言
Java是先编译成".class"字节码文件, 然后再利用JVM虚拟机进行解释执行的, 所以Java即可以说成编译型, 也可以说成解释型
3) 解释型语言:Python
经过 解释器 对其代码进行解释交由计算机执行
• C语言的历史和辉煌
C生万物,起初是作为unix系统的开发工具二发明出来的
• 编译器的选择VS2022
| 集成开发环境(IDE)用于提供程序开发环境的应用程序, 一般包括代码编辑器、编译器、调试器和图形用户
| 界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。
| vscode 不属于IDE,它属于编辑器
vs2022
1、添加项目
打开软件 -> 创建新项目 -> 所有语言换成C++ -> 空项目 -> 下一步 -> 自己选择项目名字(项目名字和所属文件路径尽量不能有中文)
-> 右击源文件 -> 添加 -> 新建项 -> 显示所有模版 -> 将名称改为 xxxx.c -> 添加即可
2、 关闭项目,但又不关闭vs2022: 文件 -> 关闭解决方案
3、 vs2022 中直接运行不调试的快捷键 Ctrl + F5 / Fn + Ctrl + F5
4、 vs2022 在 上面项目的标题栏/项目栏 处右击选择打开所在的文件夹,即可找到 xxx.c 文件所在目录
同级目录的 x64目录 下放有其对应的 xxx.obj文件
上一级目录的 x64目录 下放有其对应的 xxx.exe文件
5、vs2022 开启单行运行的快捷键 F10
按一下 F10 就执行 main函数里面的 一行代码
6、 vs2022 快速注释的快捷键 Ctrl + K + C
7、 vs2022 快速取消注释的快捷键 Ctrl + K + U
8、 vs2022 快速调节字体 Ctrl + 滑动鼠标的滚轮
9、 更改主题: 工具 -> 选项 -> 主题
10、更改字体: 工具 -> 选项 -> 字体和颜色
11、更改背景颜色: 工具 -> 选项 -> 字体和颜色
12、显示行号: 工具 -> 选项 -> 文本编辑器下的C/C++里面就有行号 -> 打勾
13、监视窗口: F10 -> 调试下的窗口 -> 监视
14、Tab字节设置: 工具下选项 -> 文本编辑器下的C/C++下面的制表符 默认是4字节
但是一般不设置,Tab一般都是对齐规则,设置了也没用,有时候是 2字节,3字节,视情况而定
• 源文件、头文件介绍
源文件: xxx.c文件,里面存放的的是代码主体
头文件: xxx.h文件,里面存放的是一些库函数,有点相当于Python里面的(模块)头文件
也就是模块,但是为了与C语言的模块不弄混,以后统一称之为头文件
• 第一个C语言程序 —— C语言代码都是函数组合在一起的(printf、main、scanf...)
#include<stdio.h>
int main()
{
printf("Hello world!");
return 0;
}
• main函数
基本语法
main 函数的多种写法
int main() ----- int 为返回数据类型,main 为函数名,括号内放参数 —— void表示无需传参;int a,int b表示传入两个int参数
{ |
代码 | 大括号内的称之为函数体
代码... |
return 0; | int和return必须一一对应,在这里int与return 0一一对应
} |
下面的main函数写法与上面的main写法一致
int main(void)
{
return 0;
}
如果()里面传入了参数,那么也是正确的。main函数是可以有参数的,参数是有特殊用途的。这种情况较为复杂,日后再说。
基础介绍
main 前面的 int 表示 main 函数执行结束的时候返回一个整型类型的值。
所以在main 函数的最后写return 0; 正好前后呼应。
main函数return 0;是一个历史习惯,表示无错误 可执行程序返回给操作系统是 正常返回,异常返回会抛异常
使用细节
每个 C 语言程序不管有多少行代码, 都是从main 函数开始执行的, main 函数是程序的入口, main 函数也被叫做: 主函数。
• main函数是程序的入口
• main函数有且仅有一个
• 即使一个项目中有多个.c文件, 但是也只能有一个main函数(因为程序的入口只能有一个)
• C语言中有 逗号、分号、(小)括号 不可以使用中文的
• printf和库函数 stdio.h -- 'standard input output'.h -- 标准输入输出头文件
printf:
这里简单的介绍一下 printf , printf 是一个库函数, 它的功能是在标准输出设备(一般指屏幕)上进行信息的打印
print -- 打印, f -- format -- 格式,按照指定的格式打印
例: printf("%c\n",100) 结果:d
printf("%d\n",d) 结果:100
printf("%d\n",100) 结果:100
printf("%f\n",3.5f) 结果:3.5
~ printf("%lf",3.5) 编译器默认是 double 类型的数据,所以要么数字后面加上f,要么f前面加上l(小写 L),切不可以都存在
库函数:
为了不再重复实现常见的代码, 让程序员提升开发效率
C语言标准规定了一组函数, 这些函数再由不同的编译器厂商根据标准进行实现, 提供给程序员使用。
不同编译器厂商实现方式不一样,但功能(体验的效果)一样.
这些函数组成了一个函数库, 被称为标准库, 这些函数也被称为库函数。
在这个基础上一些编译器厂商可能会额外扩展提供部分函数(这些函数其他编译器不一定支持)。
一个系列的库函数一般会声明在同一个头文件中, 所以库函数的使用, 要包含对应的头文件。
• 关键字介绍 ---- 不属于任何库文件, 而是在语法的核心中定义
C语言中有一批保留的名字的符号, 比如: int 、if 、return , 这些符号被称为保留字或者关键字。
• 关键字都有特殊的意义, 是保留给C语言使用的
• 程序员自己在创建标识符的时候是不能和关键字重复的
• 关键字也是不能自己创建的
C语言的32个关键字如下:
auto、break、case、char、const、continue、default、do、double、else、enum、extern
float、for、goto、if、int、long、register、return、short、signed、sizeof、static
struct、switch、typedef、union、unsigned、void、volatile、while、_Bool
• 字符和ASCII编码
字符和字符串
在键盘上可以敲出各种字符, 如: a, q, @, #等, 这些符号都被称为字符, C语言中字符是用单引号括起来的, 如: 'a', 'b', '@'
字符串都是由双引号引起来
ASCII编码
概念
我们知道在计算机中所有的数据都是以二进制的形式存储的, 那这些字符在内存中分别以什么样的二进制存储的呢?
如果我们每个人自己给这些字符中的每个字符编一个二进制序列, 这个叫做编码,
为了方便大家相互通信, 不造成混乱, 后来美国国家标准学会(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个字符是不可打印字符, 无法打印在屏幕上观察
• 字符串和\0
字符串
使用双引号括起来的一串字符就被称为字符串, 如: "abcdef", 就是一个字符串
字符串的打印格式 非数组建议直接打印,数组可以使用 printf("%s",数组名)/循环printf("%c",数组名[i]) 打印
请判断下面哪个是字符串
char a[] = "abc"; yes
char a[] = "a"; yes
字符串与数组的区别
以 \0 结尾且其它位置无 \0 的 字符数组 即为字符串,字符数组 即只包含字符的数组
char a[] = "abc"; ~ char a[] = {'a','b','c','\0'};
字符数组长度是固定的, 其中任何一个数组元素都可以为null字符。因此, 字符数组不一定是字符串
字符串必须以null结尾, 其后的字符不属于该字符串。字符串一定是字符数组, 它是最后一个字符为null字符的字符数组
数组的元素可以是任意一种类型, 而字符串是一种特殊的数组, 它使用了一种众所周知的确定其长度的规则
\0 -- 一种转义字符
字符串的结束标志,字符串末尾自带 \0 (隐藏).
如果一个字符串中间有\0的话,那么,这个字符串实际上就是\0之前的那么一小部分(在字符数组里面除外)
例: printf("X\0sjdiwi"); 结果:X ~ printf("\130\0sjdiwi"); 结果: X
• 转义字符 -- 转变原来字符的意义
\?: 在书写连续多个问号时使用, 防止他们被解析成三字母词, 在新的编译器上没法验证了
三字母词: ??+'任意一个其它的字符', '??)' ~~ ']'
现在的编译器不再支持三字母词了,三字母词只在古老的编译器里面存在
\': 用于表示字符 '
\": 用于表示一个字符串内部的双引号 即 "\""
\\: 用于表示一个反斜杠, 防止它被解释为一个转义序列符
\a: 警报, 这会使得终端发出 警报声或出现闪烁, 或者两者同时发生
\b: 退格键, 光标回退一个字符, 只要后面不再输出任何内容,就不会替换字符;如果程序立马结束,就会删除,我们的bash是默认在最后加上\0 的
printf("abcde\b") 调试结果: 'abcde' (光标一直停留在e上) 运行结果: 'abcd'
printf("abcde\baa") 结果: 'abcdaa' (e被覆盖删除)
printf("abcde\b\naa")结果: 'abcde' 'aa'换行输出(e未被覆盖)
想要替换就只能在\b后面加上字符,而非转义字符
\n: 换行符
\r: 回车符, 光标移到同一行的开头,不管如何都会删除字符,除非是在\r后面有转义字符
printf("abcde\r") 结果: ' bcde' (光标一直停留在a上)
printf("abcde\rf") 结果: 'f cde' (a被覆盖删除)
printf("abcde\b\naa") 结果: 'abcde' 'aa'换行输出(abc未被覆盖)
\t: 制表符, 光标移到下一个水平制表位, 通常是下一个8的倍数
对齐符,同一行就是'\txxxx\t'之间的xxxx输出字节为8个,不够就用空格补齐;不同行就是对齐
下面2种转义字符可以理解为: 字符的8进制或者16进制表示形式
\ddd : d d d表示 3个八进制 数字,即每一个 d 都是一个八进制数字.这3个八进制数字换算成十进制后不可以超过 127(ASCII码取值是0~127)
它对应着将 八进制数字 转换为十进制以后对应的ASCII码的字符, 可以理解为一个字符的八进制表示形式
如: \130 表示字符 X
表示将130变成十进制数 (1*8^2 + 3*8^1 + 0*8^0 = 88),对应于 ASCII码表的 X(大写)
\xdd : x 表示十六进制,不可以更改; d d表示 2个十六进制 数字,即每一个 d 都是一个十六进制数字.
这2个十六进制数字换算成十进制后不可以超过 127(ASCII码取值是0~127)
它对应着将 十六进制数字 转换为十进制以后对应的ASCII码的字符, 可以理解为一个字符的十六进制表示形式
如: \x30 表示字符 0; 是字符0,不是数字0
\0 : null 字符,代表没有内容,对应于ASCII码表的第0号字符,\0 就是\ddd 这类转义字符的一种, 用于字符串的结束标志, 其ASCII码值是0.
• strlen 函数
基本介绍
strlen 函数的全拼是 string length
基础语法
strlen(对应的字符串) ------ 对应的字符串应该使用双引号引起来
基本功能
求一个对应的字符串的长度,不包含 字符串的结束标志(\0),并返回一个长度(int)数值
使用细节
属于 string.h 文件,使用时先调用对应的头文件 '#include <string.h>'
转义字符算一个字符长度, \ddd 或者 \xdd 算一个字符长度
中间有\0的话就直接结束,只统计\0之前的字符串长度(因为整个字符串遇到\0就结束了)
• 语句和语句分类
C语言的代码是由一条一条的语句构成的(每一条语句又由函数构成), C语言中的语句可为以下五类:
• 空语句
基本说明
空语句是最简单的, 一个分号就是一条语句, 是空语句。
示例代码
#include <stdio.h>
int main(){
; //空语句
return 0;
}
使用细节
空语句, 一般出现的地方是: 这里需要一条语句, 但是这个语句不需要做任何事, 就可以写一个空语句。
相当于 Python 中的pass
• 表达式语句
基本说明
表达式语句就是在表达式的后边加上分号。
示例代码
#include <stdio.h>
int main(){
int a = 20;
int b = 0;
b = a + 5; //表达式语句
return 0;
}
• 函数调用语句
基础说明
函数调用的时候, 也会加上分号, 就是函数调用语句。
示例代码
#include <stdio.h>
int Add(int x, int y){
return x+y;
}
int main(){
printf("hehe\n"); //函数调用语句
int ret = Add(2, 3); //函数调用语句
return 0;
}
使用细节
不管是在main函数里面调用库函数还是调用自己定义的函数, 都可以称为函数调用语句
• 复合语句
基础说明
复合语句其实就是前面讲过的代码块, 成对大括号中的代码就构成一个代码块, 也被称为复合语句。
代码演示
#include <stdio.h>
void print(int arr[], int sz){ //函数的大括号中的代码也构成复合语句
int i = 0;
for(i=0; i<sz; i++){
printf("%d ", arr[i]);
}
}
int main(){
int i = 0;
int arr[10] = {0};
for(i=0; i<10; i++){ //for循环的循环体的大括号中的就是复合语句
arr[i] = 10-i;
printf("%d\n", arr[i]);
}
return 0;
}
• 控制语句
控制语句用于控制程序的执行流程, 以实现程序的各种结构方式 (C语言支持三种结构: 顺序结构、选
择结构、循环结构), 它们由特定的语句定义符组成, C语言有九种控制语句。
可分成以下三类:
1. 条件判断语句也叫分支语句: if语句、switch语句; ------选择结构
2. 循环执行语句: do while语句、while语句、for语句; -------循环结构
3. 转向语句: break语句、goto语句、continue语句、return语句。 ------顺序结构 <--- 代码是从main函数开始,从上往下,从左往右执行
• 注释是什么?为什么写注释 ----- 使代码可读性较高
// 所需注释的内容 ----- 单行注释
/* 所需注释内容 */ ------ 多行注释,可写在代码里面,不可以嵌套使用
注意!!!!
/**/ 不可以嵌套使用:
/*内容1 /*内容2*/ 内容3*/ ------- 内容3没被注释, 因为无论前面有多少个 /* 都只会匹配一个 */ 作为结束的标志
使用细节
编译时, 注释会被替换掉, 会被替换成为一个空格
例:
printf("dwadw/*dwawd*/dwa"); 结果:dwadw dwa
int a/*jnskdjwio*/d = 0; 报错 ~~~ int a b =0;