两个数交换,你想到怎么写呢,应用层的人大概只听说过利用另一个变量进行暂存值,还有哪些方法呢?
作为底层学习人员我想你必须知道利用数的位操作,
*a ^= *b;
*b ^= *a;
*a ^= *b;
(貌似异或有个直接的什么电路,几部电路就达到了 目得)
(书上还写了如果两个相等 则它们两个的值均为0 ,我百思不能其解,用笔算也是交换啊,怎么会变成0,很疑惑)
这三步就是利用位操作进行的交换操作,当然也可以写成这样
*a ^= *b ^= *a ^= *b; 这并不是装B的表现(如果你是学习应用层这个完全不用了解),就如上一篇中CDEL混乱版本,有太多值得你学习
我们这里 int a =12,b = 55;
int *p[] = {&a,&b};
*p[1] ^= *p[0] ^= *p[1] ^= *p[0];(
在 Gcc 下我们发现这样并不可行(gcc下又是怎么处理这中表达式的呢,(若p[0,1]不为指针这里是可以按预想运行的)),但是裁分为下面的形式 我们发现可以按我们预想的运行,那么在vc上呢?)
这时我们会发现 它并不是按照我们想的那样, 这时的*p[1]将会为0 这时为什么呢?首先对其裁分:
*p[1] ^= *p[0];
*p[0] ^= *p[1];
*p[1] ^= *p[0];
裁分后 可以按预想运行,看来是gcc中对上面那种连起的表达式 的处理方式不一样
书上提到的 bus error ,貌似是现在的编译器 允许了还是pc机的环境所致,或者大端和小端的原因或者是老书的原因,我倒是从未遇见过#include <stdio.h>union{char apple[10];int i;}pear;int *banana = (int *)&(pear.apple[1]);int main(){return 0;}在网上我找到这样的答案:http://topic.csdn.net/t/20031110/19/2446753.html 我们经常会发现有两种内存转储(core dump) 一种是段错误(segment error)通常是在一个非法的地址上进行取值赋值操作造成。 一种是总线错误(bus error)通常时指针强制转换,导致CPU读取数据违反了一定的总线规则。 下面请大家讨论一下总线错误 有例子如下sizeof(int)==4: #include <stdio.h> #include <stdlib.h> int main() { int i[5]; int j; i[0]=65536+2; i[1]=65536*3+4; j=*((int *)((char *)i+2)); /* 1 bus error */ printf( "size of int is %d\nj=%d ",sizeof(int),j); return 0; } 我们姑且不考字节序问题,不管j结果是几. 在一般RISC的CPU上,一般的unix机器上都会出现bus error。 而在windows机器上,我用了vc的cl borland的bcc32和gnu的gcc编译执行都没问题。 大家有兴趣可以讨论一下 在函数调用过程时,过程活动记录,每个函数一个栈