第一个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;
}

我们以每一行代码为出发点,深入探讨隐藏在代码背后的细节,

以便为更全面地了解C语言编程特性打下基础。

  一、#include指示和头文件

  #include<stdio.h>

  这是程序的第一行。该语句的作用相当于您在文件中该行所在的位置键入了文件stdio.h的完整内容。实际上,它是一种剪切和粘贴操作,这样可以方便地在多个程序间共享公用的信息。
  #include语句是C预处理器指令(preprocessor directive)的一个例子。通常,C编译器在编译前要对源代码做一些准备工作;这称为预处理(preprocessing)。
  stdio.h文件作为所有C编译包的一部分提供,它包含了有关输入和输出函数(例如printf())的信息以供编译器使用。这个名字代表标准输入输出头文件(standard input/output header)。在C世界中,人们称出现在文件顶部的信息集合为头(header),C实现通常都带有许多头文件。
  最重要的是头文件包括了建立最终的可执行程序时编译器需要用到的信息。例如,它们可以定义常量,或者说明函数名以及该函数如何使用。但是函数的实际代码被包含在一个预编译代码的库文件中,而不是在头文件中。编译器的链接部分负责找到您所需要的库代码。简言之,头文件指引编译器把您的程序正确地组合在一起。
  ISO/ANSI C已经对必须提供哪些头文件制定了标准。有些程序需要包含stdio.h而有些则不需要。一个具体C实现的文档应该包括对C函数库中函数的描述。这些描述指出了函数所需的头文件。例如,对printf()的描述指明需要使用stdio.h。不包括合适的头文件也许不会影响一个具体的程序,但是最好不要这么做。本书每次用到库函数时,都使用ISO/ANSI标准为这些函数指定的包含文件。

 二、main()函数

  int main(void)

  接下来的这行代码声明了一个main函数。的确,main是一个极其普通的名字,但它是惟一的选择。一个C程序(我们将不考虑一些例外的情况)总是从被称为main()的函数开始执行的。您可以对您所用的其他函数任意命名,但是main()必须是开始的函数。那么圆括号的功能呢?它们表明main()是一个函数。很快您将学到更多的函数。但现在,就请记住这个函数是C程序的基本模块。
  int指明了main()函数的返回类型。这意味着main()函数返回值的类型是整数。返回到哪里呢?返回给操作系统。我们将在第6章“C控制语句:循环”中再来讨论这个问题。
  函数名后面的圆括号一般包含传递给函数的信息。这个简单的例子没有传递任何信息,因此圆括号内包含了单词void(在第11章“字符串和字符串函数”中,将介绍可以将信息从操作系统传递给main()函数的第二种形式)。
  如果浏览老版本的C代码,您将发现程序常常以:

  main()

  这种形式开始。C90标准勉强允许这种形式,但是C99标准不允许。因此即使您当前的编译器允许,也不要这么做。
  您还将看到另一种形式:

  void main()

  有些编译器允许这种形式,但是还没有任何标准考虑接受它。因而,编译器不必接受这种形式,并且许多编译器也不这样做。再者说,如果坚持使用标准形式,那么当您把程序从一个编译器移到另一个编译器时也不会有问题。

  三、注释

  /*一个简单的C程序*/

  包含在/*/之间的部分是程序注释。使用注释的目的是使人们(包括您自己)更容易理解您的程序。C语言的注释的一个好处就是可以被放在任意的地方,甚至是和它要解释的语句在同一行。一个较长的注释可以单放一行,或者是多行。在/和*/之间的所有内容都会被编译器忽略掉。下面是一些正确和不正确的注释形式:

  /*这是有效的C注释。*/
  /*将注释分成两行写,
也是可以的。*/
/*
也可以这样写。
*/
   /*但这是无效的注释,因为没有结束标记。

  C99增加了另一种风格的注释,它被普遍用在C++和Java里。这种新形式使用//符号,但这种注释被限制在一行里:

  //这种注释必须被限制在一行内。
  int rigue;//这种注释也可以写在此处。

  因为一行的结尾就标志着注释的结束,所以这种形式只在注释的开始处需要注释标志符号。这种更新的形式是针对老形式存在的问题提出的。假设您有下列代码:
  

  /*
  希望有效。
   */
  x=100;
  y=200;
  /*下面是其他内容。*/

  下面假设您决定删除第四行,结果不小心也删掉了第三行(*/)。代码将变成下面的样子:

  /*
  希望有效。
  y=200;
  /*下面是其他内容。*/

  现在编译器把第一行的/和第四行的/组合起来,使整个四行都变成一个注释,包括应作为代码的那一行。因为//形式只能在一行起作用,所以不会发生这种导致代码消失的问题。
  某些编译器可能不支持C99的这一特性。还有的编译器可能需要更改设置,以支持C99的这一特性。
  考虑到死板地保持一致性可能会产生令人乏味的效果,本书中使用了两种注释形式。
