C语言历史
1969年:B语言被发明
1972年:在B语言基础上设计了C语言
1973年:Unix系统使用C语言重写
1988年:C语言标准化,标志着C语言开始稳定和规范化
编译和链接
C语言代码是放在.c为后缀的文件中的,要得到最终运行的可执行程序,中间要经过编译和链接两个过程,最终生成二进制的可执行程序。
一个工程一般会有多个源文件组成,下图演示了源程序经过编译器和链接器处理的过程。
注:1每个源文件(.c)单独经过编辑器处理生成对应目标的文件(.obj为后缀的文件)
2多个目标文件和库文件经过链接器处理生成对应的可执行程序(.exe文件)
编译器对比:msvc(微软提供)、clang(苹果提供)、gcc等。
集成开发环境:vs2022、xcode(苹果提供)、codeblocks、devc++、clion等
集成开发环境(IDE)用于提供程序开发环境的应用程序,一般包括代码编译器、编译器、调试器和图形用户界面等工具。继承了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。
vs2022 集成了Msvc(安装包较大,但无需多于配置)
xcode 集成了clang(苹果电脑上的开发工具)
codeblocks 集成了gcc(比较小众,需配置环境)
devc++ 集成了gcc(小巧,但工具简单,一些竞赛使用)
Clion 默认使用cmake(工具收费)
c语言文件基本认识:
1 xxx.c 源文件 2 xxx. 头文件 3 c++:cplusplus:cpp 4 c++代码文件后缀是.cpp、
第一个c语言程序
在屏幕上打印:hello world
编译+链接+运行代码Ctrl+F5
main函数
每个c语言程序都是从main函数开始执行,main函数也叫主函数。
main函数有且仅有一个
即使一个项目中有多个源文件(.c文件)但只能有一个main函数。
main函数的标准模板(这里的int表示main函数结束时会返回一个整数,return0意思是返回0)
int main()
{
return0;
}
注:1 main函数后()容易忘掉
2 代码中不能使用中文符号
3 一条语句结束后,有分号
main函数的常见写法
1 古老的写法(使用void无返回值)
void main()
{
printf();
}
2 参数部分多了void,这里表示main函数没有参数
int main(void)
{
return0;
}
3 int main(int argc,char* argv[])
{
return0;
}
括号内表示main函数有参(暂时不需要了解)
printf和库函数
printf是函数-c语言的标准库中提供的现成函数
功能:在屏幕上打印信息
int main()
{
printf("hello world \n"); //这里的\n表示换行的意思,双括号括起来的是一串字符被称为字符串
return0;
}
打印整数:
printf函数的其他使用
%d表示打印整数,%c表示打印字符,%f表示打印单精度浮点数,%lf表示打印双精度浮点数,%s表示打印字符串。
这里的%d %s %f 等是占位符
库函数
使用库函数时需包含头文件,如printf函数需包含stdio.h
#include<stdio.h>
std-standard-标准
i-inpute-输入
o-output-输出
简单来说库函数就是c语言标准规定的一些函数,这些函数组成了一个函数库,被称为标准库。
关键字介绍
int、if、return等此类符号被称为保留字或关键字
程序员自己在创建标识符时不能和关键字重复
关键字不能自己创建
字符和ASCII编码
每一个字符都有二进制序列,这个序列叫编码,后来出台了一个标准ASCII编码。
ASCII表码共包含128个ASCII编码
A-Z的ASCII码值从65-90
a-z的ASCII码值从97-122
对应大小写字符的ASCII的码值差值是32
数字字符0-9的ASCII码值从48-57
换行\n的ASCII值是:10
在字符中ASCII码值从0-31这32个字符是不可打印字符
ASCII码表上编号为32-127的字符打印
#include<stdio.h>
int main()
{
int i =0
for(i=32;i<=127;i++)
{
printf("%c ",i);
}
return0;
}
0字符串和\0
使用双引号括起来的一串字符称为字符串,如:“abcdef”
int main()
{
printf("%s \n","abcdef");
return0;
}
c语言字符串中字符串结尾隐藏放着一个\0字符,这个\0字符是字符串结束的标志
"abcdef"=》[abcdef\0]
int main()
{
char arr1[]="abcdef";
return0;
}
用F10后用调试窗口中的监视可以看到\0
int main()
{
char arr1[]={'a',''b','c','d','e','f'}; //arr1中无\0
return0;
}
Ctrl+F5后分别跑下两个代码可以看出有无\0的区别
strlen是一个库函数-求字符串的长度,统计的字符串中\0之前的字符个数
在库函数中引用strlen使用string.h 这里由于arr1,中不含终止读取符\0所以读取时strlen会胡乱读取,所以会输出35
strlen的返回类型是size_t类型的应使用%zd
#include<string.h>
int main()
{
char arr1[]={'a','b','c','d'};
char arr2[]="abcd";
char arr3[]={'a','b','c','d','\0'};
printf("%zd ",strlen(arr1));
printf("%zd",strlen(arr2));
printf("%zd",strlen(arr3));
return0;
}
转义字符
顾名思义:转变为原来意思的字符
int main()
{
printf("abcnde\n");
printf("ab\nde\n");
return0;
}
\n在转义字符表示换行的意思,可以简单理解为'\'让n的意思发生了转变
\?:书写多个问号时防止被解析为三字母词(现在翻译器无法翻译三字母词)
\':用于表示字符常量'
\":用于表示字符串内部的双引号
\\:用于表示一个反斜杠,防止被解释为一个转义字符序列符
\a:警报,会使终端发出警报声或闪烁或同时警报闪烁
\b:退格键,光标回退一个字符
\f:换页符,光标移到下一页,类似于\v
\n:换行符
\r:回车键,光标移到同一行开头
\t:制表符,光标移到下一个制表符,通常是下一个4/8的倍数(=Tab键)
int main()
{
printf("%c\n",''\');
printf("%s","\"");
printf("c:\test\bit");
printf("c:\\test\\bit");
printf("\a");
printf("a\bc");
printf("abcdef\r");
printf("a\tbc\tdef\tqq");
return0;
}
\ddd:表示1-3个八进制的数字 如:\130表示字符x
\xdd:表示2个十六进制的数字 如:\30表示字符0
int main()
{
printf("%c\n",'\130');
printf("%c\n",'\36');
return0;
}