第二周 C语言概述
2.1 简单C程序示例
#include <stdio.h>
int main(void) /* 一个简单的C程序 */
{
int num; /* 定义一个名为num的变量 */
num = 1; /* 为num赋一个值 */
printf("I am a simple "); /* 使用printf()函数 */
printf("computer.\n");
printf("My favorite number is %d because it is first.\n",num);
return 0;
}
输出结果:
I am a simple computer.
My favorite number is 1 because it is first.
2.2 示例解释
2.2.1 快速概要
#include <stdio.h> /* 把stdio.h的文件包含在程序当中 */
stdio.h 是C编译器软件包的标准部分。提供键盘的输入函数和屏幕的显示输出函数。
int main(void) /* 函数名 */
C程序包含一个或者多个函数,它们是C函数的基本模块。
圆括号表示 main() 是一个函数名,int 表示此函数类型为整型,运算结束将返回一个整数。
void 表示函数不带任何参数。
/* 一个简单的C程序 */
注释,对该行代码进行解释说明,主要提高程序的可读性。
{ /* 函数体开始 */
...
} /* 函数体结束 */
左花括号定义函数体开始,右花括号定义函数体结束。
int num; /* 声明 */
该声明表示,将使用一个名为num的变量,并且该变量(num)类型为整型(int)。
num = 1;
语句 num = 1;把值1赋给名为num的变量。
printf("I am a simple "); /* 调用printf()函数 */
在程序中使用函数叫做调用函数。
printf()函数,将括号里引号中的内容打印到屏幕上,光标停在同一行。
printf("computer.\n"); /* 调用另一个函数 */
程序调用 printf("computer.\n");函数,输出结果将接在上一条语句 “ I am a simple ” 后面。
\n 表示另起一行,光标移动至下一行。
printf("My favorite number is %d because it is first.\n", num);
%d:占位符,告诉计算机以何种形式输出num的值,打印在何处。
调用printf()函数,将num的值代入至%d处,并将引号中的内容,完整打印到屏幕上,另起一行,光标移至第二行。
return 0; ←return语句
函数运行成功,给调用方返回一个 0 。
} /* 右花括号表示程序结束 */
此时程序运算结束。
2.2.2 程序细节
1. #include 指令和头文件
#include<stdio.h> //头文件(headder)
作用:相当于把stdio.h中的内容都输入到该行。
这行代码也称为C预处理指令。
所有的C编译器软件包都提供stdio.h文件内容,例如printf()。
该文件名的含义为标准的输入/输出头文件。
头文件可以定义一些常量,或是一些函数,以及如何使用它们,但是函数的实际代码在一个预编译代码的库文件中。
头文件帮助编译器把程序正确的组合在一起。
2. main() 函数
int main(void) //名为main的函数
C程序一定从main()函数开始执行。
通常,函数名后面的括号中包含一些传入函数的信息。该例中没有传递任何信息,所以用英文单词void。
3. 注释
/* 1.一个简单的程序 */
/* 2.一个简单
的程序 */
/*
3.一个简单的程序
*/
// 4.单行注释,C99新增这种风格注释。
C程序中,被/**/两个符号括起来的部分是程序的注释,会在程序的运行过程中,被编译器忽略,主要方便阅读者理解代码。
C程序中,可以将注释放在任何地方。
4. 花括号、函数体和块
{
...
}
C函数规定使用花括号标记函数体的开始和结束。
花括号还可以用于把函数中的多条语句合并为一个单元或块。
5. 声明
int num;
声明两件事:
- 在函数中有一个名为
num的变量; - int表面
num是一个整数(即没有小数点或者没有小数部分的数)。
int是一种关键字,表示一种基本的C语言数据类型,编译器使用这些信息,为num变量在内存中分配存储空间。
分号在C语言中是大部分语句和声明的一部分,不只是分隔符。
num是一个标识符,用来命名变量、函数或其他实体。
声明把特定标识符与计算机内存中特定位置联系起来,同时也确定存储在某位置的信息类型或数据类型。
在C语言中,所有变量都必须先声明才能使用,也就是说必须列出程序中用到的所有变量名及其类型。
数据类型
C语言可以处理多种数据类型的数据,比如整数、字符和浮点数。把变量声明为整数型或者字符型,计算机就能正确的存储、读取和解释数据。
命名
支持:小写字母、大写字母、数字和下划线(_)命名,名称第一个字符必须是字母或下划线,不能是数字。
C语言的名称区分大小写,所以stars 和 STARS 是两个变量。
6. 赋值
num = 1;//赋值表达式语句。
C语言是通过赋值运算符而不是赋值语句完成赋值操作。
在执行int num;声明时,编译器在计算机内存中为num变量预留了空间,然后在执行num = 1;时,把值存储在之前预留的位置。
7. printf() 函数
printf("I am a simple "); //只需输入函数名,把所需的参数填入圆括号即可。
//程序运行到这里时,控制权被转给printf()函数,函数执行结束后,控制权返回至主调函数。
printf("computer.\n"); // \n - 换行符,相当于按下Enter键
/*
\t - Tab键
\b - Backspace退格键
*/
printf("My favorite number is %d because it is first.\n",num); // %d:占位符,指明num输出的位置
/*
%:提醒程序要在该处打印一个变量
d:表面把变量作为十进制整数打印
printf中的f:提醒用户,这是一种格式化打印函数
*/
圆括号中的内容时从main()函数传递给printf()函数的信息。该信息被称为参数,更准确应该是实际参数。
在C语言中,实际参数(简称实参)是传递给函数的特定值,形式参数(简称形参)是函数中用于存储的变量。
printf()函数作用:会查看双引号中的内容,并将其打印在屏幕上。
8. return 语句
return 0; //返回一个整数0
int main(void)函数要求main()函数应该返回一个整数。
有返回值的C函数要有返回语句,如果遗漏return语句,程序在运行至(})会返回一个0.
2.3 简单程序结构
程序由一个或多个函数组成,必须要有main()函数。
函数由函数头和函数体组成。
函数头包括函数名、传入该函数的信息类型和函数的返回类型。
函数体被花括号括起来,由一些列语句、声明组成。
2.4 提高程序可读性技巧
- 选择有意义的函数名
- 写注释
- 在函数中用空行分隔概念上的多个部分。
- 每条语句各占一行。
2.5 进一步使用C
程序清单2.2 fathm_ft.c程序
// fathm_ft.c -- 把2英寻转换成英尺 ①
#include <stdio.h> //头文件
int main(void) //名为main的函数
{
int feet, fathoms; //声明两个整型变量feet,fathoms ②
fathoms = 2; //赋值语句,将2赋值给fathoms的内存空间
feet = 6 * fathoms; //查找变量fathoms的值,用6乘以该值,将表达式的结果赋值给变量feet的内存空间③
printf("There are %d feet in %d fathoms!\n", feet, fathoms); //将引号中的内容打印至屏幕④
printf("Yes, I said %d feet!\n", 6 * fathoms);
return 0;
}
①使用单行注释,给出文件名和程序的目的。
②程序在一条声明中,声明了两个变量,变量名中间用逗号隔开。
int feet, fathoms;
和
int feet;
int fathoms;
等价。
③程序进行了乘法运算,* 表示乘。
④程序以新的方式使用printf()函数。如果编译并运行该程序,输出应该是这样:
There are 12 feet in 2 fathoms!
Yes, I said 12 feet!
第一个print()函数将双引号外第一个变量feet替换了双引号中第一个%d;将双引号外第二个变量fathoms替换了双引号中的第二个%d。
第二个print()函数将双引号外的表达式6 * fathoms 替换了双引号中第一个%d。
2.6 多个函数
程序清单2.3 two_func.c程序
/* two_func.c -- 一个文件中包含两个函数 */
#include <stdio.h> //头文件
void butler(void); /* ANSI/ISO C函数原型 */ //①指明函数的属性,void表明bulter函数没有返回值
int main(void)
{
printf("I will summon the butler function.\n");
butler(); //②通常,被调函数会向主调函数返回一个值,但是butler()函数没有
printf("Yes. Bring me some tea and writeable DVDs.\n");
return 0;
}
void butler(void) /* 函数定义开始 */ //③void表明bulter函数不带参数,“空的”
{
printf("You rang, sir?\n");
}
该程序的输出如下:
I will summon the butler function.
You rang, sir?
Yes. Bring me some tea and writeable DVDs.
①butler()函数在程序中第一次出现:告知编译器在程序中要使用该函数。函数原型
函数原型是一种声明形式,告知编译器正在使用某函数,所以也被称为函数声明。
②butler()函数在程序中第二次出现:以函数调用的形式出现在main()中。
③butler()函数在程序中第三次出现:出现在函数定义中,即函数本身源代码。
注意
何时执行butler()函数取决于它在main()中被调用的位置,而不是butler()的定义在文件中的位置。
2.7 调试函数
程序的错误通常叫作bug,找出并修正错误的过程叫作调试(debug)。
2.7.1 语法错误
C语言的语法错误指的是,把有效的C符号放在错误的地方。例如,看看这个句子:Bugs frustrate be can[6]。
该句子中的英文单词都是有效的单词(即,拼写正确),但是并未按照正确的顺序组织句子,而且用词也不妥。
2.7.2 语义错误
语义错误是指意思上的错误。例如,考虑这个句子:Scornful derivatives sing greenly(轻蔑的衍生物不熟练地唱歌)。
句中的形容词、名词、动词和副词都在正确的位置上,所以语法正确。但是,却让人不知所云。
在C语言中,如果遵循了C规则,但是结果不正确,那就是犯了语义错误。
2.7.3 程序状态
通过逐步跟踪程序的执行步骤,并记录每个变量,便可监视程序的状态。
程序状态(program state)是在程序的执行过程中,某给定点上所有变量值的集合。它是计算机当前状态的一个快照。
2.8 关键字和保留标识符
关键字是C语言的词汇。它们对C而言比较特殊,不能用它们作为标识符(如,变量名)。
表2.2 ISO C关键字
auto |
extern |
short |
while |
|---|---|---|---|
break |
float |
signed |
_Alignas |
case |
for |
sizeof |
_Alignof |
char |
goto |
static |
_Atomic |
const |
if |
struct |
_Bool |
continue |
inline |
switch |
_Complex |
default |
int |
typedef |
_Generic |
do |
long |
union |
_Imaginary |
double |
register |
unsigned |
_Noreturn |
else |
restrict |
void |
_Static_assert |
enum |
return |
volatile |
_Thread_local |
如果使用关键字不当(如,用关键字作为变量名),编译器会将其视为语法错误。
还有一些保留标识符(reserved identifier),C语言已经指定了它们的用途或保留它们的使用权,如果你使用这些标识符来表示其他意思会导致一些问题。因此,尽管它们也是有效的名称,不会引起语法错误,也不能随便使用。
保留标识符包括那些以下划线字符开头的标识符和标准库函数名,如printf()。
浙公网安备 33010602011771号