聪明人见到我早逃走了:请教c++里的一个语句的意思

来源:百度文库 编辑:高考问答 时间:2024/05/08 03:12:51
我看到这么一个程序:
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;

class intArray
{
private:
int *array; //整数序列首地址
int length; //序列中的整数个数
public:
//构造函数,从文件中读取数据用于初始化新对象。参数是文件名。
intArray(char *filename);
void sort(); //对整数序列按非递减排序
~intArray();
void writeToFile(char *filename);
};

intArray::intArray(char *filename)
{
ifstream myFile(filename);
int len=300;
array=new int[len];
length=0;
while(myFile>>array[length++]);
length--;
myFile.close();
}

//*************333***********
void intArray::sort()
{
for(int i=0;i<length-1;i++)
for(int j=i+1;j<length;j++)
if(array[i]>array[j])
array[i]^=array[j],array[j]^=array[i],array[i]^=array[j];
}

//**********666*********

intArray::~intArray()
{
delete [] array;
}

void intArray::writeToFile(char *filename)
{
int step=0;
ofstream outFile(filename);
for(int i=0; i<length; i=i+step)
{
outFile<<array[i]<<endl;
step++;
}
outFile.close();
}

void main()
{
intArray myArray("in.dat");
myArray.sort();
myArray.writeToFile("out.dat");
}
可以看到在//*************333***********和//**********666*********之间有这么一段:
void intArray::sort()
{
for(int i=0;i<length-1;i++)
for(int j=i+1;j<length;j++)
if(array[i]>array[j])
array[i]^=array[j],array[j]^=array[i],array[i]^=array[j];
}
其中的array[i]^=array[j],array[j]^=array[i],array[i]^=array[j];
是什么意思呢?为什么这一句中的三小句之间各有一个逗号而不是分号?
array[i]^=array[j]中的^=是什么意思呢?

 
 
 
该语句的意思是对换 array[ i ] 和 array[ j ] 的值(利用按位异或运算:^ )。

其实对换两个变量的值的方法有三种:
1)用监时变量(最简单、最有保障、可用范围最广,且在多数情况下最快)
2)用按位异或(bitwise XOR)操作(跟方法 1 比较:可用范围小得多,且效率可能较低)
3)用加减法 (最受限制的方法)

按位异或赋值运算符( ^= ):
http://www.dvbbs.net/tech/program/2006042860829.asp
方法 2 的讲解:
a)http://www2.flash8.net/Teach/452.htm
b)http://en.wikipedia.org/wiki/Xor_swap_algorithm

至于为什么调用逗号,最有可能的原因 richardbao2000 已经说了。
csdengxm 则说的详尽些。
我想补充的是,在这种语境中,逗号能保证那三小句从左到右依次执行
(调用函数时,用来隔开被传入的参数的逗号则不提供这种保证)。

这里有提及逗号操作符:
http://www.xxlinux.com/linux/article/development/soft/20060616/1451.html
 
 
 

,可以用来分隔几个表达式。
但分号表示语句的结束。

如果你把这些,换成;
那么意思就会变了。

一句变成了三句。
只有其中第一句才在if()的范围之内了。

因为她懒得写大括号,为了保持一句。

richardbao2000分析得精辟