二级C语言源程序查错 c语言源程序检查错误

\u4e8c\u7ea7C\u8bed\u8a00\uff0c\u5e2e\u5fd9\u68c0\u67e5\u7a0b\u5e8f\u4ee3\u7801\u7684\u9519\u8bef\u3002\u3002

\u6539\u6210scanf\uff08\u201c%f\u201d\uff0c&x\uff09\uff1b\u5c31\u884c\u4e86

case\u548c\u540e\u9762\u7684\u6570\u5b57\u8981\u7528\u7a7a\u683c\u6765\u5206\u5f00\uff0c\u4e0d\u7136\u7f16\u8bd1\u5668\u600e\u4e48\u77e5\u9053\u662f\u4ec0\u4e48\u610f\u601d\u5462\uff1f\uff1f
\u5e0c\u671b\u5bf9\u4f60\u6709\u6240\u5e2e\u52a9

#include "stdio.h"
#define P 3
void *F(int x){return (void *)(P*x*x);}/*定义一个无类型函数,它有返回值,只是返回的值是指向无类型数据的指针*/

void main(){printf("%d\n",(int)F(1+3));/*将无类型函数F返回的指针值通过(int)强制转换为int型*/

还有几个问题,
1.预处理命令行必须位于源文件的开头是对是错?为什么?
对!
编译器在编译源代码时都是从开头到结尾依次读取,自己定义的变量、宏等等都得放前面,这样在编译器在读到它们时就作一个记录;
在使用这些变量、宏时,编译器会在记录中去寻找,如果找不到就会报错——此变量未被定义。

函数可以放在结尾(main()之后),但是必须在开头作一个函数声明(也叫函数原型)以使编译器为它作记录,以便以后使用它时可以在记录中找到它。
函数也可以放在前面(main()之前),此时就不用再声明了,编译器在读到它时也会作一个记录。

总之,自己定义的东西都得先声明后使用,否则使用时在记录中会找不到它。

预处理命令也是自己定义的东西,同属这一范畴。

2.为什么在源文件的一行上不能有多条预处理命令?
每条C语句都有一个“;”作结尾,即使都放一行,编译器都能分辨得出。
预处理命令并不以“#”作为结尾标记,放一行的话编译器是无法分辨的,它会把此行作为一个语句处理

通常的语句最好都分行写,否则程序量大时是不便排错的。

3.若有下列说明和定义
union dt
{int a;char b; double c;}date;
变量data所占内存字节数与成员c所占字节数相同,为什么?

联合体的长度是其最长成员(如double c)的长度。
联合体在内存中的存储形式:
联合体所有成员a,b,c都是同一地址,也就是说他们共同占用这一段内存。
以TC3.0为例,a占这一段内存的头2个字节,b占这一段内存的头一个字节,c占这一段内存的全部字节(也就是头4个字节)

4.为什么以下不对
char *sp;*sp="right!";
char s[10];s="right!";
一、进行字符串赋值时可以在定义时:直接在字符串定义后接“="right"”
如:char *sp="right";
或者 char s[10]="right";

二、也可以在非定义时,这时左值必须是左值必须是字符串指针变量。
如:sp="right!";
以下都是错误用法:
*sp="right!";//左值不是字符串指针变量
s="right!";//左值只是字符串指针 常量

1、如果说*a包含(x和\0),而*b包含(x和y),拿*a-*b会得出什么结果,*a和*b都是char型变量的话

最终的表达式*a-*b中,a points to '\0',b points to 'y',so 表达式*a-*b代表的是'\0'-'y',结果是-121(y的ASCII是121)

point(char*p){ p+=3; }
main()
{
char b[4]={'a','b','c','d'),*p=b;
point(p); printf("%c\n",*p);
}
A.a B.b C.c D.d
选哪个?为什么?

选D,p最初是首地址b,然后p是b+3,此时*p相当*(b+3)、b[3].

2号问题:
main()
{int num[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}},i,j;
for(i=0;i<4;i++)
{for (j=0;j<i,j++)
printf("%4c",' ');/*原题就是'和'之间只有个空格,我也不清楚是怎么回事*/
for(j=__;j<4;j++)
printf(%4d",num[i][j]);
printf("\n");
}
}
printf("%4c",' '); 其中的' '其实是一个空格字符常量,这个同'a','b','c'等字符常量是一样的。
这个语句中%4c是指要读取一个字符(这个字符就是后面的空格字符常量' ')并输出,这个字符在显示器上应该占4格。所以此句的功能是输出4个空格(空格也是属于字符)。
你改成printf("%4c",'a');printf("%4c",'b');试下,它是输出3个空格和一个字符。
printf("%8c",' ');是输出8个空格,这个比printf(" ");来实现输出8个字符来得方便。

若要按下列形式输出数组右上半三角(什么玩意?)。
1 2 3 4 i=0,j=i,那么j可以是0,1,2,3
6 7 8 i=1,j=i,那么j可以是1,2,3
11 12 i=2,j=i,那么j可以是2,3
16 i=3,j=i,那么j可以是3
则下划线处应填入的是?为什么?(B)
A.i-1 B.i
C.i+1 D.4-i

3号问题:
程序中若有下列说明和定义语句:
char fun(char*);
main()
{
char *s="one",a[5]={0},(*fl)()=fun,ch;
......
}
下列选项中对函数的正确调用语句是?为什么?
A.(*fl)(a);
B.*fl(*s);
C.fun(&a);
D.ch=*fl( s);

选择A,根据定义char fun(char*),形参必须是一个字符指针,"a","s"才是字符指针(char pointer),而"*s" is char variable,"&a" is invalid.所以排除B、C

只有fun、*fl才是函数入口地址.
B.*fl(*s);相当于*(fl(*s)),错误,指针运算符只能针对指针运算,fl(*s)得到的是int,不是指针,下同。故排除B、D.
D.*fl( s);相当于*(fl( s));

4号问题
#define S(x) 4*x*x+1
main()
{
int i=6,j=8;
printf("%d",S(i+j));
getchar();
}
这个函数的输出结果是多少?怎么得的?

得到81.
因为S(i+j)经过预编译用i+j替换x后,它被展开为4*i+j*i+j+1。即(4*6+8*6+8+1)
你应该这样改:
#define S(x) 4*(x)*(x)+1
或者 printf("%d",S((i+j)));即将i+j用括号括起来(i+j),这样就在替换时用(i+j)替换x

先回答你程序错在哪里?程序错在函数F你设置为void(也就是没有反回值)而你却使用了return反回值,函数F(3+5)是没有错误的。编译器提示你这里有错误的原因是你在这里调用了F函数,所以才提示这里错误。你只要把void F改为int F程序就没问题了。

下面回答你的附加问题:
1、这是对的,预处理器都是以#开始的,因为预处理器是编译器把C++代码编译为机器指令之前执行的一个过程,因此应把这些命令放在开头,以便最先执行。

2、谁告诉你在一行上不能有多条预处理器命令的呀,一般情况下这个可能与编译器有关的,我在VS2005中,只有#include "stdafx.h"这一句必须是第一行,而且要单独占一行,其他#include语句可以完全写在同一行上。#include也是预处理器。因为预处理器是以#开始的。

3、这是你对枚举(union)没有理解的原因,枚举是只占一个内存地址的类型,也就是说不管你在union中定义了多少个成员,这些成员是共享的同一块内存地址的,而这个共同内存地址的长度的确定就是以枚举中占据字节数最长那个数据类型为准,因此在你的示例中double占据的字节数最长,因此枚举所占字节数与C所占字节数相同。

4、
char *sp; *sp="rigth!"; 因为*sp是一个常量,不能对常量进行赋值,正确的方式是sp="right!"; 因为sp是一个指针,指针需要指向一个地址,因此可以把字符串常量right的地址赋给指针。

char s[10]; s="right!"; 因为数组名s表示的是一个常量地址,也就是说数组名所表示的地址是一个常量,而你再把字符串常量的地址赋给这个常量,那就相当于3=4这样的赋值,因此这是错误的。数组名的地址不能被更改,这与指针不同,指针是一个变量,可以把指针指向不同的地址,因此指针所指向的地址可以更改。

char s[10]; *s="right!"; 错误在原因在于*s表示的是*(s+0)也就是s[0],因此这条语句就是在对数组中的第一个无素s[0]赋值,而你对他赋了一个字符串,因此是错误的,你应该只能对*s赋单独的一个字符,比如*s='a';这样才正确。

下面是给你的一点附加知识:

指针运算符的作用,我用一言以概之,你在哪里使用都不会错。指针运算符*的作用是求出*后面所指地址里的值。因此只要*后面的变量表示的是一个地址就可以使用*运算符,来求出这个地址中的值,你不用管这个地址的表示形式是怎样的,只要是地址就可以使用*来求出地址中的值。

第二:[ ]这个运算符的的运算法则是,把左侧的地址加上[ ]内的偏移量然后再求指针运算,注意有[ ]运算符的地方就有个隐含的指针,比如x[2]表示的就是将指针x偏移2个单位量后再求指针运算。也就说x[2]与*(x+2)是相等的。

预处理器:预处理器是编译器把C++代码编译为机器指令之前执行的一个过程,所有的预处理器都是#开头,以便与C++语句区分开来,#include预处理器指令在前面已经用过不少了
3.1、#define指令:该指令用于符号置换,其格式为#define 标识符 字符序列。注意该语句不以分号结束。比如#define PI 3.1416就表示把PI置换为3.1416,这里要注意的是虽然PI看起来和变量一样,但PI和变量没有任何关系,PI只是一个符号或标志,在程序代码编译前该符号会用一组指定的字符来代替。还要注意的是3.1416并不是一个数值,而是一个字符串,因此不会进行类型检查。在C++中最好是用const来声名常量,比如const long double PI=3.1416;这样的话PI将会始终保持为long double类型。语句中的字符序列可以是任意的字符序列,而不仅仅是数字,比如#define PI HYONG这样的话在使用PI使就会用HYONG来替换掉PI,当然HYONG这里会是一个未定义的标识符

void F(int x){return(P*x*x);}
返回值为空,而写成了,return p*x*x出错,
printf 肯定就出错了,所以会报2错,

应该写成 int F(int x){return(P*x*x);}

132811 说的 void *F(int x){return(P*x*x);}/有问题

如果你想让返回值为空,可以传一个参数进去存放结果

int nResult = 1;
void F(int x, int nResult)
{
nResult = P*x*x;
}
printf("%d\r\n",nResult);

void F(int x){return(P*x*x);}
错误。
return 了int,但是你的函数返回值类型却是 void。

返回值不对。void F(int x)无返回值,而你的程序里却有return(P*x*x);
更改int F(int x){return(P*x*x);}

函数F定义的是void 无返回值的,还return(P*x*x)

  • 鍏ㄥ浗璁$畻鏈浜岀骇c璇█鐨勭殑鎿嶄綔棰樹竴瀹氳杩愯鍚?
    绛旓細涓嶄竴瀹 鍒嗘瀽濡備笅锛1銆佸叏鍥借绠楁満浜岀骇c璇█鐨勭殑鎿嶄綔棰樹笉涓瀹氳杩愯锛屾牴鎹叿浣撴儏鍐佃屽畾锛岄鍨嬩笉鍚岋紝鎿嶄綔绫诲瀷涔熶笉鍚岋紝瑕佹眰涔熶笉鍚屻2銆佸湪濉┖棰樹腑鏂囦欢鍚嶄负blank1.c鐨婧愮▼搴锛屾牴鎹鎰忓湪绋嬪簭涓寲鍑虹殑绌轰腑濉笂姝g‘绛旀鍗冲彲锛屼笉瑕佹眰杩愯銆備絾涓瀹氳娉ㄦ剰淇濆瓨锛屽惁鍒欎笉寰楀垎銆3銆佸湪鏀归敊棰樹腑鏂囦欢鍚嶄负modi1.c鐨勬簮...
  • C璇█婧愮▼搴涓嫢缂哄皯鏂囦欢鍖呭惈浼氬垯浼氬鑷寸紪璇戝嚭閿欏悧?
    绛旓細褰撶劧浼氥備緥濡備綘浣跨敤浜嗘煇涓簱鍑芥暟鍗存病鏈夊寘鍚搴旂殑澶存枃浠讹紝缂栬瘧鍣ㄦ壘涓嶅埌杩欎釜鍑芥暟鍚嶆槸涓暐涓滆タ銆佸氨鍙ソ鎬敓鐢熷湴瀵逛綘璇达細鈥淓RROR鈥︹︹
  • 鍦C璇█涓,璁$畻鏈绋嬪簭閫氬父鏈夊摢鍑犵閿欒?
    绛旓細1銆佺郴缁熼敊璇細杩欐槸鎸绋嬪簭娌℃湁璇硶閿欒鍜岄昏緫閿欒锛屼絾绋嬪簭鐨勬甯歌繍琛屼緷璧栦簬鏌愪簺澶栭儴鏉′欢鐨勫瓨鍦紝濡傛灉杩欎簺澶栭儴鏉′欢缂哄け锛屽垯绋嬪簭灏嗕笉鑳借繍琛屻2銆佽娉曢敊璇細杩欐槸鎸囩▼搴忎腑鍚湁涓嶇鍚堣娉曡瀹氱殑璇彞锛屼緥濡傚叧閿瓧鎴栫鍙蜂功鍐欓敊璇紙灏唒rintf鍐欐垚print銆佸皢鏁扮粍鍏冪礌寮曠敤鍐欐垚a(2)绛夛級銆佷娇鐢ㄤ簡鏈畾涔夌殑鍙橀噺銆佹嫭鍙蜂笉閰嶅...
  • c璇█浜岀骇鑰冧粈涔堝唴瀹
    绛旓細c璇█浜岀骇鑰冭瘯鍐呭濡備笅锛氥愯冪偣1銆C绋嬪簭 鐢–璇█缂栧啓鐨勭▼搴忕О涓C璇█婧愮▼搴锛屾簮绋嬪簭鏂囦欢鐨勫悗缂鍚嶄负鈥.c鈥濄傛簮绋嬪簭缁忕紪璇戝悗鐢熸垚鍚庣紑鍚嶄负鈥.obj鈥濈殑鐩爣鏂囦欢锛屽啀鎶婄洰鏍囨枃浠朵笌鍚勭搴撳嚱鏁拌繛鎺ヨ捣鏉ワ紝鐢熸垚鈥.exe鈥濆彲鎵ц鏂囦欢銆侰璇█鏈変笁绉嶅熀鏈粨鏋勶細椤哄簭缁撴瀯銆侀夋嫨缁撴瀯銆佸惊鐜粨鏋勩傘愯冪偣2銆憁ain鍑芥暟 鍙堢О...
  • c璇█婧愮▼搴鏀归敊
    绛旓細娌℃湁閿欙紝鍙湁涓や釜璀﹀憡锛岀被鍨嬭浆鎹㈢殑璀﹀憡锛屼粠楂樺埌浣庝細涓㈠け绮惧害銆
  • 椹笂灏辫鍏ㄥ浗璁$畻鏈浜岀骇C浜,璇峰悇浣嶅府甯垜涓婃満璇曢璇ユ庝箞杩囧晩?鏀归敊璺熺紪...
    绛旓細2.鐔熺粌鎺屾彙缁撴瀯鍖栫▼搴忚璁$殑鏂规硶锛屽叿鏈夎壇濂界殑绋嬪簭璁捐椋庢牸銆3.鎺屾彙绋嬪簭璁捐涓畝鍗曠殑鏁版嵁缁撴瀯鍜岀畻娉曘4.TURBO C鐨勯泦鎴愮幆澧冧笅锛岃兘澶熺紪鍐欑畝鍗曠殑C绋嬪簭锛屽苟鍏锋湁鍩烘湰鐨勭籂閿欏拰璋冭瘯绋嬪簭鐨勮兘鍔涖傝冭瘯鍐呭 涓銆C璇█鐨勭粨鏋 1.绋嬪簭鐨勬瀯鎴愶紝MAIN鍑芥暟鍜屽叾浠栧嚱鏁般2.澶存枃浠讹紝鏁版嵁璇存槑锛屽嚱鏁扮殑寮濮嬪拰缁撴潫鏍囧織銆3.婧愮▼...
  • 璁$畻鏈浜岀骇鑰冭瘯C璇█涓,濡傛灉鎴戠殑绋嬪簭璁捐棰樺啓瀵逛簡,鍒嗚兘澶熷緱鍒板悧,_鐧惧害...
    绛旓細浜岀骇C璇█鑰冭瘯鐨勬椂鍊欐槸鏈婧愮▼搴鐨勶紝娌℃敼闈╁墠鏄竴鍏变笁閬撻锛岀涓閬撴槸濉┖棰橈紙30鍒嗭級锛岀浜岄亾鏄敼閿欓锛30鍒嗭級锛岀涓夐亾鏄▼搴忚璁¢锛40鍒嗭級锛屾瘡涓閬撻鍦ㄥ仛涔嬪墠閮借鎵撳紑婧愮▼搴忔枃浠讹紙涓鑸湪鑰冪敓鏂囦欢澶瑰唴锛夛紝鍋氬畬鍚庢渶濂芥槸鍏堜繚瀛橈紝鐒跺悗缂栬瘧杩愯涓涓嬶紝濡傛灉缁撴灉姝g‘鎴栬呰兘瀹炵幇棰樼洰鎵瑕佹眰鐨勫姛鑳斤紝璇ラ...
  • 涓涓畝鍗曠殑C璇█缂栫▼,鍚勪綅甯垜鐪嬬湅鏈変粈涔堥敊璇傝繍琛屾椂鏄剧ずignore, eras...
    绛旓細鍔犱笂閭d釜m鍚庯紝绋嬪簭鏄鐨勶紝娌¢棶棰
  • c璇█浜岀骇鑰冭瘯绋嬪簭璁捐棰樼粰姝ラ鍒嗗悧?
    绛旓細\x0d\x0a鎵╁睍璧勬枡\x0d\x0a鍏ㄥ浗璁$畻鏈浜岀骇C璇█鑰冭瘯锛屽垎涓洪夋嫨棰橈紙40鍒嗭級锛岀▼搴忓~绌洪 锛18鍒嗭級锛岀▼搴忎慨鏀归 锛18鍒嗭級锛岀▼搴忚璁¢锛24鍒嗭級銆俓x0d\x0a鑰冭瘯鍐呭\x0d\x0a涓銆C 璇█绋嬪簭鐨勭粨鏋刓x0d\x0a1. 绋嬪簭鐨勬瀯鎴愶紝main 鍑芥暟鍜屽叾浠栧嚱鏁般俓x0d\x0a2. 澶存枃浠讹紝鏁版嵁璇存槑锛屽嚱鏁扮殑...
  • 璁$畻鏈浜岀骇c璇█绋嬪簭璁捐鑰冧粈涔
    绛旓細璁$畻鏈浜岀骇C璇█鑰冭瘯鍐呭锛1銆C璇█绋嬪簭鐨勭粨鏋勩傜▼搴忕殑鏋勬垚锛宮ain鍑芥暟鍜屽叾浠栧嚱鏁帮紱澶存枃浠讹紝鏁版嵁璇存槑锛屽嚱鏁扮殑寮濮嬪拰缁撴潫鏍囧織浠ュ強绋嬪簭涓殑娉ㄩ噴锛婧愮▼搴鐨勪功鍐欐牸寮忥紱C璇█鐨勯鏍笺2銆佹暟鎹被鍨嬪強鍏惰繍绠椼侰鐨勬暟鎹被鍨嬶紱C杩愮畻绗︾殑绉嶇被銆佽繍绠椾紭鍏堢骇鍜岀粨鍚堟э紱涓嶅悓绫诲瀷鏁版嵁闂寸殑杞崲涓庤繍绠楋紱C琛ㄨ揪寮忕被鍨嬶紙璧嬪艰〃杈惧紡...
  • 扩展阅读:二级c语言报名官网 ... c语言二级通过率高吗 ... 二级c语言免费题库 ... 二级c语言考试诀窍 ... c语言考试查询官网 ... 二级考c好还是c++好 ... 二级c语言编程题漏洞 ... 二级c语言含金量高吗 ... c语言程序设计二级难不难 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网