骚变态的C++题

 

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()的返回值都将为真。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值