蚂蚁的C编程.docx

上传人:b****7 文档编号:9795761 上传时间:2023-02-06 格式:DOCX 页数:106 大小:302.27KB
下载 相关 举报
蚂蚁的C编程.docx_第1页
第1页 / 共106页
蚂蚁的C编程.docx_第2页
第2页 / 共106页
蚂蚁的C编程.docx_第3页
第3页 / 共106页
蚂蚁的C编程.docx_第4页
第4页 / 共106页
蚂蚁的C编程.docx_第5页
第5页 / 共106页
点击查看更多>>
下载资源
资源描述

蚂蚁的C编程.docx

《蚂蚁的C编程.docx》由会员分享,可在线阅读,更多相关《蚂蚁的C编程.docx(106页珍藏版)》请在冰豆网上搜索。

蚂蚁的C编程.docx

蚂蚁的C编程

1.C语言简介

1.C语言诞生

   1972年,美国贝尔实验室的DennisRitchie在B语言的基础上创造了C语言。

B语言是美国贝尔实验室的KenThompson于1970年,以BCPL(BasicCombinedProgrammingLanguage基本组合编程语言)为基础设计出来的。

而BCPL是……我的天……离题了……打住打住!

2.为何学C语言

   高效:

用C语言编写的程序编译后生成的可执行文件小巧,而且运行速度很快。

   移植性好:

在某个系统下写的C程序不经修改(或者少量修改),重新编译后就可以运行于别的系统。

   功能强大:

C可以用于编写操作系统,也可以用于编写编译器和解释器。

大多数Unix操作系统都是使用C来编写的。

我们也可以编写C程序解决物理和工程上的问题。

   低级性:

C语言是一种相对“低级”的语言。

这种说法并并没有贬义,而是意味着C语言精练而且接近硬件。

C语言可以像汇编语言一样对位、字节和内存地址进行操作。

3.C编译器

   C语言是高级语言,而计算机只懂机器语言,不懂高级语言,故而我们需要用编译器把C程序编译成机器语言,这样计算机才可以运行我们用C语言编写的程序。

编译器的用法请参考:

4.语言标准

   起初,C语言没有官方标准。

那时《C程序设计语言(第一版)》(BrianKernighan和DennisRitchie于1978年合著)是被广泛接受的标准。

通常称为K&RC或者经典C(classicC)。

书中附录的《C参考手册(CReferenceManual)》作为编写C编译器的指南,虽然定义了C语言,却没有定义C标准函数库(LibraryStandard)。

而C语言依赖于标准函数库,所以需要定义标准函数库。

1983年,美国国家标准协会(ANSI)成立X3J11委员会,致力于建立一个严格的C语言标准。

X3J11建立的标准于1989年被正式采纳。

这个标准(ANSIC89)不但定义了C语言,而且定义了C标准函数库。

1990年,国际标准化组织(ISO)也采纳了这个标准,称为ISOC90。

C89标准和C90标准完全一样。

   1994年,ANSI和ISO合作,成立C9X委员会,致力于修订C标准,并且最终建立了C99标准。

注意:

在后面的教程中,除非特别说明C99特有,否则都是C89和C99的共同标准。

当前支持C99标准的编译器不多。

VC6和TC都不支持;GCC3.2支持。

VC7.1及其更高版本我没用过,不知道支不支持,我猜应该支持吧。

2.第一个C程序

   这篇文章旨在让各位对C有个总体的认识,有看不懂的地方请不必太在意,只要记住就可以了,继续往下学下去就会明白的。

首先请看下面这个简单的C程序,猜猜它会做些什么。

猜不出来也没关系,后面会有详细的解说。

#includeintmain(void)  

  {

     intnum;      /*声明一个名叫num的变量*/

     num=1;      /*将1赋值给num */

  printf("ThisisasimpleCprogram.\n");/*调用printf函数*/

printf("Myfavoritenumberis%dbecauseitisfirst.\n",num);

return0;

  }

     在对这个程序进行详细说明之前,我想先请您用编译器把它编译成可执行文件,并且运行,看看运行结果和您的猜想是否一致。

     下面,我将分两步对这个程序进行详细的讲解。

第一步是概要说明,也就是对程序中每一行代码的含义作简单讲解,以帮助您对这个程序有一个大致的理解。

第二步是详细说明,也就是程序中的每一行代码进行详细的讲解,以加深您的理解。

一、概要说明

#include   <-  把另外一个文件包含进来

    这行代码命令编译器把头文件(.h文件)stdio.h中的内容包含到我们的程序中。

stdio.h是C语言的标准头文件之一,提供对键盘输入和显示输出等的支持。

要使用printf函数,就应该包含这个头文件。

