user-0 提问: 菜鸟刚学位操作请教一个互换问题

回复:
user: user-0
content: 引用 9 楼 leisuregame 的回复:[quote=引用 楼主 orangerx 的回复:] 各位大大好,今天刚学到位操作，互换两个数(把a,b互换)有一代码为： a=a^b; b=a^b; a=a^b; 以上的代码是正确的，然后我把它写成 a^=b^=a^=b; 这也正确，但： a=a^b=b^a=a^b;这就报错了，之前学习到'=赋值符好像是右结合性的，即从右到左计算。  另外还有一个问题：请问这个位操作还可以互换整个数组或字符串吗？  a^=b^=a^=b  实际上是a^=(b^=(a^=b)),执行的是下面的步骤： a^=b; b^=a; a^=b; 这样是没问题的。  a=a^b=b^a=a^b相当于a=(a^b=(b^a=a^b)) 但是b^a返回的是一个右值，无法对它进行赋值，所以是无法通过编译的。 [/quote] 原来是这样子的

user: user-0
content: 引用 8 楼 nadleeh123 的回复:[quote=引用 楼主 orangerx 的回复:] 各位大大好,今天刚学到位操作，互换两个数(把a,b互换)有一代码为： a=a^b; b=a^b; a=a^b; 以上的代码是正确的，然后我把它写成 a^=b^=a^=b; 这也正确，但： a=a^b=b^a=a^b;这就报错了，之前学习到'=赋值符好像是右结合性的，即从右到左计算。  另外还有一个问题：请问这个位操作还可以互换整个数组或字符串吗？  为什么你们都喜欢把简单的东西复杂化？[/quote]  因为初学阶段对这些东西比较好奇

user: user-1
content: 引用 楼主 orangerx 的回复:各位大大好,今天刚学到位操作，互换两个数(把a,b互换)有一代码为： a=a^b; b=a^b; a=a^b; 以上的代码是正确的，然后我把它写成 a^=b^=a^=b; 这也正确，但： a=a^b=b^a=a^b;这就报错了，之前学习到'=赋值符好像是右结合性的，即从右到左计算。  另外还有一个问题：请问这个位操作还可以互换整个数组或字符串吗？  a^=b^=a^=b  实际上是a^=(b^=(a^=b)),执行的是下面的步骤： a^=b; b^=a; a^=b; 这样是没问题的。  a=a^b=b^a=a^b相当于a=(a^b=(b^a=a^b)) 但是b^a返回的是一个右值，无法对它进行赋值，所以是无法通过编译的。

user: user-2
content: 引用 楼主 orangerx 的回复:各位大大好,今天刚学到位操作，互换两个数(把a,b互换)有一代码为： a=a^b; b=a^b; a=a^b; 以上的代码是正确的，然后我把它写成 a^=b^=a^=b; 这也正确，但： a=a^b=b^a=a^b;这就报错了，之前学习到'=赋值符好像是右结合性的，即从右到左计算。  另外还有一个问题：请问这个位操作还可以互换整个数组或字符串吗？  为什么你们都喜欢把简单的东西复杂化？

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:[quote=引用 3 楼 orangerx 的回复:] 二楼大大的代码好复杂，简化一些我是初学者来的。。 怕复杂当不了好程序员。[/quote]  是的。。。

user: user-3
content: 引用 3 楼 orangerx 的回复:二楼大大的代码好复杂，简化一些我是初学者来的。。 怕复杂当不了好程序员。

user: user-4
content: 引用 4 楼 orangerx 的回复:[quote=引用 2 楼 u013061236 的回复:] [quote=引用 楼主 orangerx 的回复:] 各位大大好,今天刚学到位操作，互换两个数(把a,b互换)有一代码为： a=a^b; b=a^b; a=a^b; 以上的代码是正确的，然后我把它写成 a^=b^=a^=b; 这也正确，但： a=a^b=b^a=a^b;这就报错了，之前学习到'=赋值符好像是右结合性的，即从右到左计算。   另外还有一个问题：请问这个位操作还可以互换整个数组或字符串吗？  先不说别的，代码要简洁明了，所以用最上面的即可。 另外：位操作应该是针对数字操作的，一般为整型 关于字符的操作，你可以试下，这个我没试过，不清楚[/quote]  字附串我不知道怎么操作，字符的话也属于整型的一种，测试过是没问题的[/quote]  那应该就没问题，字符串可以自己写个函数，一个个交换

user: user-0
content: 引用 2 楼 u013061236 的回复:[quote=引用 楼主 orangerx 的回复:] 各位大大好,今天刚学到位操作，互换两个数(把a,b互换)有一代码为： a=a^b; b=a^b; a=a^b; 以上的代码是正确的，然后我把它写成 a^=b^=a^=b; 这也正确，但： a=a^b=b^a=a^b;这就报错了，之前学习到'=赋值符好像是右结合性的，即从右到左计算。  另外还有一个问题：请问这个位操作还可以互换整个数组或字符串吗？  先不说别的，代码要简洁明了，所以用最上面的即可。 另外：位操作应该是针对数字操作的，一般为整型 关于字符的操作，你可以试下，这个我没试过，不清楚[/quote]  字附串我不知道怎么操作，字符的话也属于整型的一种，测试过是没问题的

user: user-0
content: 二楼大大的代码好复杂，简化一些我是初学者来的。。

user: user-4
content: 引用 楼主 orangerx 的回复:各位大大好,今天刚学到位操作，互换两个数(把a,b互换)有一代码为： a=a^b; b=a^b; a=a^b; 以上的代码是正确的，然后我把它写成 a^=b^=a^=b; 这也正确，但： a=a^b=b^a=a^b;这就报错了，之前学习到'=赋值符好像是右结合性的，即从右到左计算。  另外还有一个问题：请问这个位操作还可以互换整个数组或字符串吗？  先不说别的，代码要简洁明了，所以用最上面的即可。 另外：位操作应该是针对数字操作的，一般为整型 关于字符的操作，你可以试下，这个我没试过，不清楚

user: user-3
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  #include <stdio.h> #define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0) char   *p1="1" ,*p2="2" ; char    c1=1   , c2=2   ; short   s1=1   , s2=2   ; int     i1=1   , i2=2   ; __int64 I1=1i64, I2=2i64; float   f1=1.0f, f2=2.0f; double  d1=1.0 , d2=2.0 ; void main() {     SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);     SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);     SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);     SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);     SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);     SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);     SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);      SWAP(c1,c1);     printf("%d\n",c1); } //char *         2,       1 //char           2,       1 //short          2,       1 //int            2,       1 //__int64     2,    1 //float          2,       1 //double        2,      1 //2