第2章:C语言概述.png

简单的C程序实例

#include <stdio.h>
int main(void)								//一个简单的C程序
{
  int num=1;								//定义一个名为num的变量,并赋值为1
  printf("I am a simple computer.\n");		//	使用printf函数
  printf("My favourite number is %d because it is first.\n",num);
  return 0;
}

输出结果应为:

I am a simple computer.

My favourite number is 1 because it is first.

程序调整: 程序的输出是否在屏幕上一闪而过?某些窗口环境会在单独的窗口运行程序,然后在程序运行结束后自动关闭窗口。如果遇到这种情况可以在程序中添加额外的代码,让窗口等待用户按下一个键后再关闭。一种方法是,在程序的 return 语句前添加一行代码:

getchar();

这行代码会让程序等待击键,窗口会在用户按下一个键后才关闭(后面章节会介绍)
C语言中的六种语句:

  1. 标号语句
  2. 复合语句
  3. 表达式语句
  4. 选择语句
  5. 迭代语句
  6. 跳转语句

C语言中大部分语句都是以分号结尾

简述程序每行代码的作用

#include <stdio.h> ←包含另一个文件

该行告诉编译器把 stdio.h 中的内容包含在当前程序中。

#include 这行代码是一条C预处理器指令。通常,C编译器在编译前会对源代码做一些准备工作,即预处理。

stdio.h 是C编译器软件包的标准部分,它提供键盘输入和屏幕输出的支持该文件名的含义是标准输入/输出头文件。

通常在C程序顶部的信息集合被称为头文件,在大多数情况下头文件包含了编译器创建最终可执行程序要用到的信息。

#include<stdio.h> 的作用相当于把stdio.h文件中的所有内容都输入该行所在的位置。

int main(void) ←函数名

C程序包含一个或多个函数,它们是C程序的基本模块。圆括号()表明 main() 是一个函数名。int 表明 main() 函数返回一个整数。通常,函数名后面的圆括号中包含一些传入函数的信息,void 表明 main() 不带有任何参数。

C程序一定从main()函数开始执行(目前不考虑特殊情况)。

只需要记住int和void是标准 ANSI C 定义 main() 的一部分(如果使用 ANSI C 之前的编译器,请忽略 void;考虑到兼容问题,请尽量使用较新的C编译器)。

//一个简单的C程序 ←单行注释

/*一个简单的C程序*/ ←可跨行注释(多行注释)位于/*和*/之间的所有内容都属于注释区间

注释只是为了帮助读者理解程序,提高程序的可读性,编译器会忽略它们。

{ ←函数体开始

​ …… ←函数体内容

} ←函数体结束

花括号都是成对存在的,为了美观和方便阅读,上下最好对齐。

花括号还能用于把函数中的多条语句合并为一个单元或块。

int num=1; ←声明、赋值

声明表示,将使用一个名为num的变量,而且num是int(整数)类型,并将1赋值给num。

num 是一个标识符,也就是一个变量、函数或其他实体的名称。

int 是C语言的一个关键字,表示一种基本的C语言数据类型,关键字是语言定义的单词,不能做其他用途。

下面列举一些常见的关键字(不需要死记硬背,以后用着用着就熟悉了) C关键字.jpg

在C语言中,所有变量都必须先声明再使用

给变量命名时要使用有意义的变量名或标识符,如果变量名无法清楚地表达自身的用途,可在注释中进一步说明。

变量可以用小写字母、大写字母、数字和下划线(_)来命名,而且名称的第一个字符必须是字母或者下划线,不能是数字。

C语言的名称区分大小写。

变量声明的四个理由:

  1. 把所有变量放在一起,方便读者查找和理解程序用途
  2. 变量声明会促进编写程序前做一些计划
  3. 变量声明有助于发现隐藏在程序中的小错误,比如变量名拼写错误
  4. 如果事先未声明变量,C程序将无法通过编译

printf("I am a simple computer.\n"); ←调用一个函数

该语句使用 printf() 函数,在屏幕上显示: I am a simple computer. 光标停在同一行。

printf() 是标准C库函数。在程序中使用函数叫做调用函数。

实际参数(实参):传递给函数的特定值。

