这个问题已经有答案了:
why in this code swapping happens when the "swap" function is written after int main() but not before it?(1个答案)
4天前关闭。
我有一个程序可以交换两个数字:
#include <iostream>
using namespace std;
void swap(int a, int b) {
int temp;
temp = a;
a = b;
b = temp;
}
int main() {
int a, b;
cout << "Enter the first number: ";
cin >> a;
cout << "Enter the second number: ";
cin >> b;
cout << "Before swapping, the first number was " << a << ", and the second was " << b << "." << endl;
swap(a, b);
cout << "After swapping, the first number is " << a << ", and the second is " << b << "." << endl;
return 0;
}
当我运行它时,我得到以下输出:
Enter the first number: 1
Enter the second number: 3
Before swapping, the first number was 1, and the second was 3.
After swapping, the first number is 1, and the second is 3.
这是预期的,因为swap
函数修改了函数中的变量a
和b
,这应该不会影响它们在main
函数中的值。
但是,如果我将swap
函数放在main
函数之后,没有函数原型,实际上会发生交换:
#include <iostream>
using namespace std;
int main() {
int a, b;
cout << "Enter the first number: ";
cin >> a;
cout << "Enter the second number: ";
cin >> b;
cout << "Before swapping, the first number was " << a << ", and the second was " << b << "." << endl;
swap(a, b);
cout << "After swapping, the first number is " << a << ", and the second is " << b << "." << endl;
return 0;
}
void swap(int a, int b) {
int temp;
temp = a;
a = b;
b = temp;
}
上面的代码生成以下输出:
Enter the first number: 1
Enter the second number: 3
Before swapping, the first number was 1, and the second was 3.
After swapping, the first number is 3, and the second is 1.
为什么会发生这种情况?有人能解释一下吗?
3条答案
按热度按时间k5ifujac1#
不鼓励使用
using namespace std
,您的案例就是一个说明原因的例子。当您的swap
函数位于main()
之后时,main()
使用std::swap
,而不是您的swap
。尽管
std::swap
在其本地作用域之外有影响,但您的自定义swap
在其本地作用域之外没有影响。为了产生影响,a
和b
应该通过引用传递。Demo
anhgbhbe2#
如果我把swap函数放在main函数之后,没有一个函数原型,swap实际上发生了[...]
为什么会发生这种情况?有人能解释一下吗?
这是因为使用的不是 your
swap
函数,而是std::swap
。你可以通过删除
using namespace std;
或者将函数命名为MySwap
并在main
之前提供一个原型来测试这一点。无论你把swap函数放在哪里,它都不会交换调用者变量中的值。5cg8jx4n3#
如果你把函数放在文件的末尾,它仍然像文件开头一样被破坏。不同的是,如果你把它放在文件的末尾,它永远不会被调用。一个不同的函数,标准的
std::swap
被调用。这就是使用
using namespace std
时发生的情况。你得到了一个完全不同的函数,而不是你想要的函数,你会挠头,直到奶牛回家。Never useusing namespace std
。至于你的函数,你实际上不应该使用它,因为标准函数已经存在,而且做得更好。你仍然想知道为什么它被打破了。为此,您需要了解什么是按值传递,它与按引用传递有何不同,以及如何以及何时使用。一本好的C++教科书应该涵盖这个主题。