几个c++的考题

本文探讨了不使用额外变量进行变量值交换的方法及其潜在问题,包括整数溢出和类型限制,并展示了通过异或操作实现交换的技术。此外,还分析了一个类的构造和析构函数调用顺序差异,并解释了在不同操作系统下的行为。最后,详细解析了指针运算中涉及的数据类型和处理器位宽的影响。

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

1.两个同型变量互换内容 之前帖子讨论不申请内存空间交换两个变量的值,没仔细考虑。 目前魔法师的答案是:   以下内容为程序代码: a=2; b=3; a=a+b; b=a-b; a=a-b;         但是如果a,b值很大,会有越界的问题出现。 又找了一条路:   以下内容为程序代码: a^=b; b^=a; a^=b;         对类型严格(int,char型不能隐式转换)的语言,转换char型也没有问题了。  若是其他类型的,能否先变换成整形,然后进行互换,再换回来不过还是要申请空间               2.构造与析构,写输出结果 #include <iostream.h> class A{public:         A(){cout <<"  Construct A!" <<endl;}     ~A(){cout<< "  Distruct  A!" <<endl;} }; voidfn(A a){cout<< "in fn!" << endl;}  void main(){A b;fn(b);}  输出:windows 下: Construct A! in fn! Distruct A! Distruct A! linux下: Construct A! Construct A!  in fn! Distruct A! Distruct A!        3.q-p的值是多少?把数组定义成char,int 类型的(指针不变),又会是多少呢? #include <stdio.h> #include <string.h>  void main() {    double a[3];    a[0]=0; a[1]=1; a[2]=2;    double *p, *q;    p=a;    q=&a[2];    printf("p address: %d/n",p);    printf("q address: %d/n",q);     printf("q-p value: %d/n",q-p);     printf("a[q-p]=: %f/n", a[q-p]);} 结果∶(假设p=1234500) P=1234500 Q=1234508 q-p=2  前辈的解释:  HP Unix 系统下  sizeof(char) = 1sizeof(int)   = 4sizeof(double) = 8这里的 1,4,8对应的是Byte,1Byte = 8 bits对于32位处理器32bits作为一个处理单元,也就是说char只有1/4个处理单元,int有1个处理单元,double有2个处理单元由此,double[2]-double[0] =2int[2]-int[0] = 1(实际占用1.5个存储单元)char[2]-char[0] = 0 (3个char都在一个存储单元内)       个人见解:望指正  (1.p和q不是double型的十进制数,而是double型的指针,运算规则和十进   制数不同  (2.用十进制打印时只是显示所代表的地址,所以差8个地址(8个byte)  (3.两者做运算时则按指针运算,不是按十进制运算,是按所指数据的类型大小为单元进行运算,既此时差2个单元(2个double)  (4.跟处理器的位数有关系的是地址的差值(8),而不是单元的差值(2) 因此只要数据和指针类型相同时,都是差2个单元 而当两者不同时:  -------------------------------------------------------  icecream在2005-2-25 15:57:59说道: 说明一下,我只是修改了数组的类型,如果保持指针类型和数组类型一致的话结果都是2,我认为这一点一楼的没说清。 ---- 可我在unix下的执行结果就是2,0,1,q-p其实就是数组元素a[2]的地址减去a[0]的地址,我就是不太明白为什么char的时候结果是0,请指教。--------------------------------------------------------- 指针是double,而数据是char型时三个char型数据都在一个double单元里,所以p和q指向同一double单元虽然两者地址的十进制差为2,但是按double单元运算时,4个地址差才算一个单元差所以不够一个单元差,默认为0,就象< 1的小数取整时为0一样单元差值的变化取决于数据类型和指针类型两个因素跟处理器的位数有关系的是地址的差值(8),而不是单元的差值(2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值