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

作者&投稿:独苛 (若有异议请与网页底部的电邮联系)
#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语言,帮忙检查程序代码的错误。。~

改成scanf(“%f”,&x);就行了

case和后面的数字要用空格来分开,不然编译器怎么知道是什么意思呢??
希望对你有所帮助

一个C语言源程序调用另一个源程序中的全局变量时出现重复定义main函数问 ...
答:你用的文件包含命令吧?单独调用源程序的时候必须写一个main()函数,如果你用了文件包含命令,调用另外一个main()函数那当然会出错,因为出现了2个main()函数,如下面就是错的 假如有2个C源程序c1.c和c2.c c1.c中内容为 include"c2.c"main(){ printf("this is c1.c");} c2.c中内容为 ma...

在一个c源程序中,块式注释部分以什么开始
答:在C语言源程序中,块式注释部分以/开始,以/结束。块式注释,也称为多行注释,是在C和其他编程语言中常见的一种注释形式。这种类型的注释以/开始,并以/结束。块式注释允许用户在注释中包含多行文本,因此得名块式。块式这种注释方式可以跨越多行,允许在注释中包含复杂的语句或段落。当编译器遇到/...

学生必看c语言必看常见符号分类集合贴
答:关键字,又称为保留字,他们是C语言中预先规定的具有固定含义的一些单词,例如C语言的第一个程序中的int和return等,用户只能按预先规定的含义来使用他们不能擅自改变其含义。 2、标识符 标识符分为系统预定义标识符和用户自定义标识符两类。 顾名思义,系统预定义标识符就是由系统预先定义好的,例如主函数main和输出...

C语言入门知识
答:C语言具有下列特点:(1)C语言既具有低级语言直接操纵硬件的特点,又具有高级语言与 自然语言和人的思维逻辑相似的特点,C语言程序易编写、易查错,而且实用性很强。(2)C语言具有丰富的数据类型和运算符,语法结构简单。(3)C语言是一种结构化程序设计语言,提供了完整的程序控制语句。(4)C语言是一种模块化程序设计...

C语言程序设计怎么汇编(本人小白,路过的大神帮帮忙)
答:必须使用TurboC2.0软件来完成,启动运行TurboC2.0软件,进入TurboC2.0的界面,选择文件选项的打开,打开你保存的C语言源程序,选择运行选项中的编译,可以将你的C语言源程序翻译成目标代码,即计算机可识别和执行的二进制文件。如果编译的过程存在错误,则要调试程序、查找错误,修改程序,直到正确为止。

C语言关键词学习总结?
答:C语言关键词学习总结 一、static关键字 1、局部变量 生命周期:原先存在栈中,生命周期语句执行完毕便结束了。现在存放到静态数据区,生命周期持续到整个程序执行结束。 作用域:并没有改变作用域,还是仅限于该语句块。并且只在初次运行的时候进行初始化,下次调用时它的值是上一次函数调用结束之后的值。每次调用后值会...

C语言源程序文件的后缀是什么,经过编译后生成文件的后缀是什么?经过连 ...
答:xx.c文件.c文件一般放的是变量、数组、函数的具体定义。1、头文件的预编译,预处理。编译器在编译源代码时,会先编译头文件,保证每个头文件只被编译一次。在预处理阶段,编译器将c文件中引用的头文件中的内容全部写到c文件中。2、词法和语法分析(查错)。3、编译(汇编代码,.obj文件)。转化为...

c语言源文件扩展名是什么?
答:C语言源程序文件扩展名: .c 目标文件扩展名: .obj 可执行文件扩展名: .exe 源程序:程序可以用高级语言或汇编语言编写,用高级语言或汇编语言编写的程序称为源程序。C语言源程序的扩展名为“.c”。源程序不能直接在计算机上执行,需要用“编译程序”将源程序编译为二进制形式的代码。目标程序:源...

vs怎么创建c语言项目
答:在Visual Studio中创建C语言项目,可以按照以下步骤进行: 1.打开Visual Studio程序,点击“创建新项目”。 2.在新弹出的界面中,选择“C++”选项,因为C语言是基于C++的。 3.进入Visual Studio主界面后,在右边的“解决方案管理器”中找到“源文件”,右键点击并选择"添加”,然后选择“新建项”。 4.在弹出的窗口中,...