若干笔试题

本文深入探讨了C++编程中的几个关键技巧,包括数组指针操作、共用体内存分配原理及位运算优化方法,通过具体示例展示了这些技巧的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://blog.youkuaiyun.com/xhz1234/article/category/864687


以下代码输出什么?

  1. #include <stdlib.h>  
  2. #include <stdio.h>  
  3.   
  4. int main(void)  
  5. {  
  6.     int a[5] = {1,2,3,4,5};  
  7.     int *p = (int*)(&a+1);  
  8.     printf("%d, %d\n", *(a+1), *(p-1));  
  9.       
  10.     return 0;  
  11. }  

答案:2,5

解析:&a其实是代表数组的地址,&a+1则是地址加上数组的长度

而a代表数组首元素的地址,a+1相当与地址加上一个数组元素的长度

(注:数组的地址和数组首元素的地址是相同的)



昨天晚上笔试,遇到一个题,虽然做对了,但是不知原因,请高人详解。

 

#include <stdlib.h>
#include <stdio.h>

union{
	int n;
	char bchar[4];
}UN;	

int main(void)
{
	UN.bchar[0] = 0;
	UN.bchar[1] = 1;

	printf("%d\n", UN.n);
	return 0;
}


 

结果为256.当讲UN.bchar[1]改为2,则结果为512。结果依次递增(是256的整数倍)。

为什么是这样啊。

我知道在一个共用体中只有最后一个被赋值的内部变量才是有效的。

上述结果如何解释呢?





共用体(union)是一种数据格式,他能够存储不同类型的数据,但是只能同时存储其中一种类型的数据。共用体类型在有的书中亦译为联合体类型。
结构体(struct)可以同时存储int,long和double等,而共用体只能能存储int, long ,或double.
union one4all
{
    int int_val;
    long long_val;
    double double_val;
};

可以使用one4all变量来存储int,long或double,条件是不同的时间进行
one4all pail;
pail.int_val=15;
cout << pail.int_val;
pail.double_val = 1.38;
vout << pail.double_val;
上述例子,pail有时是int,有时是double型。成员变量标识了变量的容量。
由于共用体每次只能存储一个值,因此它必须有足够的空间来存储最大的成员,所以它使用的是最大成员的长度,上例中则使用了double类型


使用类型,当一个栏目要存储两种不同的类型时。如商品id,可能是纯数字,也肯能是字符描述的,在此使用共用体能够节省空间。

匿名共用体
struct widget
{
    char brand[20];
    int type;
    union 
    {
        long id_num;
        char id_char[20];
    };
};
...
widget prize;
...
if(prize.type == 1)
    cin >> prize.id_num;
else
    cin >> prize.id_char[20];
...





今天遇到了一个笔试题,题目如下

    

求下面函数的返回值
int func(x) 

    int countx = 0; 
    while(x) 
    { 
          countx ++; 
          x = x&(x-1); 
     } 
    return countx; 
假定x = 9999。 答案:8
给出的解题思路是:将x转化为2进制,看含有的1的个数。
 
但是,我不懂啊

 


下面这个程序写的很漂亮,请注意体会!!!!

  1. /* 
  2. 请编写函数: 
  3. unsigned int reverse_bites(unsigned int value); 
  4. 这个函数的返回值是把value的二进制位模式从左到右交换一次后的值。例如,在32位机器上,25这个值包含下列各个位: 
  5. 00000000000000000000000000011001 
  6. 函数的返回值应该是2,550,136,832,它的二进制位模式是: 
  7. 10011000000000000000000000000000 
  8. 编写函数时要注意不要让它依赖于你的机器上整型值的长度。 
  9. */  
  10. #include <stdlib.h>  
  11. #include <stdio.h>  
  12. #include <string.h>  
  13.   
  14. size_t reverse_bites(size_t value);  
  15.   
  16. int main(void)  
  17. {  
  18.     int input;  
  19.     printf("Please input a number\n");  
  20.     scanf("%d", &input);  
  21.   
  22.     printf("The result after reverse is %d\n", reverse_bites(input));  
  23.   
  24.     system("pause");  
  25.     return 0;  
  26. }  
  27.   
  28. size_t reverse_bites(size_t value)  
  29. {  
  30.     int answer = 0;  
  31.     for(int i = 1; i != 0; i <<= 1)  
  32.     {  
  33.         answer <<= 1;  
  34.         if(value & 1)  
  35.             answer |= 1;  
  36.         value >>= 1;  
  37.     }  
  38.     return answer;  
  39. }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值