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

面试题一、下列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:课本也不是万能的,如果有出现错误的解析,希望大家指正>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值