博文
给使用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函数说......
函数声明省略类型的问题(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) 来清空......
[转载]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 标准中,只有以下两种定义方式是正确的:
 ......