почему в этом коде подкачка происходит, когда функция "swap" написана после int main (), но не перед ней? - PullRequest
2 голосов
/ 10 октября 2019

Поэтому я сомневаюсь, что я пробовал вызов по значению. Во время выполнения данного кода происходит подкачка, когда я пишу определение функции после 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;
}

1 Ответ

9 голосов
/ 10 октября 2019

Ваша функция подкачки на самом деле ничего не меняет, потому что она принимает аргументы по значению, а не по ссылке. Все, что вы делаете, это манипулируете переменными, которые являются локальными для этой функции.

Когда вы не вводите это до после main, это не входит в область действия, когда вы вызываете его, поэтомуstd::swap используется вместо. std::swap работает правильно.

Хотя вы специально не сказали std::swap, вы написали using namespace std;, который снимает это требование (веская причина не делать этого !!). И, хотя вы этого не сделали #include <algorithm>, вы не можете гарантировать, какие стандартные заголовки могут оказаться, в том числе и другие, в силу того, как реализована реализация.

...