我开始发展,抱歉这个新手问题。
我需要创建一个在2个变量之间交换值的函数。
我已经编写了这段代码,但是没有对变量进行任何更改,我应该更改什么?我的错是什么?
#include <iostream>
using namespace std;
void swap_values( int x, int y);
int main(void) {
int a,b;
a = 2;
b = 5;
cout << "Before: " << a << " " << b << endl;
swap_values( a,b );
cout << "After: " << a << " " << b << endl;
}
void swap_values( int x, int y ){
int z;
z = y;
y = x;
x = z;
}
答案 0 :(得分:10)
您需要通过引用传递变量:
void swap_values( int& x, int& y )
{
int z;
z = y;
y = x;
x = z;
}
pass-by-value
和pass-by-reference
是主要编程语言中的关键概念。在C ++中,除非您指定by-reference,否则会出现pass-by-value
。
它基本上意味着它不是传递给函数的原始变量,而是复制。
这就是为什么在函数之外,变量保持不变 - 因为在函数内部,只修改了副本。
如果您通过引用(int& x, int& y
)传递,则该函数对原始变量进行操作。
答案 1 :(得分:1)
您需要了解默认情况下,C ++使用按值调用的调用约定。
当您调用swap_values
时,其堆栈帧会接收作为参数传递给它的值的副本。因此,参数int x, int y
完全独立于调用者和变量int a, b
。
幸运的是,C ++还支持call-by-reference(参见维基百科或者关于它的优秀编程语言设计教科书),这实际上意味着函数中的变量绑定到(或别名)调用者中的变量(这是一种粗略的简化)。
call-by-reference的语法是:
void swap_values( int &x, int &y ){
// do your swap here
}
答案 2 :(得分:0)
你正在经历价值。你仍然可以通过值传递,但需要使用指针。
这是正确的代码:
void swap(int *i, int *j) {
int t = *i;
*i = *j;
*j = t;
}
void main() {
int a = 23, b = 47;
printf("Before. a: %d, b: %d\n", a, b);
swap(&a, &b);
printf("After . a: %d, b: %d\n", a, b);
}
也是一个小文件,解释“按引用”与“按价值”:http://www.tech-recipes.com/rx/1232/c-pointers-pass-by-value-pass-by-reference/