Hello! 博友们,进入大学编程语言的学习,很多同学肯定都是从C语言入手,那么C语言究竟是什么样的语言呢?今天就让我来介绍一下吧!
1.对C语言本身的理解
提及代码与编程语言,很多小白可能都会不由自主地认为这是一门很高级的技术,自己估计学不会,从而产生了一丝畏难之心。实际上,和汉语、英语、⽇语一样,C语⾔也是一门语言,只不过,前者属于人与人日常交流的自然语言,而C语⾔则属于众多计算机语⾔中的⼀种,用于人与计算机的交流。当然,
C++/Java/Go/Python
也是主流的计算机语⾔。
2.C语言的程序运行原理
C语⾔是⼀⻔编译型计算机语⾔,C语⾔源代码都是⽂本⽂件,⽂本⽂件本⾝⽆法执⾏,必须通过编译器编译和链接器的链接后,可执⾏⽂件才能执⾏。 如下图所示,演示了源程序经过编译器和链接器处理的过程。
1. 每个源⽂件(.c)单独经过编译器处理⽣成对应的⽬标⽂件(.obj为后缀的⽂件)
2. 多个⽬标⽂件和库⽂件经过链接器处理⽣成对应的可执⾏程序(.exe⽂件)
3.源文件与头文件的介绍
C语⾔把
.c
为后缀的⽂件称为源⽂件,把
.h
为后缀的⽂件称为头⽂件。
在VS上写代码,我们是需要创建项⽬的,直接右击源文件添加新建项即可。
4.写第一个C语言程序
Hello C language !!!
按住 ctrl+f5 执行(笔记本电脑 ctrl+fn+f5)
恭喜你!编好了第一个C语言程序!
5.main函数
每个 C 语⾔程序不管有多少行代码,都是从 main 函数开始执行的, main 函数是程序的入口, main 函数也被叫做:主函数。 main 前⾯的 int 表示 main 函数执⾏结束的时候返回⼀个整型类型的值,所以在 main 函数的最后写 “ return 0; ” 正好前后呼应。
•
main函数是程序的⼊⼝
•
main函数有且仅有⼀个
•
即使⼀个项⽬中有多个.c⽂件,但是只能有⼀个main函数(因为程序的⼊⼝只能有⼀个)
易错点
总结:
•
main 被写成了mian
•
main后边的()漏掉了
•
main()后面多加了分号
6.库函数
为了不再重复实现常⻅的代码,让程序员提升开发效率,C语⾔标准规定了⼀组函数,这些函数再由不同的编译器⼚商根据标准进⾏实现,提供给程序员使⽤。这些函数组成了⼀个函数库,被称为标准库,这些函数也被称为库函数。在这个基础上⼀些编译器⼚商可能会额外扩展提供部分函数(这些函数其他编译器不⼀定⽀持)。
上图中
#include<stdio.h>
就是库函数,其中包含了
printf
printf 是⼀个库函数,它的功能是在标准输出设备(⼀般指屏幕)上进⾏信息的打印。上面的代码是使⽤ printf
函数打印字符串。只要把想要打印的⼀串字符放在双引号中并传递给 printf 函数就可以打印。
7.关键字介绍
- void:声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果
- char:字符型类型数据,属于整型数据的一种
- int:整型数据,通常为编译器指定的机器字长
- float:单精度浮点型数据,属于浮点数据的一种
- double:双精度浮点型数据,属于浮点数据的一种
- short:修饰int,短整型数据,可省略被修饰的int。
- long:修饰int,长整形数据,可省略被修饰的int。
- signed:修饰整型数据,有符号数据类型
- unsigned:修饰整型数据,无符号数据类型
- struct:结构体声明
- union:共用体声明
- enum:枚举声明
- typedef:声明类型别名
- sizeof:得到特定类型或特定类型变量的大小
- auto:指定为自动变量,由编译器自动分配及释放。通常在栈上分配
- static:指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部
- register:指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数
- extern:指定对应变量为外部变量,即在另外的目标文件中定义,可以认为是约定由另外文件声明的对象的一个“引用“
- const:与volatile合称“cv特性”,指定变量不可被当前线程/进程改变(但有可能被系统或其他线程/进程改变)
- volatile:与const合称“cv特性”,指定变量的值有可能会被系统或其他进程/线程改变,强制编译器每次从内存中取得该变量的值
- return:用在函数体中,返回特定值(或者是void值,即不返回值)
- continue:结束当前循环,开始下一轮循环
- break:跳出当前循环或switch结构
- goto:无条件跳转语句
- if:条件语句
- else:条件语句否定分支(与if连用)
- switch:开关语句(多重分支语句)
- case:开关语句中的分支标记
- default:开关语句中的“其他”分支
- for:for循环结构
- do:do循环结构
- while:while循环结构
8.数据类型
C语⾔提供了丰富的数据类型来描述⽣活中的各种数据:使⽤整型类型来描述整数,使用字符类型来描述字符,使用浮点型类型来描述小数。
每⼀种数据类型都有自己的⻓度,使⽤不同的数据类型,能够创建出长度不同的变量,变量⻓度的不同,存储的数据范围就有所差异。
上图为C语言数据类型概述图
1.整型
整型的定义符是 int ,整型有两个空间大小修饰符 short 和 long 。 short int 称为短整型,占有2字节; long int 称为长整型,占有4字节。在 VS 环境中, long 是缺省的长度修饰符,所以 int 等价于 long int 。
整型有两个符号位修饰符 signed 和 unsigned 。 signed int 表示有符号整数, unsigned int 表示无符号整数。 signed 是缺省的符号位修饰符,所以 int 也等价于 signed int 。由于类型修饰符及默认的书写格式,使得整型的表现形式变化较多,实际上,整型共分为4类:有符号的长整型、无符号的长整型、有符号的短整型、无符号的短整型。
2.字符型
字符型的定义符是 char ,字符数据在内存中占用1字节,存储的是字符的 ASCII 值。如' a '~' z '的码值是97~122,' A '~' Z '的码值是65~90,'0'~'9'的码值是48~57。常见字符与 ASCII 代码对照表参照ASCll码表。和整型相似,字符类型的修饰符有 signed 、 unsigned ,具体类型分为 signed char (有符号字符型)和 unsigned char (无符号字符型)。 signed 是缺省修饰符,所以 char 等价于 signed char . unsigned char 型采用二进制数据形式存储字符码值,码值范围是0~255。 signed char 型采用补码形式存储字符的码值,将最高位作为符号位,码值范围是-128~127。实际上,就简单字符处理而言,unsigned char 与 signed char 基本没有差别。
3.浮点型
浮点型又叫实型,分为单精度实型和双精度实型。单精度实型的定义符是 float ,占用4字节;双精度实型的定义符是 double ,占用8字节。在内存中,实型数据被分成符号位(1位)、小数部分、指数部分,按指数形式存储。其中小数部分和指数部分的位数由具体的编译系统决定。显然,小数部分位数越多,数据精度就越高;指数部分位数越多,数据范围就越大。
4.sizeof操作符
sizeof
是⼀个关键字,也是操作符,专⻔是用来计算sizeof操作符数的类型长度的,单位是字节。
sizeof
操作符的操作数可以是类型,也可是变量或者表达式。
格式如下:
sizeof 后边的表达式是不真实参与运算的,根据表达式的类型来得出⼤⼩。
注意:
sizeof
运算符的返回值,C 语⾔只规定是无符号整数,并没有规定具体的类型,而是留给系统自己去决定, sizeof
到底返回什么类型。不同的系统中,返回值的类型有可能是unsigned int ,也有可能是
unsigned long
,甚至是
unsigned long long
, 对应的 printf()
占位符分别是
%u
、
%lu
和
%llu ,
这样不利于程序的可移植性。 C 语言提供了⼀个解决⽅法,创造了⼀个类型别名 size_t
,⽤来统⼀表示
sizeof
的返回值类型,对应当前系统的 sizeof
的返回值类型,可能是
unsigned int
,也可能是 unsigned long long 。
9.变量
变量的创建方法:
变量在创建的时候就给⼀个初始值,就叫初始化。
注意:在定义float类型时,小数后面要加f,否则默认为double类型 float a=8.3f;
10.单目操作符
+ - * \ % (加减乘除取模) 都是常见的双目操作符,顾名思义,操作符两端都有操作数,在此重点探讨一下单目操作符的用法。
单目操作符分为 ++ 和 -- ,两者又分为前置和后置。
1.前置++
计算⼝诀:
先+1,后使用
。
我们来看一下结果:
2.后置++
计算⼝诀:
先使用,后+1
。
我们来看一下结果:
你明白二者的区别了吗?(前置--和后置--同理)
11.printf 函数
1.printf中的占位符
所谓 “占位符”,就是这个位置可以⽤其他值代入,例:
上面示例中,The robot has %d functions 是输出文本,里面的 %d
就是占位符,表示这个位置要用其他值来替换。占位符为百分号 %
,
%d
表示这里代入的值必须是⼀个整数。
printf()
的第⼆个参数就是替换占位符的值,上⾯的例⼦是整数 11
替换
%d ,
执行后的输出结果就是 The robot has 11 functions 。
常用的占位符除了
%d
,还有
%s
表示代入的是字符串,例:
上面实例中,
%s
表示代⼊的是⼀个字符串,所以
printf()
的第⼆个参数就必须是字符串,在这个例子是 Falcon 。执行后的输出就是 Falcon says he
will come tonight
。
上⾯示例中,输出文本 %s says he will come at %d o'clock
有两个占位符,第⼀个是字符串占位符 %s
,第⼆个是整数占位符
%d
,分别对应
printf()
的第⼆个参数( Falcon
)和第三个参数 (11)。执行后的输出就是 Falcon
says he will come at 11 o'clock
。
printf() 参数与占位符是⼀⼀对应关系,如果有 n 个占位符,
printf()
的参数就应该有
n + 1 个。如果参数个数少于对应的占位符,
printf()
可能会输出内存中的任意值。
2.常见占位符:
%c :字符。
%d :⼗进制整数。
%f :小数(包含
float
类型和
double
类型)。
%Lf
:long double 类型浮点数。
%n
:已输出的字符串数量。该占位符本⾝不输出,只将值存储在指定变量之中。
%o
:⼋进制整数。
%p
:指针。
%s
:字符串。
%u
:⽆符号整数(unsigned int)。
%x
:⼗六进制整数。
%zd
:
size_t
类型。
%%
:输出⼀个百分号。
%hd :⼗进制 short int 类型。
%ho
:⼋进制 short int 类型。
%hx
:⼗六进制 short int 类型。
%hu
:unsigned short int 类型。
%ld
:⼗进制 long int 类型。
%lo
:⼋进制 long int 类型。
%lx
:⼗六进制 long int 类型。
%lu
:unsigned long int 类型。
%lld
:⼗进制 long long int 类型。
%llo
:⼋进制 long long int 类型。
%llx
:⼗六进制 long long int 类型。
%llu
:unsigned long long int 类型。
3.限定宽度
printf() 允
许限定占位符的最小宽度,例:
上面示例中,
%6d
表示这个占位符的宽度至少为6位。如果不满6位,对应的值的前面会添加空格。输出的值默认是右对齐,即输出内容前面会有空格;如果希望改成左对齐,在输出内容后面添加空格,可以在占位符的 %
的后面插入⼀个 -
号。
而对于小数,这个限定符会限制所有数字的最小显示宽度,例:
上面示例中,
%12f
表示输出的浮点数最少要占据12位。由于小数的默认显示精度是小数点后6位,所以 543.21
输出结果的头部会添加2个空格。
4.限定小数位数
输出小数时,有时要限定小数的位数。例:希望小数点后面保留三位,占位符可以写成
%.3f
12.scanf 函数
当我们有了变量,我们需要给变量输⼊值就可以使⽤
scanf
函数
1.基本用法
scanf() 函数用于读取用户的键盘输⼊。程序运行到这个语句时,会停下来,等待用户从键盘输⼊。用户输⼊数据、按下回车键后,scanf() 就会处理用户的输⼊,将其存⼊变量。
它的原型定义在头文件 stdio.h ,语法跟 printf() 类似。
scanf( " %d ", &i );
注意:变量前面必须加上 & 运算符(指针变量除外),因为 scanf() 传递的不是值,而是地址,
即将变量 i 的地址指向用户输⼊的值。
2.占位符
scanf()
常⽤的占位符如下,与
printf()
的占位符基本⼀致。
%c
:字符
%d
:整数
%f
:
float
型浮点数
%lf
:
double
型浮点数
%Lf
:
long double
型浮点数
%s
:字符串
上面所有占位符之中,除了
%c
以外,都会自动忽略起首的空白字符。
%c
不忽略空白字符,总是返回当前第⼀个字符,无论该字符是否为空格。如果要强制跳过字符前的空白字符,可以在
%c
前加上⼀个空格,表示跳过零个或多个空白字符。
13.结语
亲爱的同学们,你们学会了吗?了解完C语言入门基础知识之后,我们就正式敲开了C语言世界的大门了。接下来的博客,我会将C语言下面章节的重难点和易错点分享给大家,以便大家更深入地理解和应用!