前言:The C Programming Language是一部非常经典的作品,它由C语言之父亲笔书写,并凭借本身过硬的质量成为C语言的标准之一
本章作为全书的第一章,主要的作用是建立对这门语言的大略认知;
程序示例:
#include <stdio.h>//包含头文件
main()//主函数入口
{
printf("Hello,world!");//函数调用
}
在集成的IDE中你可以使用软件本身执行源文件,但在UNIX系统中你需要这样做才能从一个源文件得到一个可执行文件。也就是我们说的程序:
cc hello.c
//启动GCC编译源代码,得到名为a.out的可执行文件
a.out
//执行a.out
作为一门编程语言,仅仅拥有上述功能实在是有些单调了;实际上,还可以有循环等控制流,下面是一个打印温度转换表的小例子:
#include<stdio>
main()
{
int fahr,celsius;
int lower,upper,step;
lower = 0;
upper = 300;
step = 20;
fahr = lower;
while (fahr <= upper) {
celsius = 5 * (fahr-32) / 9;
print("%d\t%d\n",fahr,celsius);
fahr = fahr + step;
}
}
//这段代码使用了一个while循环,打印了温度转换表
C语言提供了以下四种基本数据类型:
char:字符,占一个字节
short:短整型
long:长整型
couble:双精度浮点型
实际上每种类型的长度在不同的平台上是有差别的,但是类型之间的相对关系是固定的;
上面的计算方式有一个小问题,那就是基于整数导致精度很低,下面的版本是基于浮点数的:
#include<stdio.h>
main()
{
float fahr, celsius;
float lower, upper, step;
lower = 0;
upper = 300;
step = 20;
fahr = lower;
while (fahr <= upper) {
celsius = (5.0/9.0) * (fahr - 32.0);
printf("%3.0f %6.1f\n", fahr, celsius);
fahr = fahr + step;
}
}
你可能注意到调用函数printf()时,格式化符号前面还出现了一些数字,这是格式化前缀的用法:
%d 按照十进制整型打印
%6d 按照十进制整型数打印,至少占6个字符数
%f 按照浮点数打印
%.2f 按照浮点数打印,小数点后有两位小数
%6.2f 按浮点数打印至少6个字符宽,小数点后两位小数
另外,上面的打印部分使用while循环,但也可以使用for循环:
main()
{
int fahr;
for (fahr = 0;fahr < 300; fahr += 20)
printf("%3d %6.1f\n",fahr,(5.0/9.0)*(fahr-32));
}
我们观察发现上述程序使用了一些假的“变量”,虽然它们属于变量类型,但实际程序并没有对它们进行修改;这类变量可以用常量代替:
#include<stdio.h>
#define LOWER 0
#define UPPER 300
#define STEP 20
main()
{
int fahr;
for (fahr=LOWER;fahr<=UPPER;fahr+=STEP)
printf("%3d %6.1f\n",fahr, (5.0/9.0)*(fahr-32));
}
字符串输入/输出
下面两个函数可以实现字符串的输入和输出:
char c;
c=getchar();//从标准输入流中读取一个字符到c中
putchar(c);//向标准输出流中输出字符c
关于文件的小知识:EOF是文件的结束符
有了上面两个函数,我们就能写一个复制文件的小程序:
#include<stdio.h>
main()
{
int c;
while ((c = getchar()) != EOF)
putchar(c);
}
数组是同一种元素的序列,下面的程序利用数组这种数据结构来统计各个字符出现的字数:
#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;
print("digits=");
for (i = 0; i < 10; ++i)
printf("%d",ndigit[i]);
printf(",white space = %d,other = %d\n",nwhite,nother);
}
关于函数
函数是一种拆分程序执行流程的手段,下面的程序使用函数对任务进行拆分:
#include<stdio.h>
int power(int m,int n);
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 base, int n)
{
int i, p;
p = 1;
for (i = 1;i<=n;++i)
p = p * base;
return p;
}