第二周 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;

声明两件事:

  1. 在函数中有一个名为num的变量;
  2. int表面num是一个整数(即没有小数点或者没有小数部分的数)。

int是一种关键字,表示一种基本的C语言数据类型,编译器使用这些信息,为num变量在内存中分配存储空间。

分号在C语言中是大部分语句和声明的一部分,不只是分隔符。

num是一个标识符,用来命名变量、函数或其他实体。

声明把特定标识符与计算机内存中特定位置联系起来,同时也确定存储在某位置的信息类型或数据类型。

在C语言中,所有变量都必须先声明才能使用,也就是说必须列出程序中用到的所有变量名及其类型。

数据类型

C语言可以处理多种数据类型的数据,比如整数、字符和浮点数。把变量声明为整数型或者字符型,计算机就能正确的存储、读取和解释数据。

命名

支持:小写字母、大写字母、数字和下划线(_)命名,名称第一个字符必须是字母或下划线,不能是数字。

C语言的名称区分大小写,所以starsSTARS 是两个变量。

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()函数。

函数由函数头和函数体组成。

函数头包括函数名、传入该函数的信息类型和函数的返回类型。

函数体被花括号括起来,由一些列语句、声明组成。

img

2.4 提高程序可读性技巧

  1. 选择有意义的函数名
  2. 写注释
  3. 在函数中用空行分隔概念上的多个部分。
  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()

posted on 2022-11-15 00:54  月亮地下室  阅读(259)  评论(0)    收藏  举报