70 123
发新话题
打印

[原创]邪恶八进制短期C培训教材《说C》(第一部分)

[原创]邪恶八进制短期C培训教材《说C》(第一部分)

文章作者:无锋之刃[E.S.T顾问团]
信息来源:邪恶八进制 中国

章1     C的初体验
节1.1     第一次亲密接触
    95年的时候我刚上初二,学习并不太紧,课余的闲暇时间很多。为了打发掉一些时光,经常会跑去书城买点计算机类的书来啃。也许是命中注定,我买本谭老前辈的《TC程序设计教程》,至此成为地地道道的Cer。而我的C体验,也是从此开始的。
    谭老的书写得实在是四平八稳,滴水不漏,有章有法(最难得的是十数年不变,当工具书用可以,当读物不行)。那时候我的知识结构还很简单,本来这样的书是决计看不懂的。但初一的时候恶补过一阵子BASIC,再加上莫大的好奇心,居然愣是在七天内把整本书给啃完了。有人会说吹牛也不用这样,但我真正想要表达的观点是,一周内看完一门编程语言的语法的确不难,问题是能看懂多少?
    很多人在与C进行第一次亲密接触的时候,大都会被C的简洁与强大所折服,也大都会想要努力把C学习好。可是真正把C搞明白(只是明白,不算熟悉的)的人太少了。原因在于C的语法容易看,想搞懂却不是那么简单的。特别是指针,更是百转千回,把人绕晕了也不见分析得清楚。
    孔老人家曰“学而不思则惘,思而不学则殆”,很有道理。所以我看计算机书籍的方法与别人不太一样,喜欢把自己假设成计算机,按计算机的思路去思考问题。这就是我看C又快又明白的原因。除了花时间在“看”上面,还会根据代码的结构,在脑子“想”这些代码的意思(语义)是什么?相互关系如何?编译器如何会处理这些代码?等等等等。通过把自己代换成编译器,从而把学和思结合,就能顺利地弄清楚上面的各种问题。虽然有点奇怪,但真的有效,呵呵。
    学和思结合固然重要,更关键的问题在于多动手练习。看完不代表懂,懂不代表会用,会用不代表熟练,熟练不代表能赚钱。所以学习C的初级阶段,主要还是通过动手编码来熟悉语法,洞悉语义,达到看一能及二甚至推三的程度,才算小成。多数C学习者过于重视看书,却忽略了练习,实在是大大的不该。
    练习的方法也不应该是死做书上的习题。习题的目的是帮助学习者巩固语法知识,便于其熟练使用而已。学习者做完了习题最多是懂得怎么用语法,但还没有到懂得何时用什么语法的程度。要想达到自由地编程,或者是下意识地编程的程度,必须是分析实际的功能需求,仿照已有的程序来编码才可达成。比方说一个菜单,看的人大概就是会用,但程序员应该从编程的角度去看这个菜单。有目的地思考“我如何实现这个菜单的功能”之类实际问题,更能锻炼出真正的编程能力,而不是简单地应试。换句话说,就是先懂得分析,然后才懂得设计,最后是懂得编码。编码人人都能懂,但分析设计却不是个个都会的。这也可算是编程爱好者与程序员的本质区别了吧。

节1.2    学习顺序简论
我的学习顺序,比较喜欢安排成这样:
1.    先看一遍语法;
2.    用语法把想实现的软件功能实现出来;
3.    回头再看一遍语法;
4.    考虑此语法上的高层结构,比如建模。
  看第一遍语法,主要是为了熟悉语法结构、语言要素等等基本知识。学习过其它语言的人可以在这个阶段进行语法比较。第二步则是练习阶段,主要是巩固语法的使用。而看第二遍语法是复习语法,补充细节,把没有来得及看或者尚未理解的细节知识纳入知识结构之中。最后一个阶段就进入到高层面进行抽象,即如何使用此语言来对问题建模。
  这个顺序的前提假设是读者已经具备一定的语言基础。如果是初学者,那么可以在第一步中加入习题练习,即语法学习与实践练习交叉进行,但花费时间比较多。但初学者容易在这个比较漫长(甚至反复)的过程中失去信心,这就需要初学者具备一定的心理素质了。C语言不难学,难的是人的心:)。
  当然这个顺序不单只是应用在C语言的学习上,也可以应用在其它方面。其实顺序不是问题,最关键的是要有信心、恒心和耐心。

1.3    经典C代码
   几乎每本C教程的第一个代码片段都类似下面的代码(可以在任何C编译器上编译通过,如果不能的话,把你的编译器扔了:):
