第一讲 C语言常见概念
1.1 C语言是什么
- 人与人交流——自然语言
- 人与计算机交流——计算机语言(已知现存上千种计算机语言,C语言就是众多计算机语言中的一种)
人们通过计算机语言写程序,对计算机下指令
1.2 C语言的历史
1.3 创建
- 创建项目(代码是在项目中管理的)
- 创建.c文件(选择空项目)
- 起名称:test_10_08
- 最好有意义,如test_10_08
- 最好不要使用中文、特殊字符
- 代码路径中不要包含空格、特殊字符、中文字符
- 起名称:test_10_08
- 点击创建
- 视图-解决项目资源管理器
- 在源文件中创建文件,写C语言选择
.c
或.cpp
-
C语言文件分类:
- xxx.c —— 源文件
- xxx.h —— 头文件
-
遇到该情况不要直接创建
-
选择分类时只有
.cpp
,改成.c
-
- C语言是一门编译型计算机语⾔,C语⾔源代码都是⽂本⽂件,⽂本⽂件本⾝⽆法执⾏,必须通过编译器翻译和链接器的链接,⽣成⼆进制的可执⾏⽂件,可执⾏⽂件才能执⾏。
- C语言代码(文本信息)—>可执行程序(二进制)
.obj-目标文件
编译:编译器处理的过程
链接:链接器处理的文件
- 编译器:msvc微软、clang苹果的、gcc都通过命令行进行开发
- 集成开发环境(IDE):VS2022、XCode(苹果)、codeblocks(集成了gcc)、DevC++(集成了gcc)包括了了上述代码编译器
- VSCode不是集成开发环境,只是一个编辑器,用来写代码的,但非常强大,可以通过安装各种插件来搭建C/C++开发环境
- python:解释型的语言(不需要编译器编译)
Q:编辑器、编译器、调试器?
- 编辑器(Editor):
- 编辑器是用于编写和编辑源代码的工具。
- 它提供了一个用户友好的界面,用于输入、编辑和组织代码。
- 编辑器通常具有语法高亮、自动补全、代码折叠等功能,以提高编码效率。
- 例子:Visual Studio Code、Sublime Text、Notepad++等。
- 编译器(Compiler):
- 编译器是将高级编程语言代码(如C、C++、Java等)翻译成底层机器代码或中间代码的工具。
- 它将程序员编写的源代码翻译成计算机能够执行的二进制代码。
- 编译器会进行语法检查和类型检查,以确保代码的正确性。
- 例子:GCC(GNU Compiler Collection)、Clang、Java编译器等。
- 调试器(Debugger):
- 调试器是用于识别、定位和修复程序中的错误(bugs)的工具。
- 它允许开发人员逐步执行代码、检查变量的值、查看内存和堆栈等,以便找到和解决问题。
- 调试器通常提供断点设置、单步执行、变量监视等功能。
- 例子:GDB(GNU Debugger)、Visual Studio Debugger、Python的pdb等。
1.4 第一个C语言代码
#indlude <stdio.h>
int main()
{
printf("Hello World");
return 0;
}
ctrl + f5
—— 编译 + 链接 + 运行
f5
—— 调试(可能会一闪而过)
f10
—— 单步执行
1.5 main函数(主函数)
- main函数是函数
- main"函数是C和C++程序的起始点,程序从main函数的第一行开始执行
- main函数在一个工程中有且仅有一个(一个工程可以有多个.c文件)
写法:
int main()
//main函数最终会返回一个整数int
{
return 0;
//约定返回0,因为在C语言中,正常一般返回0,表示所有代码执行完毕,异常才返回非0的值
}
//{}内的叫函数体
其他写法:
void main()//旧式的写法
{
return 0;
}
int main(void)//void表示main函数不接受参数
{
return 0;
}
int main(int argc, char* argv[], char* envp[])
//但main函数也是可以有参数的,不用就可以不写
//参数有特殊意义
//argc —— 程序运行的可执行参数的个数
//argc —— 可执行参数的参数
//envp —— 环境变量
{
return 0;
}
1.6 其他函数
1.6.1 printf
- printf是一个库函数
- 功能:在屏幕上
打印信息
即输出
1.6.2 scanf
- 功能:输出
使用printf和scanf都得包含头文件
#include <stdio.h>//standard input, output
1.6.3 库函数
- 常见的功能 —> C语言规定成函数 —> 组成标准库 —> 标准库内部函数为库函数
- 一个系列的函数一般在一个头文件中
- 库函数是现成的可以直接使用
规定方式:
由各编译器厂商根据规定负责函数的实现(可以额外拓展,但这些就不能通用了)
- VS2022在msvc中实现
- XCode在clang中实现
1.7 关键词
保留下来给C语言用的符号,成为保留字或关键字
- 关键字都有特殊的意义
- 创建标识符不能和关键字重复
- 关键字不能⾃⼰创建
- 占位符
%c
C语⾔的32个关键字如下:
auto break case char const continue default do double else enum ex
float for goto if int long register return short signed sizeof
struct switch typedef union unsigned void volatile while
C99标准中还加⼊了inline
、restrict
、_Bool
、 _Comploex
、_Imaginary
等关键字。
1.8 字符和ASCII码
- 字符:a,q,@,#等符号
- C语⾔中字符是⽤单引号括起来,如:‘a’,‘b’,‘@’。
- 字符的储存
- 计算机能识别二进制,数据在内存中储存的也是二进制,因此只能通过给这些字符中的每个字符编⼀个⼆进制序列,即编码来储存字符
- 为了⽅便⼤家相互通信,不造成混乱,后来美国国家标准学会(ANSI)出台了⼀个标准 ASCII 编码,C语⾔中的字符就遵循了ASCII编码的⽅式。
printf("%c", 'A');//output 65
printf("%c", 65);//output 65
//打印32~127的ASCII值
int main()
{
int i = 0;
for (i = 32; i<=127; i++)
{
printf("%c ", i);
//将i中的值当做ASCII码打印出来
//c后有一个空格,为了打印出来时,让每个字符隔一个空格
}
return 0;
}
以下需记忆:
- 字符A-Z的ASCII码值从65~90
- 字符a-z的ASCII码值从97~122
- 对应的大小写字符的ASCII码值的差值是32(小减大)
- 数字字符0-9的ASCII码值从48~57
- 换行\n的ASCII值是:10
- 在这些字符中ASCII码值从0~31 这32个字符是不可打印字符,有特殊的意义⽆法打印在屏幕上观察
1.9 字符串
- 使⽤双引号括起来的一串字符就被称为字符串,如:
"abcdef"
- 占位符
%s
- 不能使用单引号括一串字符,如
'myString'
因为一串字符就是字符串,一对单引号只能有一个字符- 不能用
%c
打印字符串,只能打印单个字符,如果尝试使用%c
打印多个字符,它只会打印第一个字符,并且忽略其他字符char myChars[] = "AB"; printf("%c", myChars);//打印字符A
printf("hello");//output hello
printf("%s","hello");//output hello
- 字符串末尾隐藏了一个
\0
字符,作为字符串的结束标志,且占用内存,可以在监视中看到
f10
调试后 —— 窗口 —— 监视
Q:为什么要先调试才能看到监视
,为什么代码里没有abcdef可以在监视里直接输入,是要监视什么,什么是监视,为什么监视能看到隐藏的/0
理解:
int main()
{
char arr1[] = "abc";
char arr2[] = {'a','b','c'};
//在监视中可以看到arr1有4个元素,arr2只有3个
//Q:为什么第二行需要加{},是因为多个和一个元素的原因吗
printf("%s\n", arr1);//输出abc
printf("%s\n", arr2);//输出abc爱耿弘?。s(直到遇到内存里的\0才停止打印)
}
若改为如下代码:
char arr1[] = "abc";//输出abc
char arr2[] = {'a','b','c','\0'};//输出abc
Q:用一个{}里面的字符也就变成字符串了吗?为什么也需要字符串的结束标志
A:大括号 {} 通常用于初始化数组或结构体等复杂的数据结构,而不是用于表示单个字符
字符串中遇到/0也表示字符串结束
printf("abc\0def")//输出abc
1.10 转义字符
- 转变原来意思的字符
printf("abcdndef")//输出abcdndef
printf("abcd\ndef")//输出abcd(enter)def
C语言中的转义字符:
\?
:在书写连续多个问号时使⽤,防⽌他们被解析成三字⺟词,在新的编译器上没法验证了。
三字母词:
??)
—>]
,??(
—>[
printf("(are you ok??)")
//在过去的编译器中,??)会被解析成三字母词
printf("(are you okay\?\?)")
//将三字母词中的?转换为了字符?,\?是一个字符
\'
:⽤于表⽰字符常量’
printf("%c", ''');
//会报错,遵循从左至右的顺序,最后一个'落单了,且开始''中间应该有一个字符
printf("%c", '\'');
//输出',让'不再是一对'中的'
-
\"
⽤于表⽰⼀个字符串内部的双引号 -
\\
:⽤于表⽰⼀个反斜杠,防⽌它被解释为⼀个转义序列符。
打印路径
printf("c:\\test\\test.c");
//输出c:\test\test.c
\t
:Tab水平制表符(四个enter),光标移到下⼀个⽔平制表位,通常是下⼀个8的倍数,是一个字符
printf("c:\\test\\test.c");
//输出c:\ est\ est.c
-
\a
:警报,这会使得终端发出警报声或出现闪烁,或者两者同时发⽣。 -
\b
:Backspace退格键,光标回退⼀个字符,但不删除字符(相当于删除)
printf("abcdefg");//输出abcdefg
printf("abcde\bfg");//输出abcdfg,打印过程是先打印abcde,再会退一个再打印fg,e被覆盖掉
printf("abcde\b");//输出abcd
-
\f
:换⻚符,光标移到下⼀⻚。在现代系统上,这已经反映不出来了,⾏为改成类似于 \v 。 -
\n
:换⾏符。 -
\r
:回⻋符,光标移到同⼀⾏的开头。 -
\v
:垂直分隔符,光标移到下⼀个垂直制表位,通常是下⼀⾏的同⼀列。 -
\ddd
:ddd表⽰1~3个(个数其实无所谓)⼋进制的数字,\ddd表示ASICC中字符的八进制形式,是一个字符
printf("%c\n", '\130');//输出X(130 ---> 88 ---> X)
\xdd
:dd表⽰2个⼗六进制数字,\xdd表示字符的16进制形式,是一个字符
printf("%c\n", '\x48');//输出H
\0
:null字符,代表没有内容,\0就是\ddd 这类转义字符的⼀种,⽤于字符串的结束标志,其
ASCII码值是0.
strlen()是求字符串长度的库函数(头文件为string.h),占位符为%zd,统计的是字符串中**\0之前的字符的个数**
#include <string.h>
int main()
{
printf("%zd", strlen("c:\\test\\test.c"));
//输出13
return 0;
}
10.11 语句
C语⾔的代码是由⼀条⼀条的语句构成的,C语⾔中的语句可为以下五类:
- 空语句
- 表达式语句
- 函数调⽤语句
- 复合语句
- 控制语句
C语⾔⽀持三种结构:顺序结构、选择结构、循环结构,它们由特定的语句定义符组成,有九种控制语句。
- 条件判断语句也叫分⽀语句:if语句、switch语句;
- 循环执⾏语句:do while语句、while语句、for语句;
- 转向语句:break语句、goto语句、continue语句、return语句。
int main()
{
;//空语句
//空语句:分号就是一个语句,因为什么都没有,所以是空语句
//空格不是一个表达式,空格仅用来分割,没有意义
int a = 10;
int b = 20;
a + b;//表达式语句
printf("hehe\n");//函数调用语句
for(i=0; i<10; i++)
{
arr[i] = 10-i;
printf("%d\n", arr[i]);
}//for循环的循环体的⼤括号中的就是复合语句
return 0;
}//大括号括起来的就是复合语句
1.12 注释
- C语言风格/**/型
缺点:不支持嵌套注释
int main()
{
int a = 10;/* 创建整型变量a,并赋值10 */
/*
int b = 0;
int c = 0;
*/
return 0;
假如想把整个main函数注释掉
/*
int main()
{
int a = 10;/* 创建整型变量a,并赋值10 */
/*
int b = 0;
int c = 0;
*/
return 0;
*/
- C++风格//形式(C99引入)
- 不想删掉代码 —> 使用注释
- 编译时注释会被替换成空格,
min/*这⾥是注释*/Value
会变成min Value
,⽽不是minValue
- 注释可以在行上行下或行内
min/*这⾥是注释*/Value
- 无论是哪种注释都不能在双引号内,会被结束成普通字符
快捷键
crtl + k + c
注释
crtl + k + u
取消注释
*
表示all
作业
- 为什么define不是关键字
想把整个main函数注释掉
/*
int main()
{
int a = 10;/* 创建整型变量a,并赋值10 */
/*
int b = 0;
int c = 0;
*/
return 0;
*/
- C++风格//形式(C99引入)
- 不想删掉代码 —> 使用注释
- 编译时注释会被替换成空格,
min/*这⾥是注释*/Value
会变成min Value
,⽽不是minValue
- 注释可以在行上行下或行内
min/*这⾥是注释*/Value
- 无论是哪种注释都不能在双引号内,会被结束成普通字符
快捷键
crtl + k + c
注释
crtl + k + u
取消注释
*
表示all
作业
- 为什么define不是关键字
- 工程和项目是一个意思吗