C语言的结构
一个C语言程序由若干个头文件
与多个函数
构成,每个函数有自己的功能,例如
#include <stdio.h> //stdio.h就是头文件
int main(void) { //从int到结尾这是主函数
printf("Hello Worldn");
return 0;
}
#include <stdio.h>
是一条预处理命令, 预处理(或称预编译)是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。函数
我个人理解为就是一小块写好的代码,是实现代码逻辑的一个小的单元。
主函数
这里有一个主函数,主函数他是必不可少的,一个C程序有且只有一个主函数,即main函数
。在最新的C标准中,main函数前的类型为int而不是void。
- C程序就是执行主函数里的代码,也可以说这个主函数就是C语言中的唯一入口。
- main前面的int就是主函数的类型。
printf()
是格式输出函数,它的作用就是在屏幕上输出指定的消息。return
是函数的返回值,不同的函数会返回不同的值。
关键字
什么是关键字? 关键字,也叫作保留字。是指一些被C语言赋予了特殊含义的单词 关键字有什么特征?
- 全部都是小写
- 在开发工具中会显示特殊颜色 关键字需要注意什么?
关键字注意点: 因为关键字在C语言中有特殊的含义, 所以不能用作常量名、变量名、函数名以及其他标识符名称。
关键字 | 作用 |
---|---|
auto | 声明自动变量 |
break | 跳出当前循环 |
case | 开关语句分支 |
char | 声明字符型变量或函数返回值类型 |
const | 定义变量,如果一个变量被const修饰,那么它的值就不能再被改变 |
continue | 结束当前循环,开始下一轮循环 |
default | 开关语句中的“其他分支” |
do | 循环语句的循环体 |
double | 声明双精度浮点型变量或函数返回值类型 |
else | 条件语句否定分支(与if连用) |
enum | 声明枚举类型 |
exterm | 声明变量或函数是在其他文件或本文件的其他位置定义 |
float | 声明浮点型变量或函数返回值类型 |
for | 一种循环语句 |
goto | 无条件跳转语句 |
if | 条件语句 |
int | 声明整型变量或函数 |
long | 声明长整型变量或函数返回值类型 |
register | 声明寄存器变量 |
return | 子程序返回语句(可以带参数,也可不带参数) |
short | 声明短整形变量或函数 |
signed | 声明又符号类型变量或函数 |
sizeof | 计算数据类型或变量长度(即所占字节数) |
static | 声明静态变量 |
struct | 声明结构体类型 |
switch | 用于开关语句 |
typedef | 用以给数据类型取别名 |
unsigned | 声明无符号类型变量或函数 |
union | 声明共用体类型 |
void | 声明函数无返回值或无参数,声明无类型指针 |
volatile | 说明变量在程序执行中可被隐含地改变 |
while | 循环语句的循环条件 |
标识符
什么是标识符?
- C语言由函数构成,一个C程序中会有很多个函数,为了更好的区分这些函数,所以给每一个函数起一个名字,这个名字就是标识符。 *标识符的命名规则
- 只能由字母、数字、下划线组成
- 第一个字符必须是字母或下划线,不能以数字开头
- 不能是C语言中的关键字
- 严格区分大小写字母
- 标识符最好选择有意义的英文单词组成,不要使用拼音。
- 标识符的长度最好不要超过8位,在某些版本中规定标识符前8位有效,如果你的两个标识符前8位相同时,就会被认为时同一个标识符。
变量
变量是计算机中一块特定的内存空间由一个或多个连续的字节组成。
C语言
的代码由一行行语句组成。语句就是程序执行的一个操作命令。C语言规定,语句必须使用分号结尾,除非有明确规定可以不写分号。
int Number = 1
语句
C语言的代码由一行行语句组成。语句是程序执行的一个操作命令。每个语句必须使用分号结尾,除非由明确规定可以不写分号。
代码语言:javascript复制int Number = 1;
这就是一个变量声明语句,声明整形变量Number
,并给他赋值为1。
同一行可以写多个语句,换行只是方便阅读,并不是必须的。
int Number;Number = 1;
一个语句也可以写在很多行,这个时候就需要依靠分号来判断语句是在哪一行结束的。
代码语言:javascript复制int Number;
Number
=
1
;
在这里编译器在编译时会自动忽略代码中的换行。 单个分号也是一个有效语句,被称为“空语句”,但是他毫无作用。
表达式
C语言的计算是通过表达式完成的。表达式是一个计算式,用来获取值。
代码语言:javascript复制1 2
在这个地方的1 2就是一个表达式,用来获取1 2
这个算术的计算结果。
在表达式后加上分号,也是语句,但是没有作用。
表达式与语句的主要区别:
- 语句包含表达式,但是表达式本身不构成语句
- 表达式都是又返回值的,语句不一定有。语句是用来执行命令的,一般不需要返回值。
语句块(函数体)
C语言允许多个语句使用一对大括号{},组成一个块,也称为复合语句。在语法上,语句块可以视为多个语句组成的一个复合语句。它使用大括号把许多语句和声明组合到一起,形成单条语句。
代码语言:javascript复制{
int Number;
Number = 1;
}
上面中一个大括号(花括号)形成了一个语句块,大括号的结尾不需要添加分号。
空格
C语言中的空格主要是用来帮助编译器区分语法单位的。如果语法单位不需要空格就可以被区分,那么就不需要空格,只是为了让程序员更容易观看,增加可读性。
代码语言:javascript复制int Number = 1;
// 等于
int Number=1;
在代码中,语法单位之间的多个空格等于一个空格。
代码语言:javascript复制int Number = 1;
空格还可以用来表示缩进,一般情况下一级代码比上一级代码缩进四个空格。 只有空格的一行代码被称为空白行,编译器会直接忽略掉这行代码。
注释
注释是对代码进行解释说明,编译器不会读取,只是给程序员看的。 C语言有两种注释方法,第一种:
代码语言:javascript复制/*这是一段注释*/
/*
被他包含起来就可以
*/
这是第一种注释,他可以穿插在代码行中
代码语言:javascript复制int Number/*这是注释*/ = 1;
第二种:
代码语言:javascript复制// 这是第二种注释
int Number = 1;
第二种注释是将注释内容放到//
的后面,从双斜杠后面一直到这一行结束都属于注释。可以将他放到第一行或者某一行的行尾。
不管是哪种注释都不能放到双引号""
里编译器在编译时,会将双引号里的注释字符视为普通字符,不存在注释的作用。
#include<stdio.h>
int main()
{
printf("/*我是注释*/Hello,world");
return 0;
}
这段代码编译后运行,会输出Hello,world
。
printf()
基本用法
printf()
的作用是将制定的参数文本输出到屏幕上。printf()是在标准库的头文件stdio.h定义的。使用这个函数之前,必须在源码文件头部引入这个头文件。只有在源码头部加上#include <stdio.h>
,才能使用printf()
这个函数。
#include <stdio.h>
int main(void) {
printf("Hello Worldn");
}
上面的命令会在屏幕上输出一行文字:Hello World
占位符
printf()
可以在输出的文本中指定占位符。占位符就是先占住一个固定的位置,等着你再往里面添加内容的符号。
//输出Are these 2 paragraphs?
printf("Are these %i paragraphs?", 2);
从这个示例看,Are these %d paragraphs?
是输出文本,其中的%i
就是占位符,它占住了这个位置。可以用别的值来替换,在双引号后的2
就是要替换的值。占位符的第一个字符都是%
,第二个字符是表示占位符的类型,这里是i
i代表整数,是int的首字母。编译后输出的结果为:Are these 2 paragraphs?
一段输出文本中可以使用很多个占位符。
printf("My name is %s. I'm %i years old", "Joe", 18)
下面是常用占位符 • %a:浮点数。 • %A:浮点数。 • %c:字符。 • %d:十进制整数。 • %e:使用科学计数法的浮点数,指数部分的e为小写。 • %E:使用科学计数法的浮点数,指数部分的E为大写。 • %i:整数,基本等同于%d。 • %f:小数(包含float类型和double类型)。 • %g:6个有效数字的浮点数。整数部分一旦超过6位,就会自动转为科学计数法,指数部分的e为小写。 • %G:等同于%g,唯一的区别是指数部分的E为大写。 • %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 类型。 • %Le:科学计数法表示的 long double 类型浮点数。 • %Lf:long double 类型浮点数。 • %n:已输出的字符串数量。该占位符本身不输出,只将值存储在指定变量之中。 • %o:八进制整数。 • %p:指针。 • %s:字符串。 • %u:无符号整数(unsigned int)。 • %x:十六进制整数。 • %zd:size_t类型。 • %%:输出一个百分号。
输出格式
printf()
可以定制占位符的输出格式
(1)限定宽度
printf
允许限定占位符的最小宽度。
printf("]n", 123); // 输出为 " 123"
在上面的示例中,]
表示这个占位符的宽度最少是5位,如果不满的话,对应的值也就是123
会添加空格补齐。
输出的值默认是右对齐,如果希望改成左对齐,需要在占位符%
的后面家一个-
号。
printf("%-5dn", 123); // 输出为 "123 "
上边的示例中,输出内容123
后边会加两个空格,因为他是左对齐。
如果你输出的是小数的话,这个字符会限制所有数字的最小显示宽度。
// 输出 " 123.450000"
printf("fn", 123.45);
上面示例中,f表示输出的浮点数最少要占据12位。由于小数的默认显示精度是小数点后6位,所以123.45输出结果的头部会添加2个空格。
(2)总是显示正负号
默认情况下,printf()
正数不显示 号,只对负数显示-号。如果想让正数也`
输出 号,可以在占位符的%后面加一个 。
printf("% dn", 12); // 输出 12
printf("% dn", -12); // 输出 -12
上面示例中,% d
可以确保输出的数值总是带有正负号。
(3)限定小数位数
输出小数时,有时希望限定小数的位数。举例来说,希望小数点后面只保留两位,占位符可以写成%.2f
。
// 输出 Number is 0.50
printf("Number is %.2fn", 0.5);
上面示例中,如果希望小数点后面输出3位(0.500
),占位符就要写成%.3f
。
(4)输出部分字符串
%s
占位符用来输出字符串,默认是全部输出。如果只想输出开头的部分,可以用%.[m]s
指定输出的长度,其中[m]
代表一个数字,表示所要输出的长度。
// 输出 hello
printf("%.5sn", "hello world");
上面示例中,占位符%.5s
表示只输出字符串“hello world”的前5个字符,即“hello”。
标准库、头文件
在C程序的编写过程中,有些功能不一定非要自己写,C语言本身已经自带了不少了,我们只要直接调用就好了。比如最常用到的printf()
这个函数就是C语言自带的。
C语言自带的所有这些功能,都统称为“标准库”,因为他们是写入标准的,都是被规定好的。这样保证了代码的规范性和可移植性。
不同的功能定义在不同的文件里,这些文件被叫做“头文件”。如果系统自带某一个功能,就一定还会带描述这个功能的头文件,比如printf()
的头文件就是系统自带的stdio.h
头文件的后缀一般为.h
如果要使用某个功能,就必须要先加载对应的头文件,加载使用的命令是#include
。这就是我们为什么要在使用printf()
之前,必须先要加载stdio.h
的原因了。