C++程序阅读题 面试题目29例

1、main 函数执行以前,还会执行什么代码?

【参考答案】
全局对象的构造函数会在main 函数之前执行。


2、 There are two int variables: a and b, don't use“if”, “? :”, “switch”or other judgement statements, find out the biggest one of the two numbers.

【标准答案】
( ( a + b ) + abs( a - b ) ) / 2

3、如何打印出当前源文件的文件名以及源文件的当前行号?

【标准答案】
cout << __FILE__ ;
cout<<__LINE__ ;
__FILE__和__LINE__是系统预定义宏,这种宏并不是在某个文件中定义的,而是由编译器定义的。(C也有)

4、下面两种if语句判断方式。请问哪种写法更好?为什么?  

int n;
if (n == 10) // 第一种判断方式
if (10 == n) // 第二种判断方式
【参考答案】
这是一个风格问题,第二种方式如果少了个=号,编译时就会报错,减少了出错的可能行,可以检测出是否少了=。

5、写出运行结果:

{

    // test1  char str[] = "world";

     cout << sizeof(str) << ": ";

    char *p = str;

    cout << sizeof(p) << ": ";

    char i = 10;

    cout << sizeof(i) << ": ";

    void *pp = malloc(10);

     cout << sizeof(pp) << endl;

}

复制代码
【标准答案】6:4:1:4

6、在不用第三方参数的情况下,交换两个参数的值。

【参考答案】
a = a + b; 
b = a – b; a = a – b;

7、以下代码如果有错,请该正,并写出输出结果? 

void main(void)

{

    int nArrLength(400), i = 546;     

    for (int i = 0; i< 99999999999; i++);

        cout << nArrLength << endl;

    cout << i << endl;

}

复制代码

【标准答案】

void main(void)

{         

        int nArrLength(400), i = 546;        

                 /*主要是考看对C++的基础知识是否了解这里的int nArrLength(400)是对整数的定义,当然,明名上有问题,这里是故意这样的,

                但是,最好是变量名改为 ....[还是您自己看着办了]*/

         for (int i = 0; i< 99999999999; i++); 

                /*这里是考对变量越界理解,同时....,所以,999...应该改为 ~((int)0),也就是整数中0取反考对变量块作用域的理解,这里的i,在循环后就不存在了*/           

        cout << nArrLength << endl;           // 这里输出 400          

        cout << i << endl;                    // 这里输出 546 

  }

复制代码

8、int i = 5, b = 7; cout << (i+++b) <<endl; 不用调试,请说出,以上代码在gcc编译过后的执行结果!

【标准答案】结果是12。

9、写一个能做左值的函数(方法有很多)。

如:max(x, y) += 2874 + 55; drwline(x, y)++;
【参考答案】  

int &max(int & x, int & y)

{

    return x > y? x : y;

}

int x = 55, y = 77;

max(x, y) += 12 + 11; // 此时 y = 92;

cout << "x = "x << "; y = "<< y << endl; // 输出 x = 55; y = 92;

复制代码

10、程序输出

class human

{

public:

        ~human()

        {

                cout << "human over......" << endl;

        }

        void Disp()

        {

                cout << "human disp ... ..." << endl;

        }

};

class man : public human

{

public:

        ~man()

        {

                cout << "man over......" << endl;

        }

        void Disp()

        {

                cout << "man disp ... ..." << endl;

        }

};

int main()

{

        human* p = new human;

        p->Disp();

        delete p;

        return 0;

}

复制代码

【标准答案】 
human disp ... ... 
human over ......

11、下面的函数实现在一个固定的数上加上一个数,有什么错误,改正:

int add_n(int n)

{    

    static int i = 100;

     i += n;

    return i;

}

复制代码

【标准答案】 
因为static使得i的值会保留上次的值。以后的i会一直更新,使得第二次调用出现错误, 去掉static就可了

12、写出打印结果
unsigned short array[]={1,2,3,4,5,6,7};
int i = 3;   
*(array + i) =  ?

【标准答案】4

13、写一个函数计算当参数为n(n很大)时的值 1-2+3-4+5-6+7......+n。

【参考答案】

long fn(long n)

{     

if(n <= 0)

{          

    printf("error: n must > 0);        

    exit(1);      

}

if(0 == n % 2)        

    return (n / 2) * (-1);    

else          

    return (n / 2) * (-1) + n;

复制代码

14、字符指针、浮点数指针、以及函数指针这三种类型的变量哪个占用的内存最大?为什么?

【参考答案】
指针变量也占用内存单元,而且所有指针变量占用内存单元的数量都是相同的。
就是说,不管是指向何种对象的指针变量,它们占用内存的字节数都是一样的,并且要足够把程序中所能用到的最大地址表示出来(通常是一个机器字长)。

15、以下三条输出语句分别输出什么?

char str1[]       = "abc";  

char str2[]       = "abc";  

const char str3[] = "abc";   

const char str4[] = "abc";   

const char* str5  = "abc";  

const char* str6  = "abc";  

cout << boolalpha << ( str1==str2 ) << endl; // 输出什么?  

cout << boolalpha << ( str3==str4 ) << endl; // 输出什么?  

cout << boolalpha << ( str5==str6 ) << endl; // 输出什么?  

复制代码

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

16、以下代码有什么问题?        

cout << (true?1:"1") << endl;

复制代码
【参考答案】
三元表达式“?:”问号后面的两个操作数必须为同一类型。

17、以下代码能够编译通过吗,为什么?

unsigned int const size1 = 2;  

char str1[ size1 ];  

unsigned int temp = 0;  

cin >> temp;  

unsigned int const size2 = temp;  

char str2[ size2 ];

复制代码

【标准答案】
str2定义出错,size2非编译器期间常量,而数组定义要求长度必须为编译期常量。

18、以下代码中的输出语句输出0吗,为什么?

struct CLS  

{  

      int m_i;  

      CLS( int i ) : m_i(i) {}  

      CLS()  

      {  

          CLS(0);  

      }  

};  

CLS obj;  

cout << obj.m_i << endl;

复制代码

【标准答案】
不能。在默认构造函数内部再调用带参的构造函数属用户行为而非编译器行为,亦即仅执行函数调用,而不会执行其后的初始化表达式。
只有在生成对象时,初始化表达式才会随相应的构造函数一起调用。

19、How do you code an infinite loop in Cplus plus ?

【参考答案】
while(1){} or for(;1;)

20、What are the values of a, b, and c after the following instructions: 

int a=5, b=7, c;

c = a+++b;

复制代码

【标准答案】a=6,b=7,c=12

21、在排序方法中,关键码比较次数与记录地初始排列无关的是()

A. Shell排序      
B. 归并排序
C. 直接插入排序     
D. 选择排序 
【标准答案】D

22、代码:
void func()  {    
    static int val;
}
中,变量 val 的内存地址位于: 
A. 已初始化数据段
B.未初始化数据段     
C.堆
D.栈 
【标准答案】A

23、一个栈的入栈序列是 A,B,C,D,E,则栈的不可能的输出序列是?

A、EDCBA;
B、DECBA;    
C、DCEAB;
D、ABCDE 
【标准答案】C

24、写出判断ABCD四个表达式的是否正确, 若正确, 写出经过表达式中 a 的值。

int a = 4;  

(A)、a += (a++);

(B)、a += (++a) ;  

(C)、(a++) += a;

(D)、(++a) += (a++);  

a = ?

复制代码

【参考答案】
C错误,左侧不是一个有效变量,不能赋值,可改为 (++a) += a; 改后答案依次为 9,10,10,11

25、请你谈谈你是如何使用 return 语句的。

【参考答案】
(1)return 语句不可返回指向“栈内存”的“指针”或者“引用” ,因为该内存在函数体结束时被自动销毁。
(2)要搞清楚返回的究竟是“值”、“指针”还是“引用” 。
(3)如果函数返回值是一个对象,要考虑 return 语句的效率。


26、① return String(s1 + s2); 和 ②String temp(s1 + s2); return temp; 一样吗?

【参考答案】 
①这是临时对象的语法,表示“创建一个临时对象并返回它” 。
②将发生三件事。首先,temp 对象被创建,同时完成初始化;然后拷贝构造函数把 temp 拷贝到保存返回值的外部存储单元中;
最后,temp 在函数结束时被销毁(调用析构函数) 。然而“创建一个临时对象并返回它”的过程是不同的,
编译器直接把临时对象创建并初始化在外部存储单元中,省去了拷贝和析构的化费,提高了效率。

27、下列程序的运行结果是?

#include <iostream>    

const char *str = "vermeer";    

int main()   

{   

    const char *pstr = str;   

    cout << "The address of pstr is: " << pstr << endl;   

}

复制代码

【标准答案】
The address of pstr is: vermeer

28、下列程序输出结果是?

inline void max_out( int val1, int val2 )

{  

    cout << ( val1 > val2 ) ? val1 : val2;

}

int main()

{

    int ix = 10, jx = 20;

    cout << "The larger of " << ix;

    cout << ", " << jx << " is ";

    max_out( ix, jx );

    cout << endl;

}

复制代码

【标准答案】
The larger of 10, 20 is 0 ,
为什么不是20呢?问题在于输出操作符的优先级高于条件操作符 所以输出 val1 和 val2 比较结果的 true/false

29、int max( int *ia, int sz ); 
int max( int *, int = 10 ); 
算函数重载?还是重复声明?

【标准答案】
如果在两个函数的参数表中只有缺省实参不同则第二个声明被视为第一个的重复声明 。

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值