文章目录
一、C程序结构
//一个简单的例子
#include<stdio.h>
//函数原型
void butler(void);
int main(void){
int num;
num = 1;
printf("I am a simple ");
printf("computer.\n");
printf("My favourite number is %d because it is first.\n", num);
butler();
return 0;
}
void butler(void){
printf("This is a function.")
}
以上为一个简单的C程序,包含了一个一般C程序具备的结构,下文将从这些结构展开
1. #include指令和头文件
- 程序第一行,#include<stdio.h>相当于把stdio.h文件中的所有内容都输入该行所在的位置
- #include这条代码为一条预处理机指令,其中的符号#表明C预处理机在编译器接手之前处理这条指令,常见的还有#define
2. 函数原型
函数名的出现有三种含义,即函数原型、函数调用、函数定义。
C90标准新增了函数原型,函数原型是一种声明形式,告知编译器正在使用某函数,因此函数原型也被称为函数声明
- C的惯例是把main()函数放在开头,后面再写各函数的定义,因为它提供了程序的基本框架
- C标准建议,要为程序中使用到的所有函数提供函数原型
- 标准include文件为标准库函数提供了函数原型,例如在C标准中,stdio.h文件包含了printf()的函数原型
3. main()函数
- int是main()函数的返回类型,这表明main()函数的返回的值是整数,返回给操作系统
- 上述代码中main()方法写为int main(void),常见的其他写法如下
//写法1
//C90标准勉强接受这种写法,但是C99和C11标准不允许这样写,不建议
main()
//写法2
//一些编译器允许这样写,但是所有的标准都未认可这种写法,而且许多编译器都不能这样写,不建议
void main()
4. 花括号、函数体和块
- 花括号可用于把函数中的多条语句合并为一个块或一个单元
- 花括号在C语言中的作用类似于某些语言中的begin和end
5. 声明和标识符
- 声明把特定标识符与计算机内存中的特定位置联系起来,同时也确定了存储在某位置的信息类型和数据类型
- 把声明都置于块的顶部,好处是把声明都放在一起更容易理解程序的用途
- 对标识符名,编译器只识别前63个字符;对于外部标识符,只允许使用31个字符。编译器会忽略超出的字符
- 操作系统和C库经常使用以一个或两个下划线字符开头的标识符
6. printf()函数
- printf()函数名中的f提醒用户,这是一种格式化的打印函数
- 换行符是一种转义序列,转义序列用来代表难以表示或者无法输入的字符,例如\t代表Tab键、\b代表Backspace键
7. return语句
- 有返回值的C函数要有return语句
- 如果遗漏main()函数中的return语句,程序在运行至最外面的右花括号 } 时会返回0
二、调试(debug)程序
运行程序,编译器报错时注意:
- 实际上,有时不用把编译器报告的所有错误逐一修正,仅修正第1条或前几条报错,错误信息就会少很多
- 报错的位置比真实的错误位置滞后一行
章节练习
//练习4
#include<stdio.h>
void jolly(void);
void deny(void);
int main(void){
jolly();
jolly();
jolly();
deny();
}
void jolly(void){
printf("For he's a jolly good fellow!\n");
}
void deny(void){
printf("Which nobody can deny!\n");
}
//练习5
#include<stdio.h>
void br(void);
void ic(void);
int main(void){
br();
printf(", ");
ic();
printf("\n");
ic();
printf("\n");
br();
}
void br(void){
printf("Brazil, Russia");
}
void ic(void){
printf("India, China");
}
//练习8
#include<stdio.h>
void one_three(void);
void two(void);
int main(void){
printf("starting now:\n");
one_three();
printf("done!\n");
}
void one_three(void){
printf("one\n");
two();
printf("three\n");
}
void two(void){
printf("two\n");
}