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临时的(通过使用机器寄存器),而使用顺序异或很难做到这一点,因为每个语句的结果都依赖于前面的语句。