博文
给使用TC的初学者的一篇文章(2007-10-31 16:58:00)
摘要:给使用TC的初学者的一篇文章 —— 作者:雨中飞燕本文源自雨中飞燕之家C/C++学习论坛http://yzfy.org,转载请注明出处。前言:“TC过时了”,我说。接着就一堆人问,“为什么过时啊?”,“TC不是很好用吗”,“教材上也是用这个啊”,“二级考试不也是规定用的TC吗?”。于是乎我已经无语了。/----------------------------------------------------------------------/一。头文件的问题好了,来看个经典的TC2下在老潭的书的《C语言程序设计(第二版)》,第4页的一段代码:main( ){ printf("This is a C program.\n");}好了,当时的TC2的确允许使用printf和scanf可以不加头文件,也的确允许main()这样的声明。允许是允许了,可是你写成这样对你有好处吗?打个比方,Basic语言知道吗?这种语言可以不声明变量就使用。的确同样也是允许了,可是给我的话,我会要求编译器强制检查变量是不是声明了再使用。为什么?如果你需要用名字是nlen这个变量,当中有一个不小心写成n1en,不强制检查的话,编译器不告诉你错,但运行结果是错误的。但这种错误要是在很多行代码里你怎么找?特别是'l'和'1'如此相似。编译器虽然允许,但你别以为那样写就是好事。说回刚刚的C代码,TC2允许不加头文件,于是不少初学的人习惯了从不写头文件,以为C语言不需要头文件似的。好了,等到看到那本书的138页,那个字符输入输出,用了gets,就突然多了一个#include <stdio.h>,仔细一看,那一页中间有100来字强调了要用库函数,可是没有讲怎么用,下面多了的那一行初学者也可能会觉得奇怪,要是不理解的人就跳过了,要是没留意的更不当一回事了,谁让之前书里一直都没有那句呢。然后,当有的初学者用TC3.0打代码的时候,编译提示说scanf没有声明(或者是用TC2的打了gets函数说gets没有声明),他们就郁闷了,都是按照书的代码啊,都一模一样还会错?于是跑来论坛问。有跑来问的还好,最怕的就是用TC2的,看了数组觉得难还跳了过去的,于是一直都不会写头文件,成了习惯。要是随便换个环境,结果没写头文件的,错了,结果还说自己写C代码写那么多,这里怎么就错了,然后就怀疑编......
函数声明省略类型的问题(2007-09-27 20:02:00)
摘要:且不说新标准禁止这种声明,即使在旧标准下允许,一样带来很麻烦的问题
假设你能通过编译的话:#include <stdio.h>myprint(){ printf("Hello World"); return 0;}int main(){ myprint();//请问这一句到底是函数声明还是函数调用?? return 0;}如果以下这样写:#include <stdio.h>int main(){ myprint();//请问这一句到底是函数声明还是函数调用?? return 0;}myprint(){ printf("Hello World"); return 0;}......
[转载]C/C++语言误区之:fflush(stdin)(2007-06-10 13:59:00)
摘要:1.为什么fflush(stdin) 是错的首先请看以下程序:#include <stdio.h>int main( void ){ int i=1; while(i) { printf("Please input an integer: "); scanf("%d", &i); printf("%d\n", i); } return 0;}
这个程序首先会提示用户输入一个整数,然后等待用户输入,如果用户输入的是整数,程序会输出刚才输入的整数,并且再次提示用户输入一个整数,然后等待用户输入。但是一旦用户输入的不是整数(如小数或者字母),假设 scanf 函数最后一次得到的整数是 2 ,那么程序会不停地输出“Please input an integer: 2”。这是因为scanf("%d", &i);只能接受整数,如果用户输入了字母,则这个字母会遗留在“输入缓冲区”中。因为缓冲中有数据,故而 scanf 函数不会等待用户输入,直接就去缓冲中读取,可是缓冲中的却是字母,这个字母再次被遗留在缓冲中,如此反复,从而导致不停地输出“Please input an integer: 2”。也许有人会说:“居然这样,那么在 scanf 函数后面加上‘fflush(stdin);’,把输入缓冲清空掉不就行了?”然而这是错的!C和C++的标准里从来没有定义过 fflush(stdin)。也许有人会说:“可是我用 fflush(stdin) 解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(linux 下的 gcc 就不支持),因为标准中根本没有定义 fflush(stdin)。MSDN 文档里也清楚地写着fflush on ......
[转载]C/C++语言误区之:void main( )(2007-04-11 18:29:00)
摘要:C/C++语言误区之:void main( )作者:antigloss 很多人甚至市面上的一些书籍,都使用了void main( ) ,其实这是错误的。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 )。下面我分别说一下 C 和 C++ 标准中对 main 函数的定义。 1. C 在 C89 中,main( ) 是可以接受的。Brian W. Kernighan 和 Dennis M. Ritchie 的经典巨著 The C programming Language 2e(《C 程序设计语言第二版》)用的就是 main( )。不过在最新的 C99 标准中,只有以下两种定义方式是正确的:  ......
