工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 4211|回复: 13

[原创]C/C++常见问题[7.9更新]

[复制链接]
发表于 2005-7-1 23:02 | 显示全部楼层 |阅读模式
总结了一些C/C++里会遇到的一些问题,会不继更新。

1、在C++里,要使用IO流,须包含头文件iostream,要注意,没有.h后缀的(在VC++.NET里),如果还有错误,试下用上这句:using namespace::std;。

2、getch()与getchar()的区别
   两者都是从键盘接收输入字符,getch()是得到键盘输入,不需要回车确定。而getchar()则要回车确认。

3、当程序中要输入数据时,如果程序逻辑没有问题但结果老是错,那就要看看是不是输入数据时没有接收回车,把回车当成了下一个数据的输入了,可以用getchar()来接收回车。

4、说说声明和定义
   我们的教科书上好像对这个问题说得不够清楚。不过这个问题也是一个不易说得清的问题。谭浩强老师是这样说的:“在声明部分出现的变量有两种情况:一种是需要建立存储空间的(如:int a;),另一种是不需要建立存储空间的(如:extern int a;)。前者称为定义性声明或称定义,后者称为引用性声明。”。
   一般情况下,我们没有严格区分两者,但当做比较大的系统时,个中带来的问题也不是很易处理。比如:在文件head.h中定义一个变量int a;然后文件a.c和b.c都include这个头文件,编译链接后会提示重定义,那是因为编译成目标文件时,编译器在a.c和b.c都把head.h展开了,当连接的时候,两个目标文件都有int a 的定义,编译器就报重定义错误了。
解决方法:在头文件里声明,在.c文件里定义。在head.h里声明extern int a;在a.c里定义int a;这样在b.c都可以使用变量a了。
当编译器编译时,对于head.h里的int a,只是声明了一个变量int a,并没有分配空间,当在a.c里才真正定义,在b.c里展开head.h时也是只是声明,这样就解决了重定义问题。

5、关于重编译
   当头文件之间出现相互include的时候,就可能出现重编译,防止重编译,只要正规地写就行了。可用以下方式:
#ifndef __XXX_H
#define __XXX_H
……
#endif

/-----------7.2添加----------------
6、使用链表时要注意的问题
   比如有个结构体
   struct A{
      int i;
      struct A *next;
   };
   (1).已创建了一个链表比如a->b->c->NULL,如果想把b删除的话,把a->next=b->next后不要忘记free(b);否则会内存泄露。
   (2).要在b后插入d,须d->next=c;b->next=d;不能乱了顺序,否则会断链。
   (3).在链尾插入一个结点时要注意,如在c后插入一结点e,e=(A*)malloc(sizeof(A));不要忘记e->next=NULL,否则对于以下例子的查找,可能会一直死循环,
   例子,要想从链头查找某个符合一定条件的结点,如统计i=3的结点个数,
   while(p){//p初始指向链首
      if(p->i==3)count++;
      p=p->next;
   }
   因为没有e->next=NULL的话,e->next并不会等于空的,而是一个野指针,循环条件永远为真,这个问题在vc++.net平台下的确是这样的,其它平台没有试过。

/------------------7.5添加-------------./
7、sizeof的一些问题
sizeof的作用就是返回一个对象或者类型所占的内存字节数。
char、signed char和unsigned char的sizeof值为1;
int的sizeof值是4;
指针变量的sizeof是4;
sizeof可以对一个表达式求值,编译器根据表达式的最终结果类型来确定大小,一般不会对表达式进行计算,如sizeof(3-1.5),等价于sizeof(double)。
sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用。
结构体的sizeof值,在32位机器中结构体大小会被调整到4bytes的整数倍。

/------------------7.9添加-------------./
8、在C++里,使用cin得到输入信息时,空格会被认为是输入结束符,空格以后的字符不会读进当前变量里,而会读进下一变量里,而使用gets()函数则可以接收带有空格的字符串,直到回车确认输入为止,当然,用来接收的变量一定要足够放下输入字符串的大小。

[ Last edited by hjack on 2005-7-9 at 12:03 ]
发表于 2005-7-1 23:21 | 显示全部楼层
楼主终于有搞作了。。。顶一个。
回复

使用道具 举报

 楼主| 发表于 2005-7-2 12:24 | 显示全部楼层
wool,不如你整理一份java 的。
回复

使用道具 举报

发表于 2005-7-2 12:37 | 显示全部楼层
楼上的,,,java偶没什么经验,,,不敢班门弄斧。。。
回复

使用道具 举报

 楼主| 发表于 2005-7-2 12:43 | 显示全部楼层
写下你在学习java过程中遇到的一些小问题,对初学者很有帮助的。
况且你是高手来的哦。
回复

使用道具 举报

发表于 2005-7-2 12:49 | 显示全部楼层
楼上。。。俺擅长的不是java的说。。。虽然俺也希望俺是高手。。。

偶总结下web开发方面的东西好了。。。asp,php,javascript这类比较简单的东西。
回复

使用道具 举报

发表于 2005-7-15 17:18 | 显示全部楼层
刚进公司,带我的人除了让我看关于一些通信相关基础的东西之外
就是看一本叫做  \"编程精粹\"  的书,看了两天基本上看完了,
感觉真的如果你需要在编码质量上提高的话,这本书真的是一本好书,
而且感觉如果自己早看这本书,在C 的方面的编程错误并不会出这么多,
也不会要经过很多次惨重的教训之后才能够记住...
回复

使用道具 举报

发表于 2005-10-17 01:45 | 显示全部楼层
楼主我发了java方面类似的帖子了。
回复

使用道具 举报

发表于 2005-10-21 09:59 | 显示全部楼层
对于指针的看法:对于一定的机器平台,一定的OS以及经过一定的编译器编译出来的程序的指针变量的占用内存的大小是一定的,而所谓的指针的类型的作用是在指示在通过指针访问内存的时候的访问的方式,是以int,float或者char等类型还是以其他的自定义类型去访问内存....这样子想的话也许可以比较容易想清楚指针怎么样...
回复

使用道具 举报

发表于 2005-10-27 02:09 | 显示全部楼层
楼上的概念过于长导致我为了理解楼主想说清楚怎么理解指针的概念学习会更容易些而导致我忘记了自己之前理解出来的怎样学习指针的概念而不会混淆的记忆。
回复

使用道具 举报

头像被屏蔽
发表于 2005-11-24 21:11 | 显示全部楼层
越简单越好
回复

使用道具 举报

发表于 2005-12-6 00:59 | 显示全部楼层
大家的句子都好长,我看不懂啊。。。
回复

使用道具 举报

发表于 2006-7-25 14:05 | 显示全部楼层
楼主很久不更新了,顶上来……
回复

使用道具 举报

头像被屏蔽
发表于 2006-11-8 01:35 | 显示全部楼层
真的不错。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2024-5-1 01:29

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表