顺带一提,stdio代表standardinput/output,也就是标准输入输出的意思。

intmain(void)   <-  函数头

    C程序由一个或多个函数组成。

我们的这个程序只有一个函数:

main函数。

     圆括号()表明main是一个函数;int表明main函数返回一个整数;void表明main函数不接受任何参数。

在此,请您紧记,intmain(void)ISO/ANSIC标准中定义的main函数定义方法之一。

进行的预处理是:

把特定的头文件包含到我们的源代码里。

 #include的作用是将头文件stdio.h里的内容包含进我们的程序,产生的结果是将stdio.h里的内容一字不漏地插入#include出现的地方,并且删除#include

换句话说,就是用stdio.h里的内容替换#include

这个过程是在预处理阶段完成的。

C语言的这种包含文件的机制为多个程序共享相同信息提供了极大的方便。

stdio.h是C语言标准中定义了的头文件,它包含着输入输出函数的信息。

所有C编译器都应该有这个头文件,这是ANSI/ISOC标准中规定的。

当然,ANSI/ISOC 规定的编译器必须提供的头文件可不止这么一个。

标准还规定了许多别的头文件,那些我们会在以后慢慢学到。

有些程序需要包含stdio.h,而有些不需要。

如果上面这个例子中没有使用printf函数,那就不需要包含stdio.h。

头文件中包含着编译器进行编译时所需的信息。

头文件中可能指明了函数名和函数调用方法,但是这些函数的实现代码并不在头文件中,而是在预先编译好了的库文件里。

链接器负责在库文件中寻找我们的程序所需的代码,并且把那些代码和我们写的

程序进行链接,从而将我的写的程序链接成可执行文件。

一句话,头文件用于指导编译器正确地将我们写的源程序编译成可执行文件。

2.main函数

    在C语言中,main函数是主函数。

每个C程序都必须有且只能有一个main函数(主函数)!

C程序从main函数开始执行,并且在main函数中结束。

int是main函数的返回值类型,它表明main函数应该返回一个整数给程序的调用者(如操作系统)。

如果您想了解更多关于main函数的东西,请点击下面的链接

3.注释:

/*asimpleprogram*/

   /**/之间的内容都是注释。

对程序进行适当的注释可以帮助读者(包括您自己)更快更好地理解您写的代码。

注释可以在源程序中的任何地方书写。

/*和*/之间的任何内容(包括/*和*/)都会被编译器忽略掉。

注意:

/和*必须紧挨在一起,它们之间不能有空格。

                    /*我是注释*/

                    /*我是

                      跨行注释*/

                    /*

                      我也是注释

                    */

以上的注释都是合法的;

4.大括号与函数体

C语言中,所有函数都以大括弧({})作为界定符。

函数体从开大括弧{开始,以闭大括弧}结束。

在后续教程中,我会对函数进行更详细的讲解。

5.intnum;

这个语句声明了变量num。

这一行末尾的分号(;)表明这一行是一个语句。

;是语句的一部分,单独一个;也是一个合法的C语句。

int是C语言中的一个关键字,它代表C语言里的一种基本数据类型:

整型。

关键字是语言的保留字,不能用作其它用途。

例如:

我们不能关键字来做变量名或者函数名。

标识符是指我们为变量或函数等取的名字。

在这个语句中,num就是标识符。

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

C89中,变量的声明必须位于 函数体或者程序块的开端。

6.赋值

num=1;

    赋值是C语言中的一种基本操作。

上面的语句是一个赋值语句,它的含义是:

将1赋值给变量num。

赋值操作完成后,num的值等于1。

7.printf函数

printf("ThisisasimpleCprogram.\n");printf("Myfavoritenumberis%dbecauseitfirst.\n",num);

    这两行代码都调用了printf函数。

printf是一个标准C函数,也就是说,它是C语言标准函数库里定义了的函数。

圆括号()表明printf是一个函数,圆括号里的内容会被传递给printf函数。

例如,上面第一行代码把“ThisisasimpleCprogram.\n”(不包括双引号)传递给printf函数,然后由printf函数把这些信息显示于显示器。

\n是换行符,它提示printf开始新的一行。

正因为\n是换行符,所以\n不会显示出来,而是进行了换行。

如果上面的语句中没有\n,那就不会换行。

上面代码第二行中的%d告诉printf用num的值替换掉%d,并且以整数形式显示num的值。

%d被称为占位符,它告诉printf应该在什么地方显示num的值。

%用于提醒printf在此处显示一个变量的值(本例中是num的值);d告诉printf以十进制整数的形式显示num的值。

8.return(返回)语句return0;

    这个return语句是我们程序中的最后一个语句。

