C语言概述【重学C之一】

来源:互联网 发布:淘宝cos道具定制店 编辑:程序博客网 时间:2024/06/08 15:58

这篇博客是我阅读《C程序设计语言》这本书的一个读书比较。我个人认为C还是比较重要的一门编程语言,虽然现在社会上招聘之类来看,C语言的热度并不是很高,但是C确确实实是作为整个互联网世界的基础存在的。所以我认为即使是出于情怀C也是要学一学的。

这里先通过几个简单的C程序来说明C语言几个比较重要的语言特征,不是一个非常详细的说明,许多细节都不会涉及到,但是作为一个C语言的通览还是可以的。

main(){}

这个程序是我所能写出来的最简的C语言的程序。不知道还有没有更简单的。这个程序什么都不做,只是定义了一个空的主函数,这样定义已经是符合C语言基本定义的了。是一个可以编译运行的程序。当然运行它也不会有说明结果,因为它什么也不做。这里所要说的就是main函数在C程序中的地位,C程序要运行必须要有主函数,主函数是程序运行的入口。没有主函数的C程序是可以被编译的。比如说库函数等。

#include <stdio.h>main() {printf("hello, world\n");}

程序届最著名的程序,运行这个程序时将在控制台输出一条hello,world字符串。这个程序功能的实现是通过调用一个printf函数实现的。printf是一个库函数,严格来讲应该是不属于C语言本身的,它的实现很编译环境有关,是其提供的库函数。可能不同的编译环境下提供的printf函数的具体实现不同,但是它所实现的功能是一样的。

#include <stdio.h>main() {    float fhar;    for(i=0; i<=300; i+=20) {        printf("%d\t%4.2f", fhar, fhar);    }}

这个程序的主体部分是一个for循环语句,这里要说的就是循环了,循环是c语言中非常重要的一部分。c语言的循环语句有两中,for语句和while语句,其实两者是可以互换的,可以依据程序的结构选择合适的。for语句中的句子需要用大括号扩起来,当语句只有一条是这个不是强制性的要求。当有多条语句时就必须要这样做了。括号之间的语句块构成for语句的主题。for后面的括号中跟着3个部分,中间用分号隔开。前面的是初始化语句,中间是判断条件,成立则循环继续。最后面的是一个递增运算。是循环向前的条件。

#include <stdio.h>main() {    int c;    while( (c=getchar()) != EOF) {        putchar(c);    }}

上面的是一个字符复制的程序。程序接受输入,然后进行输出。在shell中运行的话,是从标准输入读入数据,然后输出到标准输出。程序在接受到EOF后接受,EOF是标准库中定义的文件结束符。在shell中运行程序时可以通过Ctrl+D输入。在shell中运行这个程序是还可以通过重定向符<将文件系统中的文件重定向程序的标准输入,这样程序也就可以读入文件中的内容了。注意这里程序不是直接读取文件。文件是shell读取到标准输入,然后程序在标准输入中读取的。这里还有一点,当我们在shell中运行程序时。可以一次性输入很多字符,在回车之后程序就会执行。这里在shell中运行时可能是把回车当成EOF了。程序本身是一次读取一个字符,然后输出的。但实际上运行时可以一次输入多个字符,原因应该是字符输入之后在标准输入中缓存了。这个只是我的猜测。

#include <stdio.h>#define OUT 0#define IN  1main() {    int c, nl, nw, nc, state;    state = OUT;    nw = nc = nl = 0;    while( (c=getchar()) != EOF) {        ++nc;        if ( c == '\n')            ++nl;        if ( c == '\n' || c == ' ' || c == '\t')            state = OUT;        else if (state == OUT) {            state = IN;            ++nw;        }    }    printf("%d %d %d\n", nl, nw, nc);}

