c++ 在文件末尾放置一个交换函数使其工作[重复]

ekqde3dh  于 2023-10-20  发布在  其他
关注(0)|答案(3)|浏览(103)

这个问题已经有答案了

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函数修改了函数中的变量ab,这应该不会影响它们在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.

为什么会发生这种情况?有人能解释一下吗?

k5ifujac

k5ifujac1#

不鼓励使用using namespace std,您的案例就是一个说明原因的例子。当您的swap函数位于main()之后时,main()使用std::swap,而不是您的swap
尽管std::swap在其本地作用域之外有影响,但您的自定义swap在其本地作用域之外没有影响。为了产生影响,ab应该通过引用传递。

#include <iostream>

void swap(int& a, int& b) // (In order to have an impact: 'a' and 'b' hould be passed by reference) 
{
    int temp;

    temp = a;
    a = b;
    b = temp;
}

int main() 
{
    int a, b;

    std::cout << "Enter the first number: ";
    std::cin >> a;
    std::cout << "Enter the second number: ";
    std::cin >> b;

    std::cout << "Before swapping, the first number was " << a << ", and the second was " << b << "." << std::endl;

    swap(a, b);

    std::cout << "After swapping, the first number is " << a << ", and the second is " << b << "." << std::endl;
}

Demo

anhgbhbe

anhgbhbe2#

如果我把swap函数放在main函数之后,没有一个函数原型,swap实际上发生了[...]
为什么会发生这种情况?有人能解释一下吗?
这是因为使用的不是 yourswap函数,而是std::swap
你可以通过删除using namespace std;或者将函数命名为MySwap并在main之前提供一个原型来测试这一点。无论你把swap函数放在哪里,它都不会交换调用者变量中的值。

5cg8jx4n

5cg8jx4n3#

如果你把函数放在文件的末尾,它仍然像文件开头一样被破坏。不同的是,如果你把它放在文件的末尾,它永远不会被调用。一个不同的函数,标准的std::swap被调用。
这就是使用using namespace std时发生的情况。你得到了一个完全不同的函数,而不是你想要的函数,你会挠头,直到奶牛回家。Never use using namespace std
至于你的函数,你实际上不应该使用它,因为标准函数已经存在,而且做得更好。你仍然想知道为什么它被打破了。为此,您需要了解什么是按值传递,它与按引用传递有何不同,以及如何以及何时使用。一本好的C++教科书应该涵盖这个主题。

相关问题