形式参数(形参):函数中用于存储值的变量。

printf("My favourite number is %d because it is first.\n",num); ←调用函数

调用 printf() 函数把 num 的值(1)内嵌在用双引号括起来的内容中一并打印。

%d 相当于是一个占位符,告诉计算机以整形形式输出num的值,并打印在%d所在的位置。

代码 \n(换行符) 告诉计算机另起一行,即把光标移至下一行(与回车功能相同)。

return 0; ←return语句

C函数可以给调用方提供(或返回)一个数。目前,可暂时把该行看做是结束 main() 函数的要求。

返回值为0时,可以省略不写。

程序由一个或多个函数组成,必须有main()函数。函数由函数头和函数体组成。函数头包括函数名、传入该函数的信息类型和函数的返回类型。函数体被花括号括起来,由一系列语句、声明组成。

提高程序可读性的技巧

  1. 选择有意义的函数名
  2. 写注释
  3. 在函数中用空行分隔概念上的多个部分
  4. 每条语句占一行


多条声明:

程序可在一条声明中声明多个变量,为此,在声明中需要用逗号(英文)隔开这些变量,例如

int feet, num, sum;

int feet;

int num;

int sum;

等价
打印多个值:

int a=1,b=2;

printf("%d对%d说:‘我俩加起来就等于%d了’!\n",a,b,a+b);

输出结果:1对2说:‘我俩加起来就等于3了’!


多个函数:

到目前为止都只使用了printf()函数,下面演示出了main()函数以外,如何把自己的函数加入到程序中

//一个文件包含两个函数
#include<stdio.h>
void butler(void);				// ANCI/ISO C函数原型
int main()
{
  printf("I will summon the butler function.\n");
  butler();
  printf("Yes.Bring me some tea and writeable DVDs.\n");
  
  return 0; 
}
void butler(void)				//  函数定义开始
{
  printf("You rang,sir?\n");
}

输出结果:

I will summon the butler function.

You rang,sir?

Yes.Bring me some tea and writeable DVDs.

butler()函数在程序中出现了3次,第1次是函数原型,告知编译器在程序中要使用该函数;第2次同一函数调用的形式出现在main()中;最后一次出现在函数定义中,函数定义即是函数本身的源代码。

函数原型是一种声明形式,告知编译器正在使用某函数,因此函数原型也被称为函数声明。函数声明还指明了函数的属性。例如butler()函数原型中的第一个void表明butler()函数没有返回值。第二个void的意思是butler()函数不带参数。

早期的C语言支持一种更简单的函数声明,只需指定返回类型,不用描述参数:void butler();

注意:何时执行butler()函数取决于它在 main() 中被调用的位置,而不是butler()的定义位置。
语法错误是指程序设计中的语句不符合C语言的语法规范而引起的错误,语法错误是不符合语法规范的,因此编译器能够进行语法检查,识别大部分语法错误。
语义错误也称为逻辑错误,主要是指程序设计中的语句在语法上正确,但是在功能和逻辑含义的表达上存在错误,从而引起程序的功能或者结果出现错误。
语法错误易找,语义错误难辨。

编程练习

问:编写一个程序把你的年龄转换成天数,并显示这两个值,这里不考虑闰年问题

//以18岁为例
#include<stdio.h>
int main()
{
  int age=18,days;
  days=age*365;
  printf("我今年%d岁,我降临到这个世界已经过了%d天.",age,days);
  return 0;
}

问:在C语言中,函数可以调用另一个函数。编写一个程序,调用一个名为 one_three() 的函数。该函数在一行打印单词 "one“ ,再调用第2个函数 two() ,然后在另一行打印单词 ”three“ ,two() 函数在一行显示单词 "two" 。main()函数在调用 one_three() 函数前要打印短语 ”starting now:“ ,并在调用完毕后显示短语 "done!" 。因此,该程序的输出应如下所示:

starting now:

one

two

three

done!

#include<stdio.h>
void one_three(void);
void two(void);
int main()
{
  printf("starting now:\n");
  one_three();
  printf("done!\n"); 
  return 0;
} 
void one_three(void)
{
  printf("one\n");
  two();
  printf("three\n");
}
void two(void)
{
  printf("two\n");
}