我已经通过了考试,但没有通过。这是正确的代码。
void sort_pairs(void)
{
for (int i = 0; i < pair_count-1 ; i++)
{
for (int j=i+1; j<pair_count; j++)
{
if (preferences[pairs[i].winner][pairs[i].loser]<preferences[pairs[j].winner][pairs[j].loser])
{
pair temp = pairs[i];
pairs[i]=pairs[j];
pairs[j]=temp;
}
}
}
return;
}
这是我的旧代码。如您所见,我只是将交换部分移至sort_pairs代码中,即可突然工作。
void swap (pair a, pair b)
{
pair temp = pairs[a];
pairs[a]=pairs[b]
pairs[b]=temp;
}
void sort_pairs(void)
{
for (int i = 0; i < pair_count-1 ; i++)
{
for (int j=i+1; j<pair_count; j++)
{
if (preferences[pairs[i].winner][pairs[i].loser]<preferences[pairs[j].winner][pairs[j].loser])
{
swap (pairs[i],pairs[j]);
}
}
}
return;
}
现在我知道问题是按值传递的,因此从技术上讲,我只是交换a和b的副本,而不是原始值i和j。但是,最让我困惑的是何时需要使用指针。
#include <stdio.h>
int sum (int a, int b);
int main (void)
{
int x = 1;
int y = 2;
x = sum (x,y);
printf("%i",x);
}
int sum (int a, int b)
{
return (a+b);
}
这将完美返回3。但是,函数sum不是在更改x的副本,而不是在更改“真实” x的吗?因为如果对交换执行相同操作,它将无法正常工作(如下所示)。
#include <stdio.h>
void swap (int a, int b);
int main (void)
{
int x = 1;
int y = 2;
swap (x,y);
printf("x=%i and y=%i",x,y);
}
void swap (int a, int b)
{
int temp = a;
a=b;
b=temp;
return;
}
x仍将保留原始x,y将保留原始y。
答案 0 :(得分:1)
这将pair
s作为值:
void swap (pair a, pair b) // a is a copy of pairs[i] and b is a copy of pairs[j]
当函数退出时,您对函数a
和b
所做的更改将被放弃。 a
和b
仅在函数本地。
取而代之的是通过引用(pair&
),然后swap
正确的变量:
void swap (pair& a, pair& b) { // a is a ref to pairs[i] and b is a ref to pairs[j]
pair temp = a; // temp is copy constructed from pairs[i]
a = b; // pairs[i] is copy assigned from pairs[j]
b = temp; // pairs[j] is copy assigned from temp
}
旁注:标准库std::swap
中有一个出色的swap
实用程序
在您的sum
函数中,有a
,b
以及涉及到的未命名临时变量。这是返回值。如果我通过添加显示它,它可能会更清楚:
int sum (int a, int b) {
int temp = a + b;
return temp;
}
a
和b
不做任何更改,您return
的计算结果。在swap
函数中,应该更改用作输入的变量,这就是为什么需要使用对这些变量的引用的原因。例如,您可以编写另一个附加功能,如下所示:
void add_x_to_y(int x, int& y) {
y += x;
}
这里x
是按值取值的,而y
是引用的,因为我们应该在x
上加上y
。然后,在函数内部对y
所做的更改将直接对作为y
传递给函数的变量进行。
最让我困惑的是何时需要使用指针。
在任何情况下都不会使用指针。仅引用和值。