程序员面试宝典:点滴记录一

1、

结果为:8 8

C中printf计算参数时是从右到左压栈的。

*(ptr++)+=123应为*ptr=*ptr+123;ptr++;此时ptr指向第二个元素。(P36)

 

2、

A写法好于B写法,当把"=="误写为"="时,编译器不允许对常量赋值,可以检查到错误。形成良好的编程习惯。(P36)

 

3、

unsigned char b=~a>>4;

编译器会先把a和4值转换为int型(整数提升)在进行计算,再把计算结果转换为unsigned char赋值给b。

"~"的优先级高于">>"。

C++符号优先级 http://www.cppblog.com/aqazero/archive/2010/10/29/8284.html   。(P37)

 

4、

(int &)a : 将a的引用强制转化为整型,意思是a所在的内存,本来定义的时候是float类型,并初始为1.0f,但现在我要按int类型解释这段内存(也就是说a所在的内存地址中的数据本来是按float型存储表示的,

你非要按int型来解释不可)。将a存储单元开始的内容解释为一个int引用。

更详细的解释以及float在C++中的存储:

http://hi.baidu.com/yu_xiyan/blog/item/735037541f1561113b29358e.html  。(P38)

 

5、

char *b = (char *)&a;

等价于

unsigned int *p = &a;

char *b = (char*)p;

将unsigned int型指针强制转换成一个cher *型的指针。这里是char类型的指针转换,不是char类型的转换。

这样转换后,假设a的地址是x:

p+1 = x+1*sizeof(int) = x+1*4;

b+1 = x+1*sizeof(char) = x+1*1;

影响的是指针的寻址。

 

6、不用"if"/"?:"/"switch"/或其他判断语句,找出两数中比较大的

第一种方法:

int max = (a+b+abs(a-b))/2;

第二种方法:

int c = a-b;

c = unsigned(C)>>(sizeof(int)*8-1);

char *str[2]={"a大","b大"};    (P42)

 

7、不用中间变量交换a、b

方法一:

a = a+b;  b = a-b;  a = a-b;//这种方法可能造成溢出!!!

方法二:

a = a^b; b = a^b; a = a^b;   (P42)

 

8、在C++程序中调用被C编译器编译后的函数,为什么要加extern "C"?

C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。

假设某个函数的原型为:void foo(int x,int y)。该i函数被C编译器编译后在库中的名字为_foo,

而C++编译器则会产生像_foo_int_int之类的名字。

C++提供了C链接交换指定符号extern "C"解决名字匹配问题。(P43)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值