第二节 C语言概述(上)

我们来看一个C程序:

//first.c
#include <stdio.h>    //一个简单C程序
int main(void)
{
    int num;    //定义名为num的变量
    num=1;    //为num赋值
    
    printf("Hello,");    //使用printf()函数,printf=print formula。
    printf("world!\n");
    printf("My favorite number is %d.",num);
    
    return 0;  //程序结束
}

这个程序会在屏幕上打印一些内容。我们编译并运行它,输出如下:

Hello,world!
My favorite number is 1.

接下来,我们逐行解释这个程序。先解释每行的作用,以便让你知道C程序的基本结构和各个部分的作用。

初步解释

第一行是注释,注释有两种形式。分别是

//注释
/*可以换行的
注释*/

/*
第二种注释也可以这么写
*/

/*这么写就无效,因为它没有结束标记

其中,前一种注释方式不可换行,后一种注释方式可以换行。注释的意义在于解释程序各个部分的作用。编译器会忽略掉这些注释的部分。通俗地说,注释是给人看的,不是给机器看的。有时,当我们要把程序的各个部分分开测试时,把不需要测试的部分“注释掉”会比较好。

第二行是预处理器指令,它告诉编译器将头文件stdio.h的内容包含在当前程序中。(h=head)

第三行是主函数。函数是C程序的主要组成部分,它由“函数名+圆括号”组成,只要看到形如main(),printf()的,就是函数。函数前的“int”和括号中的“void”将在后面详细解释。

第四行是一个花括号,表明函数体的开始 (也被称作。必须使用花括号标记函数的开始和结束。

第五行是一个声明。该行告诉编译器,程序将使用一个名为“num”的变量。而且num是int*(整数)*类型。

第六行是赋值表达式语句。该行把值**“1”**赋给名为num的变量。

(第七行以及第十一行并无内容,空出它们的目的是为了让程序更好阅读。)

第八、九、十行调用了printf()函数。这其中,第八行在屏幕上打印 “Hello”,而第九行打印 “world!”。打印的内容紧跟在 “Hello” 后面。叹号后的**“\n”叫作换行符**。它告诉编译器把光标移到下一行的开头。第十行把num的值(1)内嵌在打印的内容中,并告诉编译器应该以何种形式打印(%d),打印在何处。

第十一行是返回语句。它表明主函数返回的值是0。如果不做进一步的探讨,我们可以认为这就是程序的结束。

第十二行是右花括号,它与第四行将函数体括了起来。注意,在C程序中,所有的括号都成双成对,否则编译器会报错,而且,必须以右花括号表示程序的结束。

函数块内,所有的语句都必须以分号结尾,否则编译器会报错。

详细解释

我们再次回顾这个程序*(忽略注释和花括号)*:

第一行:“#include <stdio.h>”

这是程序的第一行。这行的内容相当于把stdio.h文件中的内容全部拷贝到当前程序中。这行代码是预处理器指令。在代码运行之前,编译器会对程序进行预处理。

为什么要拷贝stdio.h?这是因为,这个文件是标准输出/输入头文件”。它包含了输出/输入函数,比如printf()。头文件内存储了这些函数的机器代码(01011101……),这样,我们只需要在程序内输入printf(),编译器就会自动将它转换为可执行的机器代码。头文件帮助你的程序正确组合并运行。通俗地讲,如果编译器是翻译官,那么头文件就是字典。

在我们的学习范围内,所有程序都会包括stdio.h

(扩展:为什么不在语言内内置头文件?因为不同的程序所需要的函数不同。例如,一个定时浇水的程序就不需要输入和输出。为了避免累赘,C语言采用了这种方案。)

第二行:int main(void)

C程序一定从main()函数开始执行*(在学习范围内,不考虑其他情况)*。整个程序在本质上就是对main()函数的执行。在函数名后面加上圆括号可以让编译器知道它是函数。函数是C程序的基本模块。

函数前的“int”表明这个函数将会返回一个整数。返回到哪里?操作系统。在之后,我们将再次探讨这个问题。

圆括号内包含一些要传入main()函数的参数。但在我们的学习范围中,所有程序都不会向main()函数传递任何参数。所以我们在括号内写上“void”(也可以不写)

第四行:int num;

这是一个声明。声明是C语言最重要的特性之一。这个语句完成了两件事。其一,它告知编译器在函数中有一个叫“num”的变量。其二,它使用了**“int”来说明这个变量是整数类型**的变量。

int 是一种数据类型。像int这样的有特殊含义的字符被称为关键字。你不能使用关键字做变量名或用作其他用途。例如,像“int int”的写法就是错的。我们也不能用它来命名函数。

num是一个标识符。系统会为它分配一个存储位置。这个语句把标识符同存储位置联系起来,同时指定了系统应该以什么样的方式存储信息。

在C程序中,所有变量都必须先声明后使用。就考试而言,我们强烈建议把所有声明都放在块的顶部。尽管按照现在的标准,我们可以在块内的任何地方声明变量。

//first.c,但是在现有标准下.
#include <stdio.h>    //一个简单C程序
int main(void)
{
    printf("Hello,");    //使用printf()函数,printf=print formula。
    printf("world!\n");
    printf("My favorite number is %d.",int num=1);
    
    return 0;  //程序结束

}

(扩展:为什么要把变量分成不同的数据类型?因为计算机在存储不同的数据类型时遵循不同的规则。只有先声明变量的数据类型,编译器才能正确存储和读取数据。在下一节,我们会详细介绍C语言中的各种数据类型。)

这里再详细地解释一下声明变量的意义。

其一:方便你自己寻找变量。设想一下,你在程序中使用了一个变量blaze,但是在下面赋值时却意外写成了"blazee=1",假如没有声明变量,值就会赋给blazee而非blaze。这样,在下一次使用blaze变量时,我们就得不到想要的值1。

其二:如果不声明变量就使用变量,编译器会报错。

第五行:num=1;

这是一个赋值表达式语句。它的意思是“把值 1 赋给变量num”。在执行上一行时,系统已经为num预留了空间,然后在执行这一行时,把值存储在之前预留的位置。这个值是可以改变的,也可以为变量多次赋值,例如我们这么写:

num=1;
num=2;

也是可以的。num在第二行被重新赋值成2,执行完这两条语句后,num的值是2。所以它叫做“变量”。

第八到十行:printf()函数

printf("Hello,");    
printf("world!\n");
printf("My favorite number is %d.",num);

这里运用了printf()函数。圆括号中的内容是从main()函数传递给printf()函数的信息。例如,第一行把“Hello”传递给printf()函数。"Hello"被称为参数。或者更确切的说,它是函数的实际参数

(扩展:函数的实际参数是变量的实际值,函数的形式参数是函数中的变量。)

printf()函数用来做什么?用来**将双引号内的内容打印在屏幕上。**当程序运行到这一行时,控制权转到printf()函数上,当执行结束后,控制权又返回到主函数。

我们注意到,第二行的“\n”并没有输出。这是一个转义序列。转义序列用于代表难以表示,无法输入的字符。例如\n,它是换行符。代表“换行”,如果不输入换行符,下一个printf()函数会将内容打印到紧跟上一个printf()函数的后面。当程序读取到函数内的换行符时,它才会把输入光标移到下一行。这也解释了为什么前两个printf()语句只打印出了一行内容。

我们又注意到,函数中的**“%d”在输出时变成了“1”。这是为什么呢?其实,%d是一个占位符**。%提醒程序,要在这里打印一个变量,而“d”则表明,要把变量以十进制整数的格式打印。我们用逗号把要替换的变量与双引号上的内容隔开,这样,程序就会知道我们该以哪个变量替换%d。printf()是一种格式化打印函数,C语言提供了很多种占位符,用于指定打印的格式。我们将在后面继续讨论这个问题。

第十二行:return 0;

return语句是程序的最后一条语句。int main(void)中的int表明,主函数要返回一个整数。因此我们在这里写下return语句以指定主函数的返回值。其实,即使不写return语句,当程序执行到右花括号时,仍旧会返回0。但是为了格式统一,应对考试要求,我们强烈建议在程序的结尾写上return语句。

总结

一个简单C程序的格式如下:

#include <stdio.h>    //函数头
int main(void)
{
    语句()绝大部分的语句都以分号结尾。
    return 0;  //程序结束

}

我们推荐你下载Visual Studio并根据first.c写出自己的C程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值