C++题目(三)

来源:互联网 发布:好看的水杯知乎 编辑:程序博客网 时间:2024/05/23 00:08

1.在排序算法中,元素比较次数与初始排列无关的是

冒泡、选择、归并、
有关的是:插入、快排、shell、堆(有点关系,好像关系不打)

2.10 != 9的结果为?
这个题目在VC上编译sizeof(10!=9)为4,在gcc上编译结果为1。不同编译器有不同的结果,可能为int 1 也可能为bool false。

3.函数声明void fun(int a=0, int b)是否正确?
不对。如果函数指定了一个形参为默认实参,那么它后面的形参也必须指定默认实参。否则可能产生歧义。例如如果上面的生面是正确的,那么再有一个声明void fun(int a, int b=0),这个时候调用fun(1),就不知道调用的是哪个了。

4.对类型转换符进行重载的正确的声明是:
operator int();(没有参数,没有返回值)

5.优先级问题:
1)char a=3, b=6, c; c=a^b<<2; c的二进制为11011,<<优先级高于异或
2)int a=12; a+=a-=a*a; a的置为-264

6.while(int i=0)的循环次数为,0次,相当于int i=0;while (i)

7.下面代码的输出结果为:

#include <iostream>#include <string.h>using namespace std;int main(){        union {                int n;                struct {                        char a;                        char b;                }half;        }un;        un.n = 0x4241;        printf("%c %c\n", un.half.a, un.half.b);        un.half.a = 'a';        un.half.b = 'b';        printf("%x\n", un.n);        return 0;}


 

输出为:
A B
6261
首先un是在栈上,在栈上是从高地址像低地址分配空间的。但是,在一个数据的空间内,数据对象分配还是从低到高的,这个union有四个字节,设为地址1到4,如果只存储struct那么struct是存在1和2两个地址的,同理,在struct里面a存在地址1,b存在地址2。如果这个union存放的为一个int,这个时候因为在机器里面,为小顶端存储,即是符合人们的习惯的存储,低地址存放地位,高地址存放高位。

存放16进制的数0x4241,低地址存放低字节,0x42存放在地址1,0x41存放在地址2,输出的时候,un按照字符来解析,首先解析a,从地址1取出来为0x42,然后转成10进制的ascii,在转换成对应的字符。同理,输出n的过程也一样。

8.下面代码的输出结果是:

#include <iostream>using namespace std;class Base{        public:                Base(int i){cout<<"Base "<<i<<endl;};};class Base1:virtual public Base{        public:                Base1(int i, int j=0):Base(j){cout<<"Base1 "<<i<<endl;};};class Base2:virtual public Base{        public:                Base2(int i, int j=0):Base(j){cout<<"Base2 "<<i<<endl;};};class Derived:public Base1, public Base2{        public:                Derived(int i, int j=0):Base2(i,j), Base1(i,j),Base(j),base2(10,10),base1(20,20){cout<<"Derived "<<i<<endl;};        private:                Base1 base1;                Base2 base2;};int main(){        Derived d(1);        return 0;}

 

结果为:
Base 0
Base1 1
Base2 1
Base 20
Base1 20
Base 10
Base2 10
Derived 1

顺序为,公共父类的构造函数,继承中按照顺序继承的父类,按照继承的顺序的构造函数。不是由初始化参数表来决定的。同理,对的也是,是按照声明的顺序来构造的,与初始化表无关。

9.下面代码输出结果:

#include <iostream>using namespace std;class A{        public:                static int i;                A(){i++;};};int A::i = 0;int main(){        {                A *p = new A[3];        }        cout<<A::i<<endl;        return 0;}


输出为3, 这个静态的i是属于整个类的,不论在什么作用域,只存在一份。

10.函数模板与模板函数。
函数模板的重点是模板。表示的是一个模板,专门用来生产函数。例如:
template   <typename   T>
void   fun(T   a)

{
            …
}
在运用的时候,可以显式(explicitly)生产模板函数,fun <int> 、fun <double> 、fun <Shape*> ……。
也可以在使用的过程中由编译器进行模板参数推导,帮你隐式(implicitly)生成。
fun(6);//隐式生成fun <int>

模板函数的重点是函数。表示的是由一个模板生成而来的函数。例子:
上面显式(explicitly)或者隐式(implicitly)生成的fun <int> 、fun <Shape*> ……都是模板函数。
简而言之:模板函数是函数模板的一个实例。

11.调用模板函数,在一定条件下可以省略模板参数

12.下面赋值是否正确? a++=b++;
不对,++a=b++就对,可能和实现有关系,a++返回的为一个临时的变量,不能把值给一个函数返回的临时变量。如果一个函数的返回值为临时变量,同样不可以作为=的左值。但是如果函数返回值为一个引用就可以,如果返回的为一个函数内部的局部变量,编译的时候虽然有警告,但是可以编译通过。

13.下面正确的赋值为:
        char a = '\';
        char b = '\xbc';
        char c = '\0xab';
        char d = '\0127';
        char e = '\127';
正确的为b、e。十六进制的转义为\x,\后面加数字标识八进制,但是不能超过四位\012正确,\127正确,\0127就不对了。

14.以下代码的输出结果为:
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
        int n = 0;
        for (int i=1; i<argc; i++)
                n = n*10 + *argv[i] - '0';
        printf("%d\n", n);
        return 0;
}

运行./my 1 1 1
输出为111。

15.以下代码运行是否正常:
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
        char *p = NULL;
        *p = 5;
        cout<<*p<<endl;
        return 0;
}

可以编译通过,运行报错,无法给空指针赋予特定的值。

16.对语句 scanf("x=%d,y=%d", &x, &y);正确的输入为:
x=1,y=2
一定要严格的按照格式来。

17.假设int占两个字节,则下列程序的输出结果为:
int main(int argc, char *argv[])
{
        int k=-1;
        printf("%d,%u\n", k, k);
        return 0;
}

-1,65535
注意负数在计算机中的标识是以补码的形式存储的。-1在计算机中为1111 1111 1111 1111(为对1000 0000 0000 0001 除去符号位取反加一的结果)。

原创粉丝点击