博文

给使用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函数说......

阅读全文(4857) | 评论:14

函数声明省略类型的问题(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;
}

......

阅读全文(4144) | 评论:6

[转载]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) 来清空......

阅读全文(4804) | 评论:7

[转载]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 标准中,只有以下两种定义方式是正确的:

 ......

阅读全文(9368) | 评论:22