intmain(void)中的int表示main函数应该返回一个整数,所以我们要使用return语句来返回一个整数。

3.C程序的结构

 C程序由一个以上的函数组成,而且必须有main函数。

此外,C程序一般还有一些预处理指令。

例如#include指令。

当然并不是必须要有#include指令。

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

函数头由返回值、函数名以及参数列表(可以是void)组成。

函数体从{开始,以}结束。

函数体里可以有一系列的语句,每个语句以分号(;)结束。

例如:

  预处理指令     ——〉  #include

函数头         ——〉 intmain(void)

  函数体开始     ——〉  {

  变量声明语句  ——〉      inti;

  赋值语句       ——〉     i=1;

  函数调用语句   ——〉      printf("%d\n",i);

   return语句     ——〉     return0;

   函数体结束      ——〉  }

简而言之,一个简单的标准C结构如下:

#include/*非必须。

若没用到stdio.h里声明的函数,则不需要*/

   intmain(void)

      {

          一系列语句

          return0;

      }

4.第二个C程序

   首先请看以下代码,并且和我们的第一个C程序比较比较,看看这个程序新增了什么知识点。

/*meter2centimeters.c-以厘米为单位来表示两米*/

#include

intmain(void)

  {

      intmeters,centimeters;

      meters=2;

centimeters=100*meters; /*100乘以meters*/

      printf("%d-meterisequalto%dcentimeters.\n",meters,centimeters);

     printf("Yes,Isaid%dcentimeters!

\n",100*meters);

     return0;

   }

下面我们来仔细分析这个小程序。

1.文档

    这段代码头部的注释标明了文件名和程序的作用,我们把这些注释称为文档。

写文档是一个很好的习惯,可以帮助我们了解程序的作用。

在由多个源文件组成的程序中,文档显得更为重要。

由于我们目前为止所写的都是很简单的程序,您也许还不觉得写文档有多大的作用,甚至还觉得浪费时间。

但是我们应该养成写文档的习惯,这对我们以后写复杂的程序很有帮助。

对于复杂程序,我们应该尽可能把文档写得更详尽。

2.多重声明

   intmeters,centimeters;

    上面那句声明语句声明了两个变量。

我们可以在一句声明语句中声明任意数目的变量,只要变量名之间用逗号(,)隔开就可以了。

例如下面这个语句声明了4个变量。

  inta,b,c,d;

3.乘法运算

    C语言中,*是乘法运算符,所以centimeters=100*meters;的意思是:

用100乘以变量meters的值(本例中为2),然后把相乘的结果赋值给变量centimeters。

4.printf函数

      printf("%d-meterisequalto%dcentimeters.\n",meters,centimeters);

    上面这个语句中占位符%d出现了两次。

第一个%d由变量meters的值替换;而第二个%d则由centimeters的值替换。

注意:

每个变量由逗号(,)隔开;"%d-meterisequalto%dcentimeters.\n"中的双引号是必须的,而且必须是英文的双引号,不能是中文的双引号。

  printf("Yes,Isaid%dcentimeters!

\n",100*meters);

    上面这个语句表明,用于替换占位符的不仅仅可以是变量,也可以是表达式(100*meters是一个乘法表达式)。

 

5.如何编写函数

  首先请看以下代码。

 /*my_func.c--这个程序使用了一个自定义函数*/

  #include

voidbutler(void);     /*ISO/ANSIC函数原型*/

intmain(void)/*函数头*/

      {/*函数体开始*/

       printf("Iwillsummonthebutlerfunction.\n");

        butler(); /*调用butler函数*/

         printf("Yes.BringmesometeaandwriteableCD-ROMS.\n");

         return0;

       }/*函数体结束*/

        voidbutler(void)  /*butler函数*/

        {

          printf("Yourang,sir?

\n");

        }

    上面的代码中,butler出现了3次。

第一次是作为函数原型;第二次是函数调用语句;第三次是函数定义。

下面我们分别对butler的这三次出现作详细说明。

1.函数原型是声明函数的一种方式,是C89标准加入的概念,老旧的编译器可能不支持函数原型。

函数原型用于告诉编译器我们将要使用的函数的属性。

例如,butler的函数原型中,第一个void指明butler函数没有返回值;第二个void表明butler没有参数,也就是不接收任何参数。

在main函数前面写了butler的函数原型后,当main函数调用butler时,编译器就能检测到butler函数调用语句是否正确。

正如变量要声明后才能使用一样,函数也要声明后才能调用。

本例中,如果main函数前面没有butler的函数原型,那么我们就不能在main函数中调用butler函数,除非我们把函数定义放在main函数之前。

不过把函数定义置于main函数之前是一种不好的编程风格,因为这将导致我们花不少时间来寻找main函数的所在地。

想象一下,如果我们写了几十个函数,如果每个函数定义都   置于main函数之前,那样main函数还算好找;但是如果我们不小心把某些函数放在了main函数后面,也就是说main函数被放在一堆函数中间,那就很难找了!

    C89标准出台之前,C语言也支持函数声明,不过我们只能指定函数的返回值类型,而不能列出参数列表。

例如:

           voidbutler();

C89之前,函数就是像上面所写的那样声明的。

C89和C99标准都支持这种声明方式,不过它们同时也指出,这种声明方式迟早会被淘汰!

所以我们不要使用这种声明方式,而要用函数原型。

   2.在main函数里,语句butler();的作用是调用butler函数。

因为butler的参数列表为空(void),所以函数名(butler)后面的括号中不能有任何参数,也不能是butler(void);。

   3.butler函数和main函数的定义方式一样,也是由函数头和函数体构成。

注意,函数定义仅仅是一个定义而已,并不能决定函数什么时候执行,也不能决定函数是否执行。

本例中,main函数什么时候调用butler函数,butler函数就什么时候执行;如果main函数没有调用butler函数,那么butler函数就不会执行。

    所有C程序都是从main函数开始执行的。

无论main函数处在源文件中的任何位置,中间也罢,末尾也罢,总之,C程序一定从main函数开始执行。

把main函数放在其它函数定义之前是一个好的编程习惯,因为这样可以让读者很快地弄清楚程序的结构。

   到目前为止,我们已经对函数有了一个概要的了解。

在后续的教程中,我们还会更详细更系统地学习函数。

6.关键字和保留标识符

关键字是保留字,不能用来做标识符(如变量名),例如:

intdouble;是错误的,因为double是关键字,不能做变量名。

使用关键字来做变量名是一种语法错误,不能通过编译!

下表列出了C语言的所有关键字,其中红色的是ISOC99标准新增的关键字。

       auto        enum       restrict     unsigned 

       break       extern     return         void 

        case        float      short          volatile

        char         for        signed         while 

        const       goto       sizeof         _Bool

7.第三个C程序

首先请看下面这个小程序,试着自己编译运行一下。

如果不懂怎么编译,请点击下面的超链接:

      

   Dev-C++安装&使用教程

     /*circle.c -- 计算圆的面积*/

     #include

     intmain(void)

     {

         floatradius;   /*圆的半径*/

         printf("Pleaseentertheradius:

");

         /*获取用户输入*/

         scanf("%f",&radius);

         /*圆面积计算公式:

圆周率*半径的平方*/

         printf("Theareaofthecircleis:

%.3f\n",3.14*radius*radius);

    

         printf("PressENTERtoquit...");

         getchar();

         getchar();    

         return0;

     }

    “entertheradius”的意思是:

输入圆的半径,然后按回车(Enter)。

这个程序要求我们输入数字,例如:

15、31.6。

不要输入字母,例如:

abc、t156。

输入字母将导致程序出错!

以后我们会学如何处理这种错误,不过现在还是老老实实地输入数字吧!

当然,您也可以试着输入字母,看看到底会发生什么事情。

    下面我们来仔细讲解这个程序的知识点。

    1.程序的第7行,我们使用float声明了一个名为radius的变量。

float代表的数据类型是浮点型,也就是小数。

在以往的程序中,我们都是使用int来声明变量。

int代表整型,也就是整数。

用int声明的变量只能存储整数;而用float声明的变量可以存储小数。

    2.为了接受用户输入,我们需要使用scanf函数。

和printf一样,scanf也是标准库里定义的函数,我们称这样的函数为标准函数。

和printf一样,scanf的函数原型也位于标准头文件stdio.h里。

占位符%f的作用是命令scanf函数读取浮点数;&radius告诉scanf用读取到的浮点数给变量radius赋值。

其中&必不可少,否则程序将会出错。

&在这里是取址运算符,用于获取变量radius的内存地址,从而告诉scanf将读取到的浮点数存储到那个地址所指示的内存空间,也就达到了给radius赋值的目的。

如果您看不懂上面这些内容,没什么关系,真的,只要您可以记住就好了。

以后,我们将更深入地学习这些知识。

    3.radius是浮点型变量,3.14默认是双精度浮点型(double)恒量,所以表达式3.14*radius

*radius的结果是一个双精度浮点数。

这里看不懂也没关系,以后我们会详细学习。

    4.要显示浮点型数据,我们需要使用占位符%f。

%d是用于显示整数的,如果我们将第二个printf中的%.3f换成%d,那么输出会不正常。

.3的作用是告诉printf只输出小数点后3位。

我们也可以改成.2或者.0

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1