上面的是一个统计输入中行数,单词数和字符数的一个程序。程序主体是一个while循环。while循环的主要部分是两个if条件语句。第一个if语句统计行的数目,第二个if语句根据输入的是否为换行空格和制表符来判断现在接受的是否是在字符内部,如果是字符现在是在字符外边,并且之前是在字符内部的话。那么单词数就加1。

#include <stdio.h>// 统计输入中数字空白符和其他字符出现的次数main() {    int c, i, nwhite, nother;    int ndigit[10];    nwhite = nother = 0;    for (i = 0; i < 10; ++i) {        ndigit[i] = 0;    }    while( (c = getchar()) != EOF) {        if ( c >= '0' && c <= '9') {            ++ndigit[c - '0'];        }else if ( c == ' ' || c == '\n' || c == '\t') {            ++nwhite;        }else {            ++nother;        }    }    printf("digits =");    for (i = 0; i < 10; ++i) {        printf(" %d", ndigit[i]);    }    printf(", white space = %d , other = %d\n", nwhite, nother);}

这里主要是一个数组的问题。在这个函数中,用一个数组来存储重0-9各个数字出现的次数,具体实现,借助了字符类型是联系编码的特点,通过字符的减法运算来确定字符说对应的数字。

#include <stdio.h>int power(int m, int n);// 测试power函数main() {    int i;    for (i = 0; i < 10; ++i) {        printf("%d %d %d\n", i, power(2, i), power(-3, i));    }    return 0;}int power(int m, int n) {    int i, p;    p = 1;    for (i = 1; i <= n ; ++i) {        p = p * m;    }    return p;}

这个程序主要需要说明的是子函数的问题。在这个程序中有一个我们自定义的函数power,在函数被定义之前,我在程序开始的位置对他进行了声明。声明和定义的主要区别在于,声明是不分配内存空间的。定义的话就开始分配内存空间,在C语言中。声明和定义的这个区别是通用的。这个函数做的事情很简单就是计算m的n次方,因为要多次用到这个计算,所以这里把它提取成一个函数。在程序中使用函数是一个非常好的编程习惯,这样有助于我们把较难的问题分解为多个比较简单的问题有助于问题的解决。

这里还有一个函数的参数传递的问题,在C语言中函数参数的传递都是通过传值实现的。在函数被调用时,参数的值被传递给函数,而不是参数所对应的变量本身。被调用的函数拥有一份参数值的拷贝。在函数内部创建自己的局部变量来保存参数的值。这个值的作用域只在函数内部,函数调用结束,变量被销毁。

#include <stdio.h>#define MAXLINE 1000int getlines(char line[], int maxline);void copy(char to[], char from[]);// 打印最长输入行main() {    int len, max; //len是当前输入行长度,max最长输入行长度    char line[MAXLINE], longest[MAXLINE]; //line用于存储当前行,longest用于存储最长行    max = 0;    while ((len = getlines(line, MAXLINE)) > 0)         if (len > max) {            max = len;            copy(longest, line);        }    if (max > 0)        printf("%s", longest);    return 0;}int getlines(char s[], int lim) {    int c, i;    for (i=0; i<lim-1 && (c=getchar()) != EOF && c!='\n'; ++i)        s[i] = c;    if (c == '\n') {        s[i] = c;        ++i;    }    s[i] = '\n';    return i;}void copy(char to[], char from[]) {    int i;    i = 0;    while ((to[i] = from[i]) != '\0')        ++i;}

这个函数要说明的就是一个字符数组的问题。字符数组在C语言中是一个非常重要的概念的。一般处理字符就是通过字符数组和字符指针来操作。字符数组相比于字符指针。字符数组的空间是固定分配的,它的大小在定义时就已经分配好的,但字符指针不同,字符指针可以指向任意大小的字符串。

这个就是第一章的内容了,到这里为止了。本身并没有将什么,只是把书本中比较重要的几个程序复制过来做了一个大概的说明。我想如果我能说的清楚每个程序是干什么的,是如何实现。这应该就是掌握了这些知识吧。

0 0
原创粉丝点击