C 为什么排序数组中需要临时存储?

C 为什么排序数组中需要临时存储?,c,C,这段代码是: if(a[i] > a[j]){ temp = a[i]; a[i] = a[j]; a[j] = temp; } 为什么必须使用临时变量?当我尝试不使用temp时: if(a[i] > a[j]){ a[i] = a[j]; } 它不会工作,但在工作之前,当我比较其他变量时,赋值是单向操作a=b仅将b的值赋给a。完成此赋值后,a的原始值将丢失,因此如果没有此临时变量,则无法将该值赋值给b temp = a[i]; a[i] = a[j]

这段代码是:

if(a[i] > a[j]){
   temp = a[i];
   a[i] = a[j];
   a[j] = temp;
}
为什么必须使用临时变量?当我尝试不使用temp时:

if(a[i] > a[j]){  
   a[i] = a[j];
}

它不会工作,但在工作之前,当我比较其他变量时,赋值是单向操作
a=b
仅将
b
的值赋给
a
。完成此赋值后,
a
的原始值将丢失,因此如果没有此临时变量,则无法将该值赋值给
b

temp = a[i];
a[i] = a[j];
a[j] = temp;
然后您将丢失
a[i]
中的值(在赋值
a[i]=a[j]
之前)

有一种方法可以在不使用时间值的情况下交换值

在C中是这样的:

int x = 10, y = 5;
// Code to swap 'x' (1010) and 'y' (0101)
x = x ^ y;  // x now becomes 15 (1111)
y = x ^ y;  // y becomes 10 (1010)
x = x ^ y;  // x becomes 5 (0101)
使用XOR运算符。代码来自,请转到该链接以查找使用此解决方案的完整解释和可能的缺点。

该语句

a[i] = a[j]
a[j]
的内容复制到
a[i]
,先前的
a[i]
内容将丢失

这就是为什么您需要保存这些信息以便交换信息

就好像

int a = 1;
int b = 2;

b = a;  // now contents of b is gone and cannot be assigned to a
试试这个:

int main(void) {
  int a = 2, b = 5, c = 7, d = 11, temp = 0;

  /* a gets overwritten before it was swapped */
  a = b; // a is overwritten and becomes 5 (same value as b)
  b = a; // b becomes 5 (same value as a, which is already same as b)
  printf("%d %d", a, b); // this will print out 5 5
  /* you can see that we lost value of a because it was overwritten */


  /* c gets stored in temporary value before it was stored */
  temp = c;  // temp becomes 7
  c = d;     // c is overwritten with 11 (same value as d
  d = temp;  // d is overwritten with 7 (same as temp or original c)

  return 0;
}

赋值
a=b
b
的值复制到变量
a
中。它不交换它们,而是丢失/丢弃
a
的原始值


由于您不想丢失任何一个原始值(这样做意味着您不需要交换),因此在执行赋值时,有必要将其中一个值保存在其他位置。这是临时变量的函数。

因为您正在覆盖
a[i]
的初始值,所以您不知道分配什么
a[j]
a[i]的旧值会发生什么变化?我知道有一种方法可以在不使用临时变量的情况下交换它们,我只是太慢了,lol.+1当我的投票回来时。不使用XOR交换有多种原因。在现代体系结构上,XOR交换通常比使用临时变量慢,特别是在流水线处理器上。现代编译器通常可以优化e临时的(通过使用机器寄存器),而使用顺序异或很难做到这一点,因为每个语句的结果都依赖于前面的语句。