你可能不知道的编程小问题:程序基本概念
2014-04-17 17:57
274 查看
面试题一、下列C++代码的输出结果是什么?
B、main里面的i的值为1
C、main里面的i的值为0
D、编译出错
答案--A
解析--在C++中这样做是完全合法的(但显然不合理),int i = i, 后面的i是已经在main里面声明的i,而不是main外面的i(局部变量覆盖全局变量),所以i只是未定义而已(随机值)。
面试题二、下列两段代码输出结果是什么?
答案--第一段结果为21,第二段结果为12
解析--关于&&运算符,如果左边的值为0,则右边的操作数将弃之不管,||运算符也有类似道理
面试题三、下面代码输出结果是什么?
答案--8,8
解析--要注意执行完*(ptr++)+=123;后,ptr已经指向第二个元素,第二个要注意的就是输出语句(printf、cout)的执行顺序是从右到左,所以先执行*(++ptr),ptr指向第三个元素
面试题四、下面程序输出结果是多少?
答案--第一段代码:
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<<及==选择正确的重载版本。
面试题五、下面程序的结果是多少?
解析--问题不难,但是奇怪的是这么*b输出的居然跟int型一样?哈哈,其实这纯属是巧合而已,如果字符是有符号的,刚好符号位又是1,那么前面填补的不是0而是1了。
面试题六、下面程序的结果是多少?
解析--因为+运算符的优先级高于>>,所以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:课本也不是万能的,如果有出现错误的解析,希望大家指正>
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:课本也不是万能的,如果有出现错误的解析,希望大家指正>
相关文章推荐
- 你可能不知道的编程小问题:预处理、sizeof
- 网络编程的基本概念 讲解客户端程序和服务器程序
- Java 网络编程----基本概念
- 《Linux C一站式学习》第一章 程序的基本概念
- 高性能网络编程中的几个基本概念
- 关于图形化编程软件sikuli 初学者使用时可能容易出现的一些问题
- 《OpenCV3.0 编程入门》书中3.1.9节图像的载入、显示与输出示例程序练习报异常问题
- 排序问题的基本概念
- android编程常见问题-程序在模拟器中不显示
- 解决unix环境高级编程的第一个程序运行问题
- Beej网络socket编程指南——基本概念(2)
- 程序启动冲出UAC-解决Win UAC问题的编程经验
- WCF分布式开发步步为赢(14):WCF安全编程--基本概念
- Windows多线程编程 [1] 基本概念
- Spring Core Programming(Spring核心编程) - AOP Concepts(AOP基本概念)
- 嵌入式C程序员应该知道的几个基本问题
- 黄聪:C# 使用线程你可能不知道的问题
- 取样问题 总数n事先不知道,等概率取样 (编程珠玑chapter12 课后题10)
- windows编程的一些基本概念-20121210
- Linux内核模块的概念和基本的编程方法