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 除去符号位取反加一的结果)。