四、花括号,程序体和代码块

  {   
…
  }

花括号划定了main函数的界线。通常,所有的C函数都使用花括号来表示函数体的开始与结束。它们的存在是必不可少的,因此不能丢掉它们。仅有花括号{}能起到这种作用,小括号()和中括号[]都不行。
  花括号还可以用来把函数中的语句聚集到一个单元或代码块中。如果您熟悉Pascal、ADA、Modula-2,或者是Algol,您将清楚花括号在那些语言中同样用作开始与结束。

五、声明

  int num;

  程序中的这一行叫做声明语句(declaration statement)。该声明语句是C语言中最重要的功能之一。这个特殊的例子声明两件事情。第一,在函数中您有一个名为num的变量。第二,int说明num是一个整数,也就是说这个数没有小数点或者小数部分(int是一种数据类型)。编译器使用这个信息为变量num在内存中分配一个合适的存储空间。句末的分号指明这一行是C语言的一个语句或指令。分号是语句的一部分,不像在Pascal中那样只是两句之间的分隔符。
  单词int是C语言的一个关键字,它代表C中最基本的一个数据类型。关键字是用来表达语言的单词,您不能将它们用于其他目的。例如,不能把int用作一个函数或者是变量的名字。然而,这些关于关键字的限制在该语言之外就不起作用了,所以把一只猫或者一个很可爱的小孩叫作int是可以的(尽管在某些地区,当地的习俗或者法律可能不允许这种选择)。
  本例中的单词num是一个标识符(identifier),也就是您为一个变量、函数或其他实体所选的名字。这样该声明把一个特殊的标识符和计算机内存中的一个特殊的位置联系起来,同时确定了该位置存储的信息类型(也即数据类型)。
  在C语言中,所有变量都必须在使用之前定义。这就意味着您必须提供程序中要用到的所有变量名的列表,并且指出每个变量的数据类型。声明变量被认为是一个好的编程技术,在C语言中必须这样做。传统上,C语言要求必须在一个代码块的开始处声明变量,在这之前不允许任何其他语句。

六、赋值
  这行程序是一个赋值语句(assignment statement)。赋值语句是C语言的基本操作之一。这个特殊例子的意思是“把值1赋给变量num”。前面的int num;语句在计算机内存中为变量num分配了空间,该赋值语句在那个地方为变量存储了一个值。如果您想的话,以后您还可以给num赋另一个值;这就是把num称为变量的原因。注意赋值语句赋值的顺序是从右到左。

  七、printf()函数

  printf("I am a simple");
  printf("computer.\n");
printf("My favorite number is%d because it is first.\n",num);

  所有这些行都使用了C语言的一个标准函数:printf()。圆括号表明printf是一个函数名。圆括号中包括的内容是从函数main()传递到函数printf()的信息。例如,第一行把I am a simple传递给printf()函数。这样的信息被称为参数(argument),更完整的名称是函数的实际参数(actual argument)。printf()函数如何处理这个参数?程序将识别两个双引号之间的内容并把它们显示在屏幕上。

添加新评论