#include <stdio.h>

int main(int argc, char **argv)
{
    printf(“hello world!\n”);
    return 0;
}

   很简单的代码段,但已经蕴涵了不少C的语法结构。只是大家都已经司空见惯,没什么感觉而已了。其实仔细看看,还是有点分析的味头。
首先应该看出的是C语言采用的“头文件/实现文件”结构。其中头文件存放预处理指令(preprocess instruction)、声明(declaration)、枚举/结构/联合定义(enumerator/structure/union definition)、内联函数定义(inline function definition)、类型定义(type definition)等公共的、可以重复包含的内容;实现文件存放预处理指令、静态/全局变量定义(static/global variable definition)、函数定义(function definition)等不可重复包含的内容。 不同的代码开放层次可以开放不同的代码文件(比如在分放代码时可以只提供头文件和Lib文件,而开源时则可以再附加上实现文件)。
   其次应该注意的是main函数。正如进入一个单位办事必须先从大门进入一样,C程序中的逻辑入口点是main函数。此函数的作用有三个。第一个是为操作系统向程序提供的参数保留占位符;第二个则是程序向操作系统提供的返回状态保留占位符;最后一个是为操作系统替开辟此程序的新进程提供进入点。每个C工程都必须有唯一一个main函数(保存在某个实现文件中)。
很多人不太在意main函数的写法,经常写成如下形式:
void main()
其实这是不对的,因为这不是标准C中规定的写法,因此是不可移植的。以下两种形式才是具备移植能力的标准写法:
int main();
int main(int argc, char **argv);
   最后值得注意的是C语言的“按功能分离代码形成模块”的设计原则。使用此原则可以较好地组织代码,形成良性结构。比如将所有标准的输入/输出代码写入不同的实现文件中,再由一个统一、包含了所有输入/输出函数原型的头文件来对外提供访问信息。读者应该严格按这个原则来进行模块划分和代码编写。
   以上就是我们可以从极小化的经典C代码中看出的一些东西。不过每一个东西都足够让我们研究好长一段时间了(主要是“意会”的时间太长了:()。Let us go!
对待处女,谁污染,谁治理。 对待内存,谁分配,谁释放。

TOP

如果拿谭老头的书和《C Primer Plus》比的话  一天一地!
请加47809945   100%通过!每个月总有那么几天,您的网络会受到黑客的攻击--坐立不安,烦躁无力,使用虎虎开发的"月月舒"防火墙,超轻超薄,易于携带,提供由内到外的全方位保护,即使流量再大,也可以冲浪自如,再也不用担心侧漏啦。

TOP

楼上所说的是不能相比较di,潭浩强老师的书开篇有说明-----目的是为了普及计算机教育而不是深入研究..
BLOG: http://blog.csdn.net/hkbyest

TOP

节1.2    学习顺序简论
我的学习顺序,比较喜欢安排成这样:
1.    先看一遍语法;
2.    用语法把想实现的软件功能实现出来;
3.    回头再看一遍语法;
4.    考虑此语法上的高层结构,比如建模。
   看第一遍语法,主要是为了熟悉语法结构、语言要素等等基本知识。学习过其它语言的人可以在这个阶段进行语法比较。第二步则是练习阶段,主要是巩固语法的使用。而看第二遍语法是复习语法,补充细节,把没有来得及看或者尚未理解的细节知识纳入知识结构之中。最后一个阶段就进入到高层面进行抽象,即如何使用此语言来对问题建模。
   这个顺序的前提假设是读者已经具备一定的语言基础。如果是初学者,那么可以在第一步中加入习题练习,即语法学习与实践练习交叉进行,但花费时间比较多。但初学者容易在这个比较漫长(甚至反复)的过程中失去信心,这就需要初学者具备一定的心理素质了。C语言不难学,难的是人的心:)。
   当然这个顺序不单只是应用在C语言的学习上,也可以应用在其它方面。其实顺序不是问题,最关键的是要有信心、恒心和耐心。
对待处女,谁污染,谁治理。 对待内存,谁分配,谁释放。

TOP

语法看了n遍了,不过要自己用c来写个什么小程序真的是比较难哦。希望无锋大哥能继续写下去,最好能写点简单实用的小程序来分析分析。
青铜的钝剑:我是没有眼泪的人 为了保护自己 今后我可以对任何人残忍 巫师的披风:我不怕死 因为我一直对它充满着无尽的好奇 想亲眼看一下死之后会是什么←目前状态 耀眼的强光:我最擅长从零开始创造世界 所以从来不怕失败 它最多也就让我一无所有

