首页 > 试题广场 >

指出下列程序中的错误。 (1) ========

[问答题]
指出下列程序中的错误。
(1)
//===================================
//file1.cpp
//===================================
int x=1;
int func(){
  //...
}//----------------------------------
//===================================
//file2.cpp
//===================================
extern int x;
int func();
//-----------------------------------
void g(){
  x = func();
}//----------------------------------
//===================================
//file3.cpp
//===================================
extern int x=2;
int g();
//-----------------------------------
int main(){
  x=g();
  //...
}//----------------------------------
(2)
//===================================
//file1.cpp
//===================================
int x = 5;
int y = 8;
extern int z;
//-----------------------------------

//===================================
//file2.cpp
//===================================
int x;
extern double y;
exturn int z;
//-----------------------------------


推荐
(1)本小题含有file1.cpp,file2.cpp,file3.cpp。既然三个文件联合起来构成一个完整的可运行程序(习题做了这样的假定),那三个文件就必须互相独立又互相照应,而不能互相矛盾。这也是本问题希望达到的目的。


三个文件分别定义了自己的函数,file1定义了func函数,file2定义了g函数,file3定义了main()函数。文件的顺序是没有关系的,也不应该使其产生关系,只要有唯一的一个main()函数,由它来展开控制运行的动作,达到整个程序顺利工作的目的,所以main()函数放在哪里都苦。
main()函数调用了g函数,所以调用之前对g函数进行了声明。main()函数还使用了外部变量x,所以说明了全局变量。注意“extern int x;”本来是声明(需要其他文件中存在一个定义),但是“extern int x=2;”由于语句中包含了初始化而使其成了定义。因为初始化必然要求具有存放数据的空间,并且在编译中明确空间位置的腾留和数据存放的操作。因此全局空间定义了一个整型x实体。


然后观察file2,在其所定义的g 函数中,调用了func函数,因此,在g函数定义之前,进行func函数声明便是必要的。同时,g函数还使用了x变量,这一变量并没有在g中定义,因此全局中说明整型x也是必要的。“extern int x;”正是x的声明,它也昭示着需要外部其他文件中须有整型x的全局定义,也就是file3中对x的全局定义。这反应了file3与file2之间的一种协调配合。


g所调用的func还是在file1中定义。但是file1还做了全局整型变量x的定义,这就打破了和谐,违背了实体一次定义原则。因为在一个系统中,在同一子空间(可以是全局空间)中,不能同时存在两个名字相同的实体。这是显然的。


声明与定义是两回事,声明只是规定实体的存在形式和使用,但并没有真正产生实体。在某个函数被调用之前,预先声明是必要的。但是定义就实质性地规定了函数代码(因而规定了全部功能或行为)。对于变量来说,定义产生了实体,而声明则规定变量类型和使用的操作。声明一般用于全局数据。因为在函数内部,涉及的都是具体的操作,对于内部的列表直接定义就是了,没有声明的必要。而当需要用到全局数据时,则可能因为工程中涉及多个代码文件,只能由一个文件对某个全局变量进行定义,而其他所有使用该实体的文件,都以变量声明的形式来展开对其的使用。


file1中定义了全局变量x,并且还初始化为1.file3中也定义了全局变量x,也对其做了初始化,但其初始值为2,这在空间定义上已经矛盾,数值指派上又产生矛盾。


建议将其中之一的初值去掉,并将其中之一改成声明。
除此之外,file1中函数func的返回类型是整型,但是函数中没有显示的return语句。

(2)本小题含有file1.cpp,file2.cpp两个文件,但是它首先是缺乏起码的main函数,使得该程序无法跑起来。

其次,从全局变量的声明和定义的关系来看,两个文件都定义了全局变量x,这是不允许的。又两个文件都声明了整列变量z,没有定义z,这也是不可用的原因。再说,全局变量y有说明不一致之嫌:在file1中定义了一个整型y,而到了file2,y又变成了double型。
发表于 2018-04-18 20:34:15 回复(0)