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

1、#include <stdio.h> int main(void) { int b=3; int arr[]={6,7,8,9,10}; int *ptr = arr; *(ptr++)+=123; printf("%d,%d/n",*ptr,*(++ptr)); return 0; }

结果为:8 8

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

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

 

2、 //a is a variable //A: if('A'==a) a++; //B: if(a=='A') a++;

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

 

3、#include <iostream> using namespace std; int main(void) { unsigned char a = 0xA5; unsigned char b = ~a>>4; //cout<<b; printf("b=%d/n",b); return 0; }

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、#include <iostream> using namespace std; int main(void) { float a = 1.0f; cout<<(int)a<<endl; cout<<&a<<endl; cout<<(int &)a<<endl; cout<<boolalpha<<((int)a == (int &)a)<<endl; float b = 0.0f; cout <<(int)b<<endl; cout<<&b<<endl; cout<<(int &)b<<endl; cout<<boolalpha<<((int)b == (int &)b)<<endl; return 0; }

(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、#include <iostream> using namespace std; int main(void) { unsigned int a = 0xFFFFFFF7; unsigned char i = (unsigned char)a; char *b = (char *)&a; printf("%08x,%08x",i,*b); return 0; }

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)

你可能感兴趣的:(c,面试,存储,语言,float,编译器)