TOP

1.3    经典C代码
    几乎每本C教程的第一个代码片段都类似下面的代码(可以在任何C编译器上编译通过,如果不能的话,把你的编译器扔了:):
#include <stdio.h>

int main(int argc, char **argv)
{
    printf(“hello world!\n”);
    return 0;
}

    很简单的代码段,但已经蕴涵了不少C的语法结构。只是大家都已经司空见惯,没什么感觉而已了。其实仔细看看,还是有点分析的味头。
首先应该看出的是C语言采用的“头文件/实现文件”结构。其中头文件存放预处理指令(preprocess instruction)、声明(declaration)、枚举/结构/联合定义(enumerator/structure/union definition)、内联函数定义(inline function definition)、类型定义(type definition)等公共的、可以重复包含的内容;实现文件存放预处理指令、静态/全局变量定义(static/global variable definition)、函数定义(function definition)等不可重复包含的内容。 不同的代码开放层次可以开放不同的代码文件(比如在分放代码时可以只提供头文件和Lib文件,而开源时则可以再附加上实现文件)。
    其次应该注意的是main函数。正如进入一个单位办事必须先从大门进入一样,C程序中的逻辑入口点是main函数。此函数的作用有三个。第一个是为操作系统向程序提供的参数保留占位符;第二个则是程序向操作系统提供的返回状态保留占位符;最后一个是为操作系统替开辟此程序的新进程提供进入点。每个C工程都必须有唯一一个main函数(保存在某个实现文件中)。
很多人不太在意main函数的写法,经常写成如下形式:
void main()
其实这是不对的,因为这不是标准C中规定的写法,因此是不可移植的。以下两种形式才是具备移植能力的标准写法:
int main();
int main(int argc, char **argv);
    最后值得注意的是C语言的“按功能分离代码形成模块”的设计原则。使用此原则可以较好地组织代码,形成良性结构。比如将所有标准的输入/输出代码写入不同的实现文件中,再由一个统一、包含了所有输入/输出函数原型的头文件来对外提供访问信息。读者应该严格按这个原则来进行模块划分和代码编写。
    以上就是我们可以从极小化的经典C代码中看出的一些东西。不过每一个东西都足够让我们研究好长一段时间了(主要是“意会”的时间太长了:()。Let us go!
对待处女,谁污染,谁治理。 对待内存,谁分配,谁释放。

TOP

2     雄关漫道从头越
2.1     小是小非的问题
2.1.1     常量与变量
      编程中用得最多的,大概就是常量和变量了。
*常量
      通常常量分两个层次,即物理存储的常量与逻辑常量。物理层面(特指RAM中)的常量并不存在,因为RAM本身就是可读可写的,并没有什么物理机制可以限定RAM中某区域的读写权限。所以存储在RAM中的常量实质是个变量。那为什么称其为常量呢?
      一般教程中叙述的常量指的都是逻辑常量,即在逻辑上,此量值是不可改变的。由于RAM中不存在完全的常量,因此程序中的常量是由编译器用变量加上逻辑规则限定而仿真出来的。如下所示:
          const int i = 0; /* 实质是个变量 */
          i = 1;  /* 哈,编译器知道你“想在逻辑上改变常量值”的意图,不会让你通过的 */
      编译器会在逻辑层面严格禁止程序员修改常量的值。但是常量的物理存在是变量,所以我们可以这么干:
          int *a = (int *)&i;  /* 强制转换地址的类型 */
          *a = 5;  /* 哈,编译器怎么办? */
      任何编译器都应该允许以上代码通过编译(因为语法上完全正确),不过好的编译器更应该给出一个warning(因为语义上有错):间接修改常量的值可能会导致错误。程序员不应该写出这样的代码,这根本就是搬石头砸自己的脚。常量就是不可修改的量值,在逻辑上必须完全遵循这一规则。
      从表示的方式来看,可以将常量分成两类:存储常量与字面常量(literal constant)。存储常量就是上面说的以变量仿真出来、以二进制形式保存的常量。字面常量则是直接保存在代码中的、以文字形式表现出来的常量。比如:
           const int b = 0;    /* 0就是一个字面常量 */
           char *str = “test!”;  /* 以引号定界的字符串也是字面常量 */
      在编辑期,字面常量常常被修改。而在编译期时字面常量会被编译器转换成二进制值保存在二进制代码区或者全局数据区中。
*变量
      变量没什么可说的。变量名起双重作用:作为变量的标识符,作为变量地址的占位符。说白了就是标识人脑比较难于记忆的地址值,然后在代码中为它占个位置。在编辑期看到的所有变量名到了编译期通通会被编译器替换成恰当的地址值(直接值或者是EBX[]这样的寻址方式),感兴趣的读者可以反汇编C代码来看看。
对待处女,谁污染,谁治理。 对待内存,谁分配,谁释放。

TOP

我就喜欢用void xxx()  看来以后要改一改~~又学到点知识~~~顶~~
http://hi.baidu.com/fengze

TOP

楼主能在七天内不管懂多少啃完C,应该和恶补过QB有很多的关系,要不估计咬不大动

我QB只是N年前翻过一半,这几天晚上在看C,结果只看了20多页就被整的睡过去了......
空着的感觉挺好的......

TOP

语言是枯燥的。如何在枯燥中寻找乐趣,是学习推动力的来源:)

