【问题标题】:why in this code swapping happens when the "swap" function is written after int main() but not before it?为什么在这段代码中,当“swap”函数写在 int main() 之后而不是在它之前时,会发生交换?
【发布时间】:2020-02-07 08:06:44
【问题描述】:

所以我的疑问是, 我正在尝试按值调用, 在运行给定的代码时,当我在 int main() 之后编写函数定义时会发生交换 但是,如果我在 int main() 上方剪切并粘贴函数定义,则不会发生交换。这是为什么呢?


#include<iostream>
#include<string>
#include<vector>
#include<bitset>
#include<fstream>
using namespace std;
#define ADDU 1
#define SUBU 3
#define AND 4
#define OR  5
#define NOR 7
#define MemSize 65536
void swap(int a, int b)
{
    int temp = a;
    a = b;
    b = temp;
}

int main(){
    // int a = 20;
    // int *p = &a;
    // cout<<"P: "<<p<<endl<<"*P gives: "<<*p<<endl<<"&p gives: "<<&p<<endl<<"&a : "<<&a;;

    int x,y;
    x = 10;
    y = 20;
    cout<<"Before Swapping: "<<"x: "<<x<<endl<<"y: "<<y<<endl;
    swap(x,y);
    cout<<"After Swapping: "<<"x: "<<x<<endl<<"y: "<<y<<endl;
}

【问题讨论】:

  • 如果没有看到您的包含,和/或您的代码中是否有using namespace std;,则无法确定,但我的猜测是,在您将其移动到main 之后:std::swap正在使用,而不是您的功能。您的函数不进行交换,因为值是按值传递的,而不是按引用传递的,所以它只交换这些变量的副本。
  • @MarshallMathew 由于using namespace std;,正在使用std::swap(即使您没有包含定义它的标头:它可能已被其他STL标头包含),所以相关阅读:Why is “using namespace std;” considered bad practice?,可能(?)重复:C++ passing by reference or by value?
  • 伙计们,我们有一个答案部分。谢谢。
  • @LightnessRacesinOrbit "伙计们,我们有一个答案部分。谢谢。" 1) 是的,但我的第一个“答案”只是一个猜测,在问题出现之前编辑以包括缺失的信息。答案应该是答案,而不是猜测。 2)即使在编辑之后,我认为这个问题已经在其他地方(我链接到)有了答案。
  • @AlgirdasPreidžius 如果您只是猜测,最好不要发布任何内容。但是 deffo 不会在无法进行同行评审的 cmets 中这样做。当你已经怀疑你的建议是错误的,那就是双重的坏事。你可以简单地把答案留给那些知道的人,然后继续回答你认为可以回答的另一个问题。 :) cmets 部分不是为了提供解决方案,无论是否自信。干杯。

标签: c++ call-by-value


【解决方案1】:

你的交换函数实际上并没有交换任何东西,因为它通过值而不是引用来获取它的参数。您所做的只是操作该函数的本地变量。

当你直到之后 main 才引入它时,它不在你调用它的范围内,所以用std::swap 代替。 std::swap 工作正常。

虽然你没有特别说std::swap,但你写了using namespace std;,它删除了这个要求(很好的理由不这样做!!)。而且,虽然您没有#include &lt;algorithm&gt;,但您无法保证哪些标准头文件最终可能会根据实现的构造方式包含其他头文件。

【讨论】:

  • 非常感谢。
  • @MarshallMathew 没问题
猜你喜欢
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
相关资源
最近更新 更多