C语言笔记1:C语言常见概念

文章目录

C语言笔记1:C语言常见概念

一、C语言是什么?

人与人交流要使用语言,比如汉语、英语、法语...。

那么人与计算机交流也要使用语言。计算机语言

人通过计算机语言给计算机下达指令,让计算机去做某些工作

计算机语言有很多:机器语言、汇编语言、高级编程语言(C++/Java/Python/Go)等,都可以叫做计算机语言

二、C语言的发展历史

1969年:贝尔实验室的肯汤普森和丹尼斯里奇一起开发了Unix操作系统,Unix操作系统是使用汇编代码编写的,如果想要移植到别的架构的计算机上,就需要重新为该计算机的CPU架构重新写一份Unix系统代码,这样的工作量太大了,肯汤普森就尝试使用高级语言编写操作系统,于是他在BCPL语言的基础上发明了B语言
1972年:由于B语言是无类型,解释型语言,这会导致:

  • 编译器无法检查类型,容易造成某些隐患,比如说对一个字符类型做乘法。
  • 性能低下,B语言中只有word(字)这种数据类型,所以在处理一个字的时候,要进行字->类型的转换,这带来了效率的损失
  • B语言是解释型语言,计算机需要一边翻译一边执行,效率自然就低了

并且B语言诞生的机器是PDP-7,这是一台字寻址机器 ,每次读取数据可能要拿16位或者32位的内存空间,这对于字符处理来说极不方便因为一个字符只占8位(可能要进行位运算将字符从一个字中取出),新的机器PDP-11则是字节寻址机器,这意味着更高的灵活性和性能。此时的B语言必然不适配新的机器,那么就需要新的语言------C语言。

为了解决B语言的问题,C语言在设计上引入了数据类型,以及指针等概念,并且C语言是一门编译型语言。
1973年:整个Unix系统都使用C语言进行了重写,此后,这种语言被广泛用于各种操作系统和系统软件开发。
1983年:美国国家标准协会正式将C语言标准化

三、main函数

c 复制代码
int main()
{
	return 0;
}

main函数是整个程序的入口有且仅有一个

return 0;表示main函数返回一个整数类型,这个值一般由操作系统或者父进程接收,用于判断程序的返回状态,根据状态进行进一步的行为。比如:返回1表示除零错误,打印错误信息等等...

四、库函数

为了不再实现重复的常见代码,C语言标准定义了一批函数,由不同的编译器厂商(gcc/msvc/clang)实现,这些函数组成了一个函数库,这个库就叫做标准库

动静态库文件一般来说在下载集成开发环境的时候会帮你打包到指定的目录下。可是系统也会自带一些库保证它能够正常运行,因为操作系统是C语言和汇编写的嘛。那该如何避免冲突呢?

来源 典型路径(windows) 典型路径(Linux)
操作系统自带库 C:\Windows\System32\ C:\Windows\SysWOW64\ /lib /usr/lib
Visual Studio 库 C:\Program File\MSVC\\...\lib\ C:\Program FIle(x86)\Windows Kits\\...\
第三方库(通过包管理器) C:\Program Files\某软件\lib\ C:\ProgramData\ /usr/local/lib/ /opt/某软件/lib/
用户安装库(项目路径下)

五、关键字介绍

标识符不能和关键字冲突

关键字如下:

c 复制代码
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

六、字符和ASCII编码

十进制 | 八进制 | 十六进制 | 字符(含义)

完整ASCII码表如下

七、字符串和\0

C语言约定了字符串的末尾是\0

c 复制代码
#include <stdio.h>
int main()
{
	printf("%s\n","hello,c");
	return 0;
}

这样的字符串究竟被编译器解释成什么呢?

可以看到,其实字符串就是一个特殊的字符数组,它的末尾加了\0,表示这个字符数组是一个字符串。

那么我们为什么要在它后面加0呢?

如果我们不再字符串后加0,printf函数怎么知道"hello,c"启始地址下的内容到哪结束呢?

八、转义字符

  • ? :在书写连续多个问号时使⽤,防⽌他们被解析成三字⺟词,在新的编译器上没法验证了。
  • \' :⽤于表⽰字符常量'
  • \" :⽤于表⽰⼀个字符串内部的双引号
  • \\ :⽤于表⽰⼀个反斜杠,防⽌它被解释为⼀个转义序列符。
  • \a :警报,这会使得终端发出警报声或出现闪烁,或者两者同时发⽣。
  • \b :退格键,光标回退⼀个字符,但不删除字符。
  • \f :换⻚符,光标移到下⼀⻚。在现代系统上,这已经反映不出来了,⾏为改成类似于\v
  • \n:换行符, new line
  • \r:回车符,return
  • \t:制表符,table
  • \v:垂直分割符,光标移动到下一个垂直制表位,通常是下一行的同一列

字符的八进制或者十六进制的表示形式:

  • \ddd:ddd表示1到3个八进制数字,比如\130表示字符X
    • \xdd:dd表示2个十六进制数字,比如\x30表示字符0
c 复制代码
#include <stdio.h>
int main()
{
    printf("%c\n", '\130');
    printf("%c\n", '\x30');
    return 0;
}

我们注意到'\130' '\x30' 都被单引号包起来,说明它们是一个字符

九、注释

编译时注释会被替换成空格,while(a < 0/* a<0才进入循环 */),在编译后会变成这样:while(a<0 ) 而不是while(a<0)。

如何验证呢?分步编译,生成.i文件查看即可。

都被单引号包起来,说明它们是一个字符

九、注释

编译时注释会被替换成空格,while(a < 0/* a<0才进入循环 */),在编译后会变成这样:while(a<0 ) 而不是while(a<0)。

如何验证呢?分步编译,生成.i文件查看即可。

相关推荐
镜中人★8 小时前
408计算机组成原理考纲知识点
网络·笔记
Felven8 小时前
A. Blackslex and Password
c语言
老鱼说AI8 小时前
现代计算机系统1.2:程序的生命周期从 C/C++ 到 Rust
c语言·c++·算法
ljt27249606619 小时前
Compose笔记(六十八)--MutableStateFlow
android·笔记·android jetpack
项目題供诗9 小时前
C语言基础(二)
c语言·开发语言
强子感冒了9 小时前
Java 学习笔记:File类核心API详解与使用指南
java·笔记·学习
别了,李亚普诺夫9 小时前
USB拓展坞-PCB设计学习笔记
笔记·学习
福大大架构师每日一题9 小时前
2026年1月TIOBE编程语言排行榜,Go语言排名第16,Rust语言排名13。C# 当选 2025 年度编程语言。
golang·rust·c#
wangnaisheng9 小时前
【C#】gRPC的使用,以及与RESTful的区别和联系
c#