孔子云:学而不思则惘。
我说:惘极而困之。
对待处女,谁污染,谁治理。 对待内存,谁分配,谁释放。

TOP

const int i = 0; /* 实质是个变量 */


const 是C的关键字吗???
寻找辣辣!!!

TOP

C++是对C的扩充,我太想学好C了,但是学到了指针就如楼上所说的一样,老弄的晕忽忽的
有的时候就连循环也会把我弄蒙。在自己晕的时候真的很闹心,直接影响情绪。
别人说啥就是啥啊???

TOP

我前GF给我寄来一本潭浩强的《C++程序设计》, [s:57] 都看了半年了还是不咋地,关键是高考太紧张没时间看,这下好了,解放了,抽空看完它,看不懂也撑着眼皮子看,最多的一次看了30页,那个瞌睡劲儿大家应该都有体会 [s:75]

TOP

幸好我没看国潭浩强的C/C++教程,本人觉得《C++ Primer Plus 》这本书就非常不错,适合初学者也适合有一定基础的人看!

TOP

大家觉得是C好点还是delphi强点啊?自己不知道学习哪中语言~~请大家说说自己的看法.
黑暗是我生命的主题......

TOP

可以更加详细么?.

int main(int argc, char **argv)
//为什么可以用void和int..两者有什么区别?..
//括号中间的char 是申明字符行的**argv?..星号又是什么意思哦?

TOP

引用:
这里是引用第[19 楼]onepiece2006-08-26 23:46发表的:
信息来源:邪恶八进制信息安全团队(www.eviloctal.com
是不是说C语言是所有语言的基础一定要吖的好呢,我是新手所有不太明白 [s:46]
不是说C语言是所有语言的基础
但是
要对系统作深入研究
就离不开C语言了

TOP

初学编程可以看看VB,再学C,这样更容易理解

TOP

我感觉我买的<<C++入门经典>>这个不错,因为它是一章一章的讲!!!很详细!!!呵呵!看完了,把他当作查询的书也可以!!!

TOP

希望再次发这样经典的帖子(个人觉得经典)
如果自己真的错了就承认错误吧。 如果自己真的对了就争取原则吧。 如果自己真的放弃就安静反省吧。 如果自己。。。。。。。。。。。 太多太多的事情。。。。。。。。

TOP

我学习了2年  困了2年。。。结果C语言只有38分。。挂掉。。。至今毕业证无奈的和我无缘。。。

TOP

我是借别人的书来看
总的来说
枯燥
delphi就不一样
感觉,用他写出来的东西挺"高贵"
vb当然简单了,从各大黑客站上发布的某某某记事本,黑客专用记事本,无非多了几个文本控件.汗.

TOP

困的感觉,确实很让人郁闷。
谭的C我买过两次,是同一本,而且都是在地摊上,但都没看完,看到指针就晕乎了。
安全?安全!

TOP

那是叫项目牵着鼻子走学的比较快..做个小游戏,小工具什么的 回头再找书
这样比较有效果
寂寞谁比冷寒冰

TOP

int main(int argc, char **argv)
//为什么可以用void和int..两者有什么区别?..
//括号中间的char 是申明字符行的**argv?..星号又是什么意思哦?
C/C++ 中从来没有定义过void main( ) 。C++ 之父 Bjarne Stroustrup 在他的主页上的 FAQ 中明确地写着 The definition void main( ) { /* ... */ } is not and never has been C++, nor has it even been C.( void main( ) 从来就不存在于 C++ 或者 C )。

char **argv 等于char argv[][].你可以看下相关的C的书..里面都会说细介绍的...

TOP

 70 123
发新话题