现在的位置: 首页 > 综合 > 正文

c++经典面试题

2012年09月08日 ⁄ 综合 ⁄ 共 1484字 ⁄ 字号 评论关闭

1、int a=5,则 ++(a++)的值是()
A、5      B、   6          C、7       D、逻辑错误 
a++返回的是一个临时变量,这里是右值,不能再前面++了
2、下面的代码输出什么? 

  1. int main(void)  
  2. {  
  3.     int  a[5] = {1, 2, 3, 4, 5};  
  4.     int  *ptr = (int *)(&a+1);  
  5.     printf("%d %d",*(a+1),*(ptr-1));  
  6.     return 0;  
  7. }  

A、1  6     B、2   4    C、2   5   
D、1   5

a是一个指向数组的指针(行指针),a的步长就是数组的长度。也就是说执行a+1时,a要跨过n个整型数据的长度,输出*ptr就会发现越界了,是一个随机值,那么ptr-1的值就是数组的最后一个值了。
3、以下三条输出语句分别输出什么?

  1.  char str1[] = "abc";  
  2. char str2[] = "abc";  
  3.   
  4. const char str3[] = "abc";  
  5. const char str4[] = "abc";  
  6.   
  7. const char* str5 = "abc";  
  8. const char* str6 = "abc";  
  9.   
  10. cout << boolalpha << ( str1==str2 ) << endl; // 输出什么?  
  11. cout << boolalpha << ( str3==str4 ) << endl; // 输出什么?  
  12. cout << boolalpha << ( str5==str6 ) << endl; // 输出什么?  

答:分别输出false,false,true。str1和str2都是字符数组,每个都有其自己的存储区,它们的值则是各存储区首地址,不等;str3和str4同上,只是按const语义,它们所指向的数据区不能修改。str5和str6并非数组而是字符指针,并不分配存储区,其后的“abc”以常量形式存于静态数据区,而它们自己仅是指向该区首地址的指针,所以相等。

4、下面代码的输出是什么?

  1. float a = 1.0f;  
  2.     cout<< (int)a <<endl;  
  3.     cout<< (int&)a <<endl;  
  4.     cout << boolalpha << ( (int)a==(int&)a ) << endl; // 输出什么?  
  5.   
  6.     float b = 0.0f;  
  7.     cout<< (int)b <<endl;  
  8.     cout<< (int&)b <<endl;  
  9.     cout << boolalpha << ( (int)b==(int&)b ) << endl; // 输出什么?  

浮点数的 1.0f 在内存里是这样表示的: 
0011 1111 1000 0000 00000000 00000000 

这个32位二进制数被当作整数输出就是: 
1065353216 
而整数的 1 在内存里是这样表示的: 
0000 0000 0000 0000 00000000 00000001 
所以 (int)a != (int&)a 

浮点的0和整数的0 在内存里都是: 
0000 0000 0000 0000 00000000 00000000 
所以 (int)b == (int&)b 

5、以下代码中的两个sizeof用法有问题吗?

抱歉!评论已关闭.