我们先看一个简单的C程序
#include<stdio.h> /*头文件*/
int main()
{
int a; /*声明一个整型a*/
scanf("%d",&a); /*输入输出a*/
printf("My favorite number is %d",a);
return 0;
}
/*asdh
djskfhdsk
fj
/*埃是法国就是*/
这个程序大体分为两部分——大括号内的与大括号外的,我们一句句分析。
1.#include<stdio.h>
这一行包含一个文件stdio.h,它是C编译器本身包含的标准部分,相当于把这个文件的内容黏贴到这一行,是代码进行编译之前会进行的准备工作,我们称它为预处理。
在这个代码中,stdio.h是标准输入/输出头文件(比如本例中的scanf()、printf()等)。通常,头文件就是顶部的信息集合,包含定义的全局变量(粗略认为可以影响到这个程序下所有函数的变量)和之后的定义函数等。
而对于一些看起来常见的函数为什么不直接内置到语言之中让我们可以直接使用呢?
因为并非所有程序都会使用I/O包(输入/输出),不直接定义其中体现了内存资源的有效利用的思想。
2.main()函数
int main()是一个程序中必不可少的一部分,C程序必须从main()函数开始执行。
其中,圆括号看似一个十分多余的功能,其中什么也没有(有时里面会有一个单词void,也表示空的意思,可有可无),但是()是这个函数必不可少的一部分,只有有了这个圆括号,我们才能识别那些标识符是代表函数,哪些又是代表了变量。这个括号的大致作用可以概括为将圆括号内的参数传入函数进行计算,之后自定义函数时我们就能更直观的发现函数括号的作用了。
int是函数main的返回类似,这里是int也就是这个函数的返回值是个整数。这里是主函数的返回值,所以返回到操作系统。
另外我们可能会看到诸如:main()或者void main()等类似形式,这些都是不标准的C格式,虽然编译器可能会运行通过,但是往往只能在一种编译器上可以通行,换一种就可能会出现问题,因此要尽量使用标准格式。
3.注释
在本程序中,我们可以看到被/* */括起来的一些话,这就是程序中的注释。他的作用是让他人或者是自己更明白这个程序。C99标准中引进了//这种注释的形式,在C++中十分常见。
/*与//的区别:
//只能注释掉//存在的那一行,而/*可以注释掉无数行。
比如
/*
C注释1;
C注释2;
*/
之中的内容均被注释掉了。另外
/*x=300;
y=700;
/*ahhhh*/
这样的三行代码均会被注释掉,详情看例中程序最后几行,均被注释掉。
4.声明
int a;是C程序中对一个名为a的变量的声明。
以往C语言要求声明必须在整个块的顶端,但是C99与C11按照C++惯例可以定义在函数的任意位置。
(1)声明有两个作用:
1.表明函数中有一个变量名为a。
2.表明a是一个整数(int)。
有了声明的作用,编译器就可以利用如上两个信息为a分配一个存储空间,空间大小与a的类型有关。
(2)明白了声明的作用,我们再来看看声明的两部分构成。
其一,int。int是C语言中的一个关键字,关键字是由语言定义的单词,不能用作其他的用途,且在语言之外便失去了作用。
其二,a。a是C语言中的标识符。标识符就是C语言中变量函数等的名称。是声明将标识符与计算机中内存的特定位置联系起来,也决定了存储在某位置的信息类型或数据类型。
4.5变量的命名——标识符
知道了声明的大体信息后,我们不免有一些疑问——如何声明一个变量呢?
给变量的命名要使用有意义的变量名或标识符。标识符的命名可以用小写字母、大写字母(区分大小写)、数字和下划线来命名,并且第一个字符必须是字符或是下划线,不能是数字。
注意:操作系统和C库经常使用一或两个下划线开始的标识符,为了避免冲突我们在定义标识符的时候最好不要以下划线开始。像是语言或操作系统本身的标识符叫做库标识符。
5.标准输入输出函数——scanf()、printf()
这两个是stdio.h库里面的标准输入输出函数。
关于scanf()、printf()的使用规则,可以详见其他博客的详细讲解。
圆括号的内容是从main()函数传递给标准输入/输出函数的信息,该信息称为参数,更确切的说,是实参(实际参数),在函数中,实际参数是传递给函数的特定值,而形式参数(形参)是函数中用于储存信息的变量。
在这里,写上函数名加小括号的形式叫做调用函数。
有关函数的信息也不详将,有关函数的博客中将会有更详细的讲解。
6.return语句
int main()中的int表示函数应该返回一个整数,这里的return语句便是起着这种作用。在主函数里,如果遗漏return语句,程序运行到‘ } ’外时也会自动返回到零(当然若是没有遗漏,程序将不会运行到' } '这里),所以在这个主函数里return语句是可以省略的。然而,在一些自定义函数中,return语句还有实际的用途,所以若是一不小心遗漏将会造成大麻烦,所以我们需要从现在开始养成这种写好return语句的习惯,以防丢失。