您的位置:首页 > 编程语言

你可能不知道的编程小问题:程序基本概念

2014-04-17 17:57 274 查看
面试题一、下列C++代码的输出结果是什么?

int i = 1;
void main()
{
int i = i;
}
A、mian里面的i是一个未定义值

B、main里面的i的值为1

C、main里面的i的值为0

D、编译出错

答案--A

解析--在C++中这样做是完全合法的(但显然不合理),int i = i, 后面的i是已经在main里面声明的i,而不是main外面的i(局部变量覆盖全局变量),所以i只是未定义而已(随机值)。

面试题二、下列两段代码输出结果是什么?

int a,x;
for (a=0,x=0;a<=1 && !x++;a++)
{
a++;
}
cout<<a<<x<<endl;
int a,x;
for (a=0,x=0;a<=1 && !x++;)
{
a++;
}
cout<<a<<x<<endl;


答案--第一段结果为21,第二段结果为12

解析--关于&&运算符,如果左边的值为0,则右边的操作数将弃之不管,||运算符也有类似道理

面试题三、下面代码输出结果是什么?

int arr[] = {6,7,8,9,10};
int* ptr = arr;
*(ptr++)+=123;
printf("%d,%d\n",*ptr,*(++ptr));


答案--8,8

解析--要注意执行完*(ptr++)+=123;后,ptr已经指向第二个元素,第二个要注意的就是输出语句(printf、cout)的执行顺序是从右到左,所以先执行*(++ptr),ptr指向第三个元素

面试题四、下面程序输出结果是多少?

float a=1.0f;
cout<<(int)a<<endl;
cout<<(int&)a<<endl;
cout<<boolalpha<<( (int)a == (int&)a )<<endl;

float b=0.0f;
cout<<(int)b<<endl;
cout<<(int&)b<<endl;
cout<<boolalpha<<( (int)b == (int&)b )<<endl;


答案--第一段代码:

1

106535216

false

第二段代码:

0

0

ture

解析--(int)a实际上是以浮点数a为参数构造了一个整型数,该整数的值是1,(int&)a则是告诉编译器将a当作整数看(并没有做任何实质上的转换)。因为1以整数形式存放和以浮点形式存放其内存数据是不一样的,因此两者不等。对b的两种转换意义同上,但是0的整数形式和浮点形式其内存数据是一样的,因此在这种特殊情形下,两者相等(仅仅在数值意义上)。

注意,程序的输出会显示(int&)a=1065353216,这个值是怎么来的呢?前面已经说了,1以浮点数形式存放在内存中,按ieee754规定,其内容为0x3F800000(大家可以直接调试看汇编,关于浮点数存储方式,可以看我的另外一篇博客)。这也就是a这个变量所占据的内存单元的值。当(int&)a出现时,它相当于告诉它的上下文:“把这块地址当做整数看待!不要管它原来是什么。”这样,内容0x0000803F按整数解释,其值正好就是1065353216(十进制数)。

通过查看汇编代码可以证实“(int)a相当于重新构造了一个值等于a的整型数”之说,而(int&)的作用则仅仅是表达了一个类型信息,意义在于为cout<<及==选择正确的重载版本。

面试题五、下面程序的结果是多少?

unsigned int a = 0xfffffff7;
unsigned char i = (unsigned char)a;
char* b = (char*)&a;
unsigned char* c = (unsigned char*)&a;
printf("%08x,%08x,%08x,%08x",a,i,*b,*c);
答案--fffffff7,000000f7,fffffff7,000000f7

解析--问题不难,但是奇怪的是这么*b输出的居然跟int型一样?哈哈,其实这纯属是巧合而已,如果字符是有符号的,刚好符号位又是1,那么前面填补的不是0而是1了。

面试题六、下面程序的结果是多少?

unsigned char a = 0xa5;
unsigned char b = ~a>>4+1;
printf("b=%d\n",b);
答案--250

解析--因为+运算符的优先级高于>>,所以b=~a>>5(= ~10101001>>5 = 01010110>>5 = 00000010 = 2 ),奇怪了,不是2吗?但是在编译器上运行的结果是250,我们进入汇编指令,会发现存储变量的寄存器是16位寄存器,所以在寄存器中寄存器表达是 0000 0000 1010 0101取反再移位后就是 0000 0111 1111 1010,unsigned char 型智能表示低8位,即250

面试题七、判断一个数X是否是2的N次方,不可用循环语句

答案--!( X &( X - 1) )

解析--2,4,8,16...转换为二进制 10、100、1000、10000....其实就是检查X的二进制是否只有一个1(类似题目,判断一个二进制树有多少个1)

面试题八、将a、b的值交换,不使用任何中间变量

答案一、a = a+b;

b = a-b;

a = a-b;

该方法很不好,有可能会溢出

答案二、a = a^b;

b = a^b;

a = a^b;

哈哈,你想到了吗?

<ps:课本也不是万能的,如果有出现错误的解析,希望大家指正>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: