C语言入门之”Hello , World!”

来源:互联网 发布:dt4000工业数据采集器 编辑:程序博客网 时间:2024/05/16 07:31

   最近,有学弟学妹向我吐槽不知道怎么学C语言,说感觉老师啥都没说就让自己写一个程序出来,那今天就用一个最简单的例子给大家简单说说C语言的一些基本知识。

欢迎我们的简单栗子同学:hello.c      

#include <stdio.h>

int main(){

printf(“Hello , World !\n”);

return 0;

}

   首先,介绍一些我们C语言中以#开头的预处理命令,这个东西呢,就是在执行你的程序之前,系统需要提前干些神马,它所干的这些事情就是预处理(就像你跑八百米前要先做热身是一个道理)。然后,”#include xxx” 则是引入一个头文件到你的程序中,这样你就可以在你当前所写的程序中调用你引入的头文件里的函数。


关于”#include”有两种格式,一种是”#include  <xxx.h>”,另一种是”include “xxx.h”。其中,"#include <stdio.h>”用于标准库文件或系统提供的头文件,到保存系统标准头文件的位置查找头文件。而#include "userdefined.h"用于用户自定义的头文件,先从当前目录查找是否有指定名称的头文件,若当前目录未找到该头文件,再从标准文件目录中查找。

 

这两种方式有他们的本质区别。在c语言程序设计中包含的头文件可分为系统标准头文件和用户工程中自定义的头文件,对于系统标准库头文件可以用这两种方式进行包含,但是采用第一种方式更节省时间,所以一般建议采用第一种方式。对于用户自己定义的头文件(保存在工程路径下)只能用第二种方式进行包含操作,否则出错(当然也可以把自己定义的工程中需要的头文件放在标准头文件路径下,但是这违背常规操作)。

 

        另外,每个”#include”命令只能包含一个文件名,当引用多个文件时则需要多个”#include”命令。(”#include”命令允许嵌套,即在引入的头文件中允许引用另外的头文件)

知道这个之后,我们就可以看上面这个程序,在最开始引入了名为”stdio.h”的头文件,这个文件里有啥呢,咱来看看它全称——standard input&output(标准的输入和输出)。没错,这个文件里头包含的就是C语言中标准输入输出的函数(即IO函数),在开头引用它就是为了在后面写程序的时候可以调用这个头文件里的函数(比如printf(),scanf(),getchar(),pushcar....


那啥是函数呢?比如我们下面的int main(){...},它就是一个函数,一个唯一的主函数!也就是老大!为啥说它是老大因为一个C程序总是从main()函数开始执行的,并且一个C语言程序或工程只能有一个main()函数。通常的我们将函数要执行的功能的代码写到函数体中(也就是{}花括号括起来的部分)。


一般呢,一个函数头有一个返回值类型和尾有一个对应的返回值,假如没有要返回的东西,就将函数返回值类型写成void(可以理解为空类型)。当然也可以给函数传入一些参数,让函数在函数内部可以用到传进来的参数,对参数进行处理,或者利用参数进行一些计算。当然当你不需要参数的时候也就没必要传入参数,这个时候参数位置啥都别写就行啦!


呐!函数的定义如下:

[函数返回值类型]  [函数名称](函数的参数们){

....   函数体

}

咳咳!让我们回归主题!看看我们老大的返回值类型和参数是撒!

在最新的 C99 标准(一个厉害的东西,无需理解)中,只有以下两种定义方式是正确的:
int main( void )  /* 无参数形式 */
{
    ...
    return 0;
}
int main( int argc, char *argv[] ) /* 带参数形式 */
{
    ...
    return 0;
}


int指明了main()函数的返回类型(整型),函数名后面的圆括号一般包含传递给函数的信息。void表示没有给函数传递参数。
 可是当你浏览老版本的C代码,将会发现程序常常以:main()这种形式开始。C90标准(厉害的老东西,但是过时了)允许这种形式,但是C99标准不允许。因此即使你当前的编译器允许,也不要这么写。另外,你还可能看到过另一种形式:void main(),有些编译器允许这种形式,但是还没有任何标准考虑接受它

 

【C++ 之父 Bjarne Stroustrup在他的主页上的FAQ中明确地表示:void main( )的定义从来就不存在于C++或者C。所以,编译器不必接受这种形式,并且很多编译器也不允许这么写。

 

反正就是不要这样写就对啦!!坚持使用标准的意义在于:当你把程序从一个编译器移到另一个编译器时,照样能正常运行。(比如从devc++Linux)。

而从前面我们知道main()函数的返回值类型是int型(整型)的,而程序最后的return 0;正与之遥相呼应,也就是说0就是main()函数的返回值。那么这个0返回到那里呢?返回给操作系统,表示程序正常退出。因为return语句通常写在程序的最后,不管返回什么值,只要到达这一步,说明程序已经运行完毕。而return的作用不仅在于返回一个值,还在于结束函数。

 

至于main()函数的参数,有兴趣的同学可以看一下,没兴趣可以直接跳过。

C编译器允许main()函数没有参数,或者有两个参数(有些实现允许更多的参数,但这只是对标准的扩展)。这两个参数,一个是int类型,一个是字符串类型。第一个参数是命令行中的字符串的个数。按照惯例(但不是必须的),这个int参数被称为argcargument count)。第二个参数是一个指向字符串的指针数组。命令行中的每个字符串被存储到内存中,并且分配一个指针指向它。按照惯例,这个指针数组被称为argvargument value)。系统使用空格把各个字符串格开。一般情况下,把程序本身的名字(比如我们的hello.c)赋值给argv[0],接着,把最后的第一个字符串赋给argv[1],等等。


现在我们来看一个例子:
#include <stdio.h>
int main(int argc, char *argv[])
{
    int count;
    printf("The command line has %d arguments:", argc - 1);
    for(count = 1; count < argc; count++)
        printf("%d: %s", count, argv[count]);
    return 0;
}


编译运行,在命令行输入c I love you 回车,下面是从命令行运行该程序的结果:
The command line has 3 arguments:1I 2love 3you,从本例可以看出,程序从命令行中接受到4个字符串(包括程序名),并将它们存放在字符串数组中,其对应关系:
argv[0]  ------>    c(程序名)
argv[1]  ------>    I
argv[2]  ------>    love
argv[3]  ------>    you
至于argc的值,也就是参数的个数,程序在运行时会自动统计,不必我们操心。
这个例子中,每个字符串都时一个单词(字母),那既然是字符串,要把一句话当作参数赋给程序该怎么办?你可以在命令行里这样输入"I love you."  "Im too."。程序运行结果:
The command line has 2 arguments:
1I love you.
2Im too.
其对应关系:
argv[0]  ------>    c(程序名)
argv[1]  ------>    I love you.
argv[2]  ------>    Im too.



要注意的是,你在命令行的输入都将作为字符串形式存储于内存中。也就是说,这个时候如果你输入一个数字,那么要输出这个数字,你应该用%s格式而非%d或者其他。(这个时候指的是从argv[]中输出的时候)                      】

 

回到我们的话题,刚刚讲到了main()函数,那接下来讲的就是函数里面的printf()函数了,这个函数就是stdio.h里面的标准输入输出中的一个输出函数——格式化输出函数,一般用于向标准输出设备按规定格式输出信息。在编写程序时经常会用到此函数。调用格式为
    printf(" <格式化字符串>", <参量表>); 


    其中,格式化字符串包括两部分内容: 一部分是正常字符或者转义字符, 这些字符将按原样输出(比如咱们简单例子的”Hello , World !”;另一部分是格式化规定字符,"%"开始,后跟一个或几个规定字符用来确定输出内容格式。 


参量表呢,则是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出 参数个数一样多,各参数之间用","分开,且顺序一一对应,否则将会出现意想不到的错误。

至于printf()函数的返回值返回的是它打印了多少个字符

举一个栗子:

#include <stdio.h>

int main(){

int a;

scanf(“%d”,&a);

printf(“a=%d\n”,a);       //这里printf()的返回值为4

return 0;

}

   这个栗子就是定义了一个整形是变量a,然后从键盘输入ascanf();语句的作用,之后再细讲),假设我们输入了155,那之后就会输出a=155然后光标跳到下一行行首。我们来看printf()函数中的那堆东西,按照我们上面讲的,’a=’会原样输出,%d的位置被我们的参量a代替了于是输出155,然后转义字符’\n’则被转化成光标另换一行的操作。注意啦!因为我们这里定义的aint型(整形),而它对应的格式化规定字符为’%d’,这些都是规定好了的,不是瞎写的。然后转义字符也都有自己的意义,大家往后看就知道辣~


  至于scanf()——执行格式化输入,可以理解为和printf()函数是相对的,返回值为正确按指定格式输入变量的个数能正确接收到值的变量个数。比如scanf(“%d %d”,&a,&b);,一般情况来说返回值为2,但是如果只有一个成功读入了返回值就为1,都不行就为0如果遇到错误或遇到end of file,返回值为EOF
 scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘)读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。
其调用格式为:      scanf("<格式化字符串>"<地址表>);


其中格式化字符串输入就是告诉你应该怎么输入,比如:

scanf(“%d,%d”,&a,&b);那么你输入的时候就得”a,b”,注意中间那个’,’,因为你在输入的时候定义的是”%d,%d”,所以你输入的就得按照这种格式输入(但是如果是scanf(“%d %d”);或者scanf(“%d%d”);那你输入的东西就应该以空格隔开),并且输入的东西会按照格式化字符串的格式来处理,比如说%d,那它就把你输入的当作整形来处理,并赋给相应的变量。比如,这里你输入”2,3”,那么该程序里面的a就是2b就是3


然后我们来看scanf()函数的地址表,地址表是对应要输入的字符的的地址信息,’&n’表示的就是n这个东西的地址,就是在内存存在哪个地方,比如你就是n,那’&n’就是你家的地址。


原创粉丝点击