编程问题集锦 C语言.doc_第1页
编程问题集锦 C语言.doc_第2页
编程问题集锦 C语言.doc_第3页
编程问题集锦 C语言.doc_第4页
编程问题集锦 C语言.doc_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机程序设计答疑讨论文档集锦收集日期:开学6月19日整理:张贞艳指导教师:罗智勇类型一:语法上的问题关于scanf与printf的输入输出问题(1)scanf(%d,%d,%d,&a,&b,&c); 和 scanf(%d%d%d,&a,&b,&c); 的区别(2)输入输出相匹配(3)为甚麽输出的有乱码?(4)关于输入时加空格的问题(5)关于指针地址的输出其他输入输出问题(1)怎样应用转义字符C语言符号应用问题(1) 什么时候用“=”,什么时候用“=”?C及C+语言中的函数问题(1)pow函数(2)关于开根函数(3)编写函数时忘了返回值(4)main函数定义错了(5)int main 与void main 有什麽区别?(6)子函数定义时不小心在后面加了一个分号(7)函数名字拼写错(8)关于构造函数概念模糊关于头文件的问题(1)用strlen却出错了关于cin 和cout输入输出问题(1)怎么用cin将用户输入的字符串扫描进去(2)void 类型的返回值不能插入到流里关于类的定义出现的问题(1)没有main函数类型二:逻辑上的问题未定义或初始化就应用(1)没定义就应用(2)未初始化就应用逻辑错误导致的非法操作(1)非法除零(2)数组越界错误(3)指针的非法赋值语法错误导致的逻辑或其他错误(1)实型数据的格式符号(2)关于double和float的区别(3)for语句别忘逻辑分析错误例(1)统计字符串中数字时出错例(2)控制变量i,j混乱导致逻辑出错概念不清晰引起的逻辑错误(1)继承与派生概念不清晰(2)引用与拷贝概念不清晰指针运用不当引起的逻辑错误(1)指针未初始化就应用(2)指针指向的空间是否充足类型三:程序开发环境C+运行的问题(1)不能编译,不能关闭(2)无法打开Debug文件(3)装插件出现问题(4)打不开dsw文件(5) 怎麽重命名project(6)输入的数据超过的数组的长度为何没溢出(7)编译时老是显示Error spawning cl.exe(8)程序运行显示框里汉字显示的问题(9)warning的出现与消失(10)关于插件Visual Assist X(11)提示没有磁盘(12)错误:unresolved external symbol 是什么意思?类型一:语法上的问题关于scanf与printf的输入输出问题(1)scanf(%d,%d,%d,&a,&b,&c); 和 scanf(%d%d%d,&a,&b,&c); 的区别 如果程序里scanf(%d,%d,%d,&a,&b,&c);那么输入的时候 要输入 “数字,数字,数字”才能得出最大值 如果输入“数字 空格 数字 空格 数字”的话得出的是最小值请问这是为什么 ?在写程序的时候写哪种会更好? 回复:1 因为空格后面的数字都没有输进去,格式不符,所以得到不正确的结果,而且不是最小值,只是你输入的第一个数字罢了,因为后面认可成功的字符转化后是一个很小的负数。2 #includevoid main()int a,b,max;scanf(%d %d,&a,&b);if(ab)max=a;elsemax=b;printf(max=%dn,max);如果%d和%d之间有个空格,在程序运行时就可以输入数字空格数字然后回车就得到正确答案了。(2)输入输出相匹配为什么如下图输入,输出结果是那样的。回复:有一个原则必须把握:printf和scanf中引号内部的格式符号如%d,%f,%c,%s等等必须和后面要处理(输入或输出)的数据类型必须是匹配的!你的c和a均是字符数组名,可以当作字符串处理,格式符号是%s,而你写的是%c,这个只能对应着字符型数据的处理!(3)为甚麽输出的有乱码?为什么输出有乱码?回复:注意:用%s输出时,是以字符串输出。该字符串必须以零字符结束。如果没有,那么计算机一直向后寻找,直到找到零字符为止,因此在找到零字符前会有可能会碰到一些不确定的内容,可能就是乱码。上述代码把code7也赋值了。(4)关于输入时加空格的问题老师,今天上午问你的关于输入时加空格的问题,这是运行结果为什么加空格不可以?C环境,不能自动识别空格么,不能按照我们的想象,以空格作为各字符的区分么?若,如下:scanf(%c %c,&a,&b);则输入时要在两字符之间加空格。除此之外,还有什么情况,C环境可以识别我们输入的空格?回复:你输入的时候不要加空格。输入:Umtorhs 在使用scanf时,空格和回车符号不能作为连续%c输入的数据分隔符号;而对于连续输入的%s,%d,%f数据空格和回车都可以作为数据的分隔符号。实际上可以这样理解:%c输入字符数据,一个%c仅对应一个字符,因此输入字符数据也就没必要使用分隔符号。(5)关于指针地址的输出如下图所示,从输出的结果看,pointer2的地址在pointer1之前,系统先为pointer2开辟存储空间么?回复:你并没有输出pointer1和pointer2两个指针变量的地址,你输出的是pointer1和pointer2的值,它们的值分别是变量a和b的地址。你说错了吧? 至于a和b两个变量那个先分配,这个由编译器决定;分配后这两个变量的地址到底谁先谁后,说不清楚。可以使用printf(pointer1=%p,pointer1);来打印变量a的地址。其他输入输出问题(1)怎样应用转义字符 罗老师,转义字符 (例101 与A等价)怎麽用?怎麽在程序里表达看出二者等价?老师能举个例子吗?回复:1. #include void main()char c1 = 101, c2 = 65, c3 = 0x41;printf(%cn, c1);printf(%cn, c2);printf(%cn, c3);你可以看到三个输出都是A2. A是一个错误,千万小心!应该是A3. c3 = 0x41;与c3 = x41;有什么区别?4. 还有一个例子:有点不一样:#include void main()char c1 = 101, c2 = 65, c3 = x41;printf(%cn, c1);printf(%cn, c2);printf(%cn, c3);你可以看到三个输出都是A.C语言符号应用问题(1) 什么时候用“=”,什么时候用“=”?老师,我对什么时候用“=”,什么时候用“=”,还不是特别清楚,我问同学,得到的答案不一。您能不能给我再讲讲。回复:虽然它们形式上就差一个=,但意义差别极大。(1)=是关系运算符,用于判断两个值是否相等。例如,给定两个变量a,b;如果a和b的值相同,则表达式a=b的值为真(非零),否则为假(零)。经过这样的比较,a,b的值都不会有任何变化;关系表达式一般(但不绝对)用于if语句、while语句等等的条件判断等等。if (a=b).(2)=为赋值运算符,专门用于给变量赋值。int a, b;a = 3;这时a的值变为3。如果还有语句:b = a;这时b的值也被赋值为a的值(3),a的值不会发生改变,仍然为3。注意:赋值表达式的值为变量赋值后的值。例如:表达式a=3的值为a赋值后的值(3);总的一句话:给变量赋值只能用赋值运算符=;判断两个值是否相等用=;如果该判断两个值是否相等的地方,少了一个=,就成了赋值运算了!决不能混淆!实例:1“=”与“=”混淆 请问老师,为什么第一个程序可以得出正确结果,而加了后面几步的第二个程序却没有结果了呢?第一个程序代码:#includevoid main()int A,B,C;int a,b,c;for(A=0;A=2;A+)for(B=0;B=2;B+)for(C=0;CA)+(A=C);b=(AB)+(AC);c=(CB)+(BA);if(AB&BC)&(ab&bC&CB)&(ac&cA&AC)&(ba&aC&CA)&(bc&cA&AB)&(ca&aB&BA)&(cb&ba) printf(C,B,An);第二个程序代码:#includevoid main()int A,B,C;int a,b,c;for(A=0;A=2;A+)for(B=0;B=2;B+)for(C=0;CA)+(A=C);b=(AB)+(AC);c=(CB)+(BA);if(AB&BC)&(ab&bC&CB)&(ac&cA&AC)&(ba&aC&CA)&(bc&cA&AB)&(ca&aB&BA)&(cb&bC)&(a=b)&(aCn);elseif(A=B)&(Ac) printf(A=BB)&(a=c)&(aBn);elseif(A=C)&(Ab) printf(A=CA)&(b=c)&(bAn);elseif(B=C)&(Ba) printf(B=CAn);elseif(A=B)&(B=C)&(a=b)&(b=c) printf(A=B=Cn);回复:第二个程序,看到倒数第3行了吗?if(A=B)&(B=C)&(a=b)&(b=c) printf(A=B=Cn);又开始犯=和=混淆的错误!2小心“=”与“=”这是我写的饭量的错误的代码#include void main()int A,B,C,a,b,c;for (A=1;A=3;A=A+1)for (B=1;B=3;B=B+1)for (C=1;C=3;C=C+1)a=(AB)+(AC);c=(CB)+(BA);if(a=b&bc) printf(C,B,An);if(ac&cb) printf(B,C,An);if(ba&ac) printf(C,A,Bn);if(b=c&ca) printf(A,C,Bn);if(c=a&ab) printf(B,A,Cn);if(cb&ba) printf(A,B,Cn);for里面初始值从1到3的结果不正确,但是0到2却可以,为什么?回复:注意 :a=(AB)+(A=C);判断是=,不是= !C及C+语言中的函数问题(1)pow函数 关于那个n次方,运算符号应该是但是左右不能是double定义变量,应该是什么?回复:1. 求指数可不是用运算符 !而是用函数pow请参见教材附录E P309 上部表格第4行。要使用pow函数,必须包含头文件math.h下面是一个例子:求x的y次方。#include #include void main()double x, y, z;x = 1.2;y = 2.3;z = pow(x,y); / 求x的y次方printf(x的y次方为:%lfn, z);(2)关于开根函数问题如图所示回复:函数调用的语法错误:n=sqrt(m);没有那么多double附录中介绍的函数,那是函数的声明,因此要告诉你函数的名称、函数的参数有哪些、参数的类型都是什么、返回值是什么类型。而你使用这些函数(函数调用)时,就不需要这些说明了。(3)编写函数时忘了返回值这是什么意思?回复:1. 求最大公约数的函数有问题,没有返回值。2. 不能除函数名啊,imax是函数名。(4)main函数定义错了如图所示,下面所说出现的错误是为甚麽?回复:没有main函数,或者main函数定义写错了。检查一下是不是main拼错了。(eg:写成mian)(5)int main 与void main 有什麽区别?以课上例题评委打分为例。课件上是int main还有return 0。但当我删掉return 0后程序还能正常运行。而改成void main和删掉return 0也能照常运行,他们有什么区别,为什么要用int main?回复:main也是一个函数,在定义main函数时,如果你不想main返回一个值,定义成void就可以了,这时main里面可以不要return语句,计算使用return语句,return后面直接用;而不需要任何表达式。如果想让main返回数值,如int,定义成int main,这是必须有return (整型表达式);语句。到底main要不要返回值,由程序员决定,如果你觉得需要main返回值表示程序运行结果的情况,你可以指定返回值,如果觉得不需要,就用void定义main函数。(6)子函数定义时不小心在后面加了一个分号如图所示的错误是什麽意思啊?回复:看到函数定义头部的后面的那个“;”号了吗?实例:1. 这个是什么错误 #include #include #include int index(char *s,char *t);void main()char *a,*b;printf(please input:);scanf(%s,b);printf(please input:);scanf(%s,a);int index(char *a,char *b);int index(char *s, char *t);for (int i=0;istrlen(s);+i)for (int j=0;tj&tj=si+j;+i)if(tj=0) return i;return -1;代码于是错误是F:大一下程序设计hm21133.cpp(15) : error C2447: missing function header (old-style formal list?)这是啥意思回复:把倒数第11行int index(char *s, char *t);最后的分号去掉,就ok啦,子函数只是需要在最初声明时加分号,而在具体写这个函数代码时函数的头部不加分号!(7)函数名字拼写错不知道是什么错误 :#include#define N 10int max(int x,int y,int z=0)int k;if(xy)k=x;elsek=y;return (kz?)k:z;int max(int *x,int y)int max=x0,i;for(i=0;imax)max=xi;return (maxy?)max:y;void mian()int sN,i;coutif the numbers you want to compare more than 3,please input themn;for(i=0;isi;coutmax(1,2)n;coutmax(2,3,4)n;coutmax(s,7)n;错误是:LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _mainDebug/函数重载.exe : fatal error LNK1120: 1 unresolved externals不知道是什么错误。回复:void mian()!别拼写错了!(8)关于构造函数概念模糊课上的这个实例class Rectangle : private Location public:void InitR(int x,int y,int w,int h);void Move(int xOff,int yOff);int GetX() coutX=;return Location: GetX();int GetY() cout”Y=; return Location:GetY();int GetH() cout”H=; return H;int GetW() cout”W=; return W;private:int W,H;我认为那个initR和initl的功能不就是数据的初始化,就是构造函数啊,可是当我用与类同名的构造函数做相同的事的时候就会有很多ERROR请问这是怎么回事?回复:关于构造函数和一般成员函数的区别:1. 从语法上讲:构造函数也是成员函数,但与一般成员函数的区别在于几点:构造函数与类同名、无返回值;对象定义时自动调用,可以(注意,我用了“可以”一词)在构造函数内为对象的数据成员进行初始化;从这个角度上来说构造函数和普通成员函数之间的差别是一目了然的。2. 不错,InitL,InitR函数的功能确实是对Location和Rectangle类的数据成员进行设置,但它们决不是构造函数,不具备任何构造函数的特点,与构造函数何干?至于InitL和InitR函数可以作为对对象数据成员修改的外部接口,可以在对象已经构造好后,通过它们对数据成员进行修改,这不挺好吗? 注意:区别构造函数和普通函数不是从功能上区分的,而是从语法上。关于头文件的问题(1)用strlen却出错了 老师,我在作业里用了strlen,可是出错了。一下是代码#include#includeint index(char *s,char *t)void main()char *a,*b;printf(please input:);scanf(%s,b);printf(please input:);scanf(%s,a);int index(*a,*b);int index(char *s,char *t)int i,j,k;bool flag=false;for(i=0;istrlen(s);i+)if(si=t0)k=i;for(j=0;jstrlen(t);j+,i+)if(si=tj)bool flag=turecontinue;elsebreak;if(flag=flase)printf(-1);elseprinf(%d,k):回复:不是#include而是#include关于cin 和cout输入输出问题(1)怎么用cin将用户输入的字符串扫描进去用cin将用户输入的字符串扫描进去要怎么写代码啊?回复:char s20,t20;coutst;(2)void 类型的返回值不能插入到流里error C2679:binary : no operator defined which takes a right-hand operand of type void (or there is no acceptable conversion)回复:在定义 showTime时是void 类型已经有cout在调用时,又用了cout 重复了。void类型的返回值是不能插到流里的(不能输出空类型)。关于类的定义出现的问题(1)没有main函数老师,请问一下,为什么有两个错误?!和书上一样啊!#includeclass Circleprivate:int r;double s;public:void Set_R() cinr;double Get_S();double Circle:Get_S()s=3.14*r*r;return s;Compiling.三章.cppLinking.LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _mainDebug/三章例一 圆.exe : fatal error LNK1120: 1 unresolved externalsError executing link.exe.我看不太明白回复:程序没有main函数类型二:逻辑上的问题未定义或初始化就应用(1)没定义就应用E:wbj求方程解求解.cpp(6) : warning C4700: local variable b used without having been initializedE:wbj求方程解求解.cpp(6) : warning C4700: local variable a used without having been initializedE:wbj求方程解求解.cpp(6) : warning C4700: local variable c used without having been initializedLinking.回复:你的变量定义后,没有初始化就取变量的值了。我们强调过:变量定义后,变量的值是不确定的,其值不能使用,必须先给它赋值后(取有意义的值)后才能使用。遇到这种情况,vc将给出警告。你可以将代码贴出来,给大家看看。这是代码,可是隔一天之后测试就没有warning了#include #include void main()double a,b,c,t,x,x1,x2,x3,x4,real,image;t=b*b-4*a*c;printf(input three numbers:);scanf(%lf,%lf,%lf,&a,&b,&c);if(a=0)x=-c/b;printf(%fn,x);elseif(t=0)x1=-b/(2*a);x2=-b/(2*a);printf(%f,%fn,x1,x2);elseif(t0)x3=(-b+sqrt(t)/(2*a);x4=(-b-sqrt(t)/(2*a);printf(%f,%fn,x3,x4);elsereal=-b/(2*a);image=sqrt(t)/(2*a);printf(%f+%f*in,real,image);printf(%f-%f*in,real,image);回复:错就错在main函数的前两行:double a,b,c,t,x,x1,x2,x3,x4,real,image;t=b*b-4*a*c;刚定义完这么多变量,马上就用abc去计算t的值。abc还没输入呢!(2)未初始化就应用A,B都是0,C,D都是1,這很好,但是爲什麽sum不是2呢?(sum=A+B+C+D)回复:best定义后没有做任何初始化,就用best去计算A,B,C,D这时best的值是不确定的,有何意义?进而再去计算sum,当然不可能获得正确结果。应该将ABCD的计算放到best = 2+k之后。逻辑错误导致的非法操作(1)非法除零测试时就会出现这个,没有错误和警告回复:这就是逻辑错误,编译没有错误和警告只能说明没有语法错误。我认为可能是错在a/a,除零是非法的!此时a=0导致除零出错。例 1为什么会有Debug error? #includeint readdate(int *m, FILE *h)int d,num=0;if(h=fopen(in.txt,rt)while(1=fscanf(h,%d ,&d)*(m+num)=d;num+;return(num);int calvalue(int q,int s)int m,n;m=q%10;n=q/10;if(n=0)return(s=s+m);elses=s+m;calvalue(n,s);void main()FILE *in;FILE *out;out=fopen(out.txt,wt);int arr200;int *p=arr;int j,i,calv=0,totcnt=0,totpjzr=0;float totpjz=0;j=readdate(p,in);fprintf(out,%dn,j);for(i=0;ij;i+)calv=calvalue(arri,0);if( calv%2=0)totcnt+;totpjzr=totpjzr+arri*arri;totpjz=totpjzr/j;fprintf(out,%d %fn,totcnt,totpjz);只写了第一个函数和main函数时,还未出错,写了calvalue函数后,本来显示0个错误,但是运行时就有debug错误。我调试了程序,到最后一条fprintf语句前都是正确的,totcnt和totpjz的值也没有问题,但是一执行最后一条fprintf语句就有debug错误。我的in.txt内容是:23 456 789 98 64回复:据我的调试,你的错误发生在倒数第三行:totpjz=totpjzr/j;这里j=0,导致除零操作非法。(2)数组越界错误如图,程序并没有errer,但运行时会有显示警告的对话框回复:没有error只能说明没有语法错误,程序运行结果不正确说明有逻辑错误,你的程序中有一个数组越界错误:int fish5;其下标应该只能从fish0到fish4。然后看看你的最里层for循环,for(i=0; i 5; +i).fishi+1. / 注意当i=4时,fishi+1为fish5, 越过了数组边界。(3)指针的非法赋值为什么*(b+i)=*(a+i)(a,b是字符数组)可以赋值,而*temp=*p1(temp是int型)不行? 如课本p217所说,*temp=*p1中,对*temp赋值就是向一个未知存储单元赋值,可能破坏系统的正常工作状况,而p231程序第六行中,*(b+i)=*(a+i)却可以,为什么呢?回复:这个你要根据上下文理解:1. 如果:temp没有指向一个确定的int变量,也就是说temp指针没有初始化,指向不确定的地址,那么通过temp对temp指向的变量进行赋值是非法的;2. 如果b、a已经被初始化,并且b+i、a+i都指向了确定的变量,那这种赋值就是合法的。这是判断赋值是否合法的标准:指针变量指向确定的变量了吗?语法错误导致的逻辑或其他错误(1)实型数据的格式符号如图所示,编译时没有一处错误,运行时无论我输入的r为甚麽值结果总是那个数字,运行其他程序时都正常,这是为甚麽?回复:1. 没坏。原因是float和double有一个细微的差别,请大家小心使用:float:单精度实型,格式符号一般使用%f;double:双精度实型,格式符号使用%lf;特别是使用scanf输入实型数据时,一定小心。将你的程序scanf(%f, &r);改为:scanf(%lf, &r);至于printf中的%f,是否需要修改?使用%f输出double数据,如果该双精度型数值超出了float的取值范围,仍然可能输出错误的结果;否则,你可能觉察不到错误。(2)关于double和float的区别#includevoid main()float x;scanf(%f,&x);if(x=0)printf(y=0n);elseif(x0)printf(y=1n);elseprintf(y=-1n);如果把float换成double,结果就不正确了。如果用double必须用%lf才能得到正确结果。用%f就必须用float才能得到正确结果。这是为什么。double和float的区别难道不只是范围大小么。回复: float和double在计算机中是近似表示的,判断一个float或者double型数据是否等于零,不能直接使用x=0,而应该看看x的绝对值(使用绝对值函数fabs)是否小于一个很小的数,比如:1.0e-6;#include .double x;.if (fabs(x) 1.0e-6).(3)for语句别忘回复:最后一个for语句的循环体里有多条语句为什么不用括起来?实例1. 选择法排序老师,选择法排序我的程序没有语法错误,可是没法得出结果。一下是代码。#includevoid main()int a5,i,j,max,k;for(i=0;i5;i+)scanf(%d,&ai);for(i=0;i5;i+)max=a0;for(j=0;j5-i;j+)if(max=3)for(j=0;j5;j+)printf(%d,aj);回复:1. 你这段代码最大的问题是,for语句的循环体有多条语句,却没有使用括起来。这是一个重大的逻辑错误,一定要引起注意。2. 这是正确的一段代码for(j=0;j4;j+)max=a0;for(i=0;i=max)max=ai;number=i;anumber=a4-j;a4-j=max;逻辑分析错误例(1)统计字符串中数字时出错输入不同数字时结果正确,数字相同时出现如图情况,请问为什么?回复:有两个错误1 在数字的统计语句中有错误(countstri-0)+;这句与上下程序有逻辑错误sum+;/ 就可以了2 其中i不能等于6!例(2)控制变量i,j混乱导致逻辑出错这是课件中的正确程序:main() int a23=1,2,3,4,5,6;int b32,i,j;printf(array a:n);for(i=0;i=1;i+) for(j=0;j=2;j+) printf(%5d,aij); bji=aij;printf(n); printf(array b:n);for(i=0;i=2;i+) for(j=0;j=1;j+)printf(%5d,bij);printf(n);罗老师,我自己写这个程序时最后一步错写成打印bji了,输出的并非是行列互换的结果。为什么在令bji=aij之后应该打印的是bij而非bji呢?错误写法的结果又是为什么变成那样排序了吖?回复:1. 你的程序可是够乱的,注意养成良好的编码习惯,采用缩进格式。2. 关于你的问题:(1) 在开始的双层循环中,我们是以a数组为主体,对a一行一行进行遍历的,i为行号,j为列号。因此这时aij要赋值给bji。这个双层循环结束后,b数组中已经有a转置后的结果了。(2) 后面那个双层循环,主要作用是一行一行的打印b数组的内容。这个时候是以b为主体的。两个控制变量i和j赋予了新的意义,分别表示b的行号和列号。这就很清楚了。我想你的问题是将前后两个双层循环的控制变量i,j弄混了。变量的物理意义在程序中并不是一成不变的,程序员可以根据需要,重新利用以前废弃不用的变量(如前面的i,j)并重新赋予新的物理意义。这种现象在循环控制变量的多次重复利用中经常见到。在这种情况下,一定要注意变量的物理意义的变化。概念不清晰引起的逻辑错误(1) 继承与派生概念不清晰这是我的代码#include class Apublic:void initA(int xx,int yy)x=xx;y=yy;int getx()return x;int gety()return y;private:int x;int y;class B:public Apublic:void initB(int x,int y,int hh);int getx()return A:getx();int gety()return A:gety();int geth()return h;private:int h;void B:initB(int x,int y,int hh)initA(x,y);h=hh;#include location.h#include void main()B b;b.initA(1,2);coutb.gety()endl;A a;couta.getx()endl;还是那个问题,main函数里b调用了initA,按理说x,y就被附上值了,那么为什么b.gety()可以打印出2,而a.getx()就是不时1呢? 回复:在你的main函数中,b和a是两个不同的对象(有不同的存储空间,完全独立),b.initA(1,2);只能对b的数据成员赋值,与a有什么关系?A a;定义对象a,并没有构造函数为a的数据成员初始化,因此a.getx()得到的值就是不确定了。(2) 引用与拷贝概念不清晰Class CfooPublic:Cfoo& SayAh() cout “Ah”; return *this; Cfoo& SayOh() cout “Oh”; return *this; 为什么SayAh,SayOh的返回值要采用引用呢?我试过不加引用符号,也可以连着输出foo.SayAh().SayOh().SayAh().SayOh();另外为什么当ostream& operator(ostream& out, const CComplex& c)不写&时报错是这样的?error C2248: ostream:ostream :cannot access protected member declared in class ostream回复:1. 在这个例子中加不加引用符号结果是一样的。原因是在这个类中实际上只有几个成员函数,没有数据成员,使用拷贝和引用结果都是一样的,但是运行机制却很不一样,使用引用时不会产生拷贝对象。2. 原因是cout的类ostream不提供公有形式的拷贝构造函数,因此你不能去掉引用而使用拷贝。例2CComplex operator+(const CComplex c) const;和CComplex operator+(const CComplex& c) const;运行结果没有区别,为什么?哪种更好?回复:概括的来说,第一个是传拷贝,会新拷贝创建一个局部对象c;第二个是引用,没有新的对象创建,c就是实在参数对象的引用。指针运用不当引起的逻辑错误(1) 指针未初始化就应用我在做第十四次作业文件处理时,编写完代码,没有错误,但是在看效果时却出现了这样的情形,我在调试时发现走到如图的地方时就出现了这个对话框,这是什么意思?回复:指针p未初始化!(2) 指针指向的空间是否充足调用拷贝构造函数重载“+”不可以吗 CSimpleString CSimpleString:operator +(const char *p)CSimpleString ts(*this);strcat(ts.m_szp,p);return ts;CSimpleString CSimpleString:operator +(const CSimpleString &s)CSimpleString ts(*this);strcat(ts.m_szp,s.m_szp);return ts; 回复:我想是可以的。但是,你的代码有严重危险:就是strcat(ts.m_szp,p);和strcat(ts.m_szp,s.m_szp);ts.m_szp的空间不足。类型三:程序开发环境C+运行的问题(1)不能编译,不能关闭 为什么修改后有时编译连接和运行键都不能用了?还有想关闭时,会弹出一个对话框让点击stop build,可是点了之后不管用,还是不能关。回复:这个只能强制终止vc程序。出现这种情况,按以下步骤:【1】. 在vc集成开发环境中file菜单,save all,保存你的工作;【2】. 打开任务管理器,在windows任务栏按右键,选择任务管理器;【3】. 在进程列表中,右键点击进程名字为msdev的进程,选择终止。【4】. 重新打开你的工程。(2)无法打开Debug文件我在自己的电脑上编写程序,可是编译的时候它说无法打开我创建的Debug文件,我不知道为什么会这样,截屏的效果如下回复:不要将你的工程建在C盘的目录下,重新创建一个工程创建到D盘或者其他地方。这可能是Vista系统的问题。(3)装插件出现问题刚开始装VC+时没有问题,后来装了一个Assist X之后就出如图问题了,不过VC+也能用。就想问是什么出了问题。还有,所有软件均是网上下的回复:1. 把你装的这个Assist X卸载了吧

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论