C语言面试宝典题目分析(四)

10、什么函数不能声明为虚函数?

答:constructor

 

11、队列和栈有什么区别?

答:队列先进先出,栈后进先出

 

12、不能做switch()的参数类型

答 :switch的参数不能为实型。

评注:一般用来做switch的参数的类型便是整型,那么按照这个逻辑凡与整型兼容的类型都可以,比如枚举、char。

在Java jdk1.7以后也对switch(String)做了支持,不过这无非是编译器替我们做了又String向整型的转换而已。

C++当中,long类型也是可以作为switch参数的,Java当中不可以。

         long i;

         cin >> i;

         switch(i){

         case 0:

                   cout << "input 0" << endl;

                   break;

         default:

                   cout << "input non-zero" << endl;

         }

结果:

C++当中long类型可以作为switch的参数

         long i;

         i = StdIn.readInt();

         switch(i){

// errorCannot switch on a value of type long. Only convertible int values or enum variables are permitted

         case 0:

                   System.out.println( "input 0");

                   break;

         default:

                   System.out.println("input non-zero");

         }

Java当中long类型不可以作为switch的参数,但int向下兼容的类型都是可以的,比如bytecharshort

 

*StdIn来自普林斯顿大学的教学类。

 

13、局部变量能否和全局变量重名?

答:能,局部会屏蔽全局。要用全局变量,需要使用"::"

局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内

评注:真心没必要琢磨怎样在局部如何使用被覆盖了的外部变量,不过怎么屏蔽还是得清楚。


14、如何引用一个已经定义过的全局变量?

答 、可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变量,假定你将那个变量写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。

评注:前几天遇到一题,一个文件声明了一个extern char[],一个文件则定义了一个char*,这当然是不行的,因为类型不匹配。我对涉及到编译链接的东西实在了解的不多(如果是先学C++后学Java估计会不一样吧),所以果断从网上扒了一段文字(来自百度百科):

声明外部变量

现代编译器一般采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是互相不透明的。也就是说,在编译时,全局变量的可见域限制在文件内部。

下面举一个简单的例子:

创建一个工程,里面含有A.cpp和B.cpp两个简单的C++源文件:

//A.cpp

externint i;

int main()

{

}

//B.cpp

int i;

这两个文件极为简单,在A.cpp中我们定义了一个全局变量i,在B中我们也定义了一个全局变量i。

我们对A和B分别编译,都可以正常通过编译,但是进行链接的时候,却出现了错误,错误提示如下:

Linking...

B.obj : error LNK2005: "int i" (?i@@3HA) already defined in A.obj

Debug/A.exe : fatal error LNK1169: one or more multiply defined symbols found

Error executing link.exe.

A.exe - 2 error(s), 0 warning(s)

 

这就是说,在编译阶段,各个文件中定义的全局变量相互是不透明的,编译A时觉察不到B中也定义了i,同样,编译B时觉察不到A中也定义了i。

但是到了链接阶段,要将各个文件的内容“合为一体”,因此,如果某些文件中定义的全局变量名相同的话,在这个时候就会出现错误,也就是上面提示的重复定义的错误。

因此,各个文件中定义的全局变量名不可相同。

在链接阶段,各个文件的内容(实际是编译产生的obj文件)是被合并到一起的,因而,定义于某文件内的全局变量,在链接完成后,它的可见范围被扩大到了整个程序。

这样一来,按道理说,一个文件中定义的全局变量,可以在整个程序的任何地方被使用,举例说,如果A文件中定义了某全局变量,那么B文件中应可以使用该变量。修改我们的程序,加以验证:

//A.cpp

externint i;

int main()

{

    i = 100; //试图使用B中定义的全局变量

}

//B.cpp

int i;

编译结果如下:

Compiling...

A.cpp

C:\Documents and Settings\wangjian\桌面\try extern\A.cpp(5) : error C2065: 'i' : undeclared identifier

Error executingcl.exe.

A.obj - 1 error(s), 0 warning(s)

 

编译错误。

其实出现这个错误是意料之中的,因为文件中定义的全局变量的可见性扩展到整个程序是在链接完成之后,而在编译阶段,他们的可见性仍局限于各自的文件。

编译器的目光不够长远,编译器没有能够意识到,某个变量符号虽然不是本文件定义的,但是它可能是在其它的文件中定义的。

虽然编译器不够有远见,但是我们可以给它提示,帮助它来解决上面出现的问题。这就是extern的作用了。

extern的原理很简单,就是告诉编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量,你要放行!”

我们为上面的错误程序加上extern关键字:

//A.cpp

externint i;

int main()

{

    i = 100; //试图使用B中定义的全局变量

}

//B.cpp

int i;

顺利通过编译,链接。

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值