1.1 入门(要我看就是——千里之行,始于Hello, World!)
听说任何一门语言的1.1都是Hello, World!。这本书也不例外。由于这次学习是格外注重细节的一次,所以最简单的代码也要上一下。
#include <stdio.h>
int main()
{
printf("Hello, World!\n");
return 0;
}
头文件,main函数,printf,return,也没什么好强调的,出错也只可能是不小心敲错的吧。这里主要说一下gcc下编译的问题。方法:
gcc -Wall 文件名.c -o 文件名
其中需要注意-Wall的大写,Linux下的”终端“对大小写敏感,这不像Windows的cmd那么随意。-o是为了指定输出文件名,如果你不觉着a.out很难看,那不加也无所谓。-Wall听说是最严格的错误警告提示,具体的我也没关心,先这么用着就是了。这里的Wall可不是墙
,而是几个参数的组合。说笑
。gcc的功能丰富得可以专门写一篇教程了,有功夫再研究吧。
顺带提一下,以HelloWorld为例,默认不优化的情况下,gcc编译出来的bin是7.4k,vc6记着是20k,vs2010下的c++是3k,不过vs2010的库比较特殊,使用静态库的话应该是40k+。总的来说gcc还是蛮喜人的。(纯靠记忆写的,有错误请指正。)
1.2 变量与算数表达式
1.3 for语句
使用公式°C= (5/9)(°F-32)输出华氏温度和摄氏温度对照表。要求简单,直接上代码。(码农本色尽显
)
int main()
{
int fahr;
for(fahr = 0; fahr <=300; fahr += 20)
printf("fahr:%3d - celsious:%3d\n", fahr, 5*(fahr-32)/9);
return 0;
}
既然是C语言学习,那就一行不要浪费,尽可能短,能省则省。
忘了在哪看到过一段话,是讲int和long,float和double之间取舍的问题。
大多数机器上使用int进行整型计算不易出错。但int只有16位,long是32位长int。但是long计算的运行代价要远高于int,需按细节考虑。而浮点运算中,要尽量使用double。精度高很多,而运算代价可忽略。但long double没必要。(float只能保证6位有效数字,而double则可保证至少10位)
1.4 符号常量
符号常量就是:
#define MAXISUM 200
这种形式的声明。不赘述。
1.5字符输入/输出
有关getchar()和putchar()的内容。直接上码一目了然。
int main()
{
int c;
while((c = getchar()) != EOF)
putchar(c);
return 0;
}
这里的变量c为何声明为int型而不是char型,原书给出的解释是变量c必须足够大,除了能存储任何可能的字符外,还要能存储文件结束符EOF。这里可以通过
printf(“%d %d”, sizeof(int), sizeof(char));
来验证一下。
另外(c = getchar())最外面的()务必不能省略,因为!=的运算优先级要高于=。
1.6 数组
数组无非就是这么个形式:
int array[10];
除了下标是从0开始外,貌似没什么好记的吧。
1.7 函数
1.8 参数——传值调用
int function(int m, int n)
{
...
return 0;
}
归纳总结起来就是这个样子吧。
1.9 字符数组
字符数组是C语言中最长用的数组类型。下面还是通过程序来展示字符数组以及操作字符数组的函数的使用方法。该程序读入一组文本行,并输出最长的文本行。该算法的基本框架非常简单:
while(还有未处理的行)
if(该行比已处理的最长行还要长)
保存该行为最长行
保存该行的长度
输出最长的行
还是直接上代码。
#define MAXLINE 1000
int inputline(char line[], int maxline); //对每一次输入进行处理
void copy(char des[], char org[]); //保存当前输入行
int main()
{
int len, max;
char line[MAXLINE], longest[MAXLINE];
max = 0;
while((len = inputline(line, MAXLINE)) > 0)
{
if(len > max)
{
max = len;
copy(longest, line);
}
if(max > 0)
printf("the longest line : %s\n", longest);
}
return 0;
}
int inputline(char line[], int maxline)
{
int c, i;
for(i = 0; i < maxline -1 && (c = getchar()) != EOF && c != '\n'; i++)
line[i] = c;
line[i] = '\0';
return i;
}
void copy(char des[], char org[])
{
int i;
i = 0;
while((des[i] = org[i]) != '\0')
i++;
}
这里面需要解释一下的有这么两点:
一、在int inputline(char line[], int maxline)中,char line[]这一数组定义未声明大小。原因是该数组是在main函数中声明其大小的。
二、在C语言中是以'\0'来标志字符串的结束的,因此在inputline函数中,需要把字符串的最后一位字符'\n'改为'\0'。
1.10 外部变量与作用域
外部变量通俗的来讲就是全局变量。外部变量必须定义在所有函数之外,且只能定义一次。声明的时候可以通过extern语句显式声明,也可以通过上下文隐式声明。(不得不说这翻译的相当晦涩难懂)
还是举例子比较清晰。(个人理解,如有不对请指正。)
显式声明如下:
int main()
{
extern int i;
extern char str[];
…
...
}
然后你就可以在后面定义的函数里使用i和str[]了。
如果外部变量定义在函数之前,就可以省略掉extern声明。比如定义在源文件的开始处,此为通过上下文隐式声明。如下所示:
include <stdio.h>
int i;
char str[];
int main()
{
...
...
}
然后你就可以在后面定义的函数里使用i和str[]了。
另外再摘抄一下“定义”和“声明”的区别。“定义”表示创建变量或分配存储单元,而“声明”是指说明变量的性质,而不分配存储单元。(依然晦涩难懂,纯摘抄而已。反正我是不准备纠结到底是用“定义”还是“声明”,哪个顺嘴就用哪个,明白说什么就好。)
好了,《C程序设计语言》 第一章到此结束。总结一下,第一章通过几个简单的例子简单的介绍了一下C语言的基本情况。其中,变量,常量,数组,算数表达式,for/while循环语句,函数参数都将是贯穿C语言学习始终的重要元素。而全局变量虽然有其灵活的优势,在特定程序中能节省很大一部分力气,但考虑到其不易维护性,以及程序的可读性,在使用中应尽可能避免。以上纯属个人片面理解,如有错漏,敬请指正。