1:
#i nclude <stdio.h>
union
{
int i;
char x[2];
}a;
void main()
{
a.x[0] = 10;
a.x[1] = 1;
printf("%d",a.i);
}
答案:266 (低位低地址,高位高地址,内存占用情况是Ox010A)
2:(微软笔试题)
int func(x)
{
int countx = 0;
while(x)
{
countx ++;
x = x&(x-1);
}
return countx;
}
假定x = 9999。 答案:8
思路:将x转化为2进制,看含有的1的个数。
3:不用比较算符,不用if,得出int a, b的较大者。
解决方案1:
这个貌似是终极方案了:
#define MyMax(a, b) (((a)-(b))&0x80000000 ? (b) : (a) )
cout<<MyMax(3,4)<<endl;
解决方案2:(爽哥提供的方案)
char* str_vec[2];
str_vec[0] = "a>=b";
str_vec[1] = "a<b";
int a = 10;
int b = 11;
int idx = (unsigned int)(a-b)>>31; // 要转化为无符号数
cout<<str_vec[idx]<<endl;
4:
C++中不能重载的算符有:“.”、“::”和“sizeof” 3个.
另外“?:”算符由于重载的话没有意义,一般也不让重载。
6:
struct foo
{
foo(){};
void fun(){};
};
下列语句对不对
foo f;
f.fun();
foo f2(); // --------------->错误! 无参数的构造函数 不可以使用()号 直接 写变量名字即可!
f2.fun();
7:关于字节对齐
(强调!!!结构体自身也要对其,默认按照其对大元素的对齐值对齐!!!)
假设vc默认8字节对齐
#pragma pack(8)
typedef struct C{
double a;
short c;
int d;
char b;
};
sizeof(C) = 24;
分析:按照数据类型自身的对齐,应该是20。 然后结构体本身也要有自己的对齐,按照结构体内成员最大的对齐方式对其,也就是double的8字节对齐,所以就是24
同样结构体,如果加上
#pragma pack(4)
....
#pragma pack() // 取消指定对齐
那么sizeof(C) = 20; 因为指定了4字节对齐,结构体也按照4字节对齐。
再来个例子,做对了,就理解了
#pragma pack(8)
typedef struct C{
double* c;
int a;
char d;
};
sizeof(C) = 12; 结构体内最大的字节对齐为4,所以,结构体本身也按4字节对齐。
理论在于:
1)数据类型自身的对齐值:就是上面交代的基本数据类型的自身对齐值。
2)指定对齐值:#pragma pack (value)时的指定对齐值value。
3)结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。
4)数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中较小的那个值。
char型数据,其自身对齐值为1,对于short型为2,对于int,float,为4, 对于double类型,为8,单位字节
7(腾讯笔试题): 关于 += 和 ++
int i=1;
i+=++i+(i++);
cout<<i<<endl; // 输出 7.
分析, 从右向左, 表达式右侧为 3 + 1; 此时 i=3, 所以 3+=4 =》 7
8:(深信服笔试题)
下列算符的优先级 % & . && <= =
优先级顺序为(由高到底):. & % <= && =
9:^ 是与或符! 不是指数运算符!搞matlab搞多了 就会把当成指数算符了。 :(
10:fun((exp1, exp2), (exp3, exp4, exp4)) 问该函数共几个参数?
答案,2个,分别是 exp2和exp4, exp1,exp3,exp4也并非无用,是先执行exp1,才执行exp2.
‘,’号是个运算符,自左向右运算。常用语循环语句。eg:
for( i=1, j=1; ....; .... )
10:分析如下输出
struct C180 {
C180() {
foo();
this->foo();
}
void virtual foo() {
cout << "<< C180.foo this: " << this
<< " vtadr: " << *(void**)this
<< endl;
}
};
struct C190 : public C180 {
C190() {}
void virtual foo() {
cout << "<< C190.foo this: " << this
<< " vtadr: " << *(void**)this
<< endl;
}
};
main()
{
C190 c190;
}
// 输出为
C180.foo this: ***** vtadr:*****
C180.foo this: ***** vtadr:*****
分析 C180的构造函数里第二个foo是通过this指针调用的,为何没有多态输出C190呢? 答案是因为在构造函数执行的时候是不允许多态的。至于为何,见如下文字分析
http://blog.csdn.net/zdl1016/archive/2007/04/15/1565328.aspx
11下面的代码有什么问题?(百度2010)
cin>>num;
int *pInt = int[num];
答案:
cin没有检查返回值。应该:
cin>>num;
if(!cin.fail())
{ int *pInt = int[num]; }
通常来说,以下情况,会导致failbit置位,从而使得cin.fail()返回值为真
1。未能读取到预期的字符,例如int a; cin >> a; 的时候输入了字符
2。I/O失败,例如试图访问不可访问的文件或写入受保护的磁盘、文件。
3。读取到文件尾,即读取文件结尾标志EOF,这时cin.fail()和cin.eof()的返回值都将为真。
1万+

被折叠的 条评论
为什么被折叠?



