почему в этом коде подкачка происходит, когда функция подкачки написана после int main(), а не перед ней?

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

person Community    schedule 09.10.2019    source источник
comment
Не могу быть уверен, не видя ваших включений и/или есть ли у вас using namespace std; в вашем коде, но я предполагаю, что после того, как вы переместите его после того, как main: std::swap будет использоваться вместо вашей функции. Ваша функция не выполняет обмен, поскольку значения передаются по значению, а не по ссылке, поэтому она меняет местами только копии этих переменных.   -  person Algirdas Preidžius    schedule 10.10.2019
comment
Я добавил все включено сейчас   -  person    schedule 10.10.2019
comment
чтобы исправить свой собственный обмен, просто измените подпись на void swap(int& a, int& b) (как сказал @AlgirdasPreidžius, перейдите по ссылке)   -  person fas    schedule 10.10.2019
comment
Да, я знаю об этом. Я просто хотел узнать, почему здесь произошел обмен. Кроме того, можете ли вы уточнить, что означают свопы копий этих переменных? @а   -  person    schedule 10.10.2019
comment
@MarshallMathew Из-за using namespace std; используется std::swap (даже если вы не включили заголовок, который его определяет: он мог быть включен другими заголовками STL), поэтому уместно прочитать: Почему «использование пространства имен std;» считается плохой практикой? и возможным (?) дублированием: C++ прохождение по ссылке или по значению?   -  person Algirdas Preidžius    schedule 10.10.2019
comment
@MarshallMathew x и y копируются, когда вы передаете их в свой swap (как a и b), и вы меняете местами a и b, а не x и y   -  person fas    schedule 10.10.2019
comment
Ребята, у нас есть раздел ответов для ответов. Спасибо.   -  person Lightness Races in Orbit    schedule 10.10.2019
comment
@MarshallMathew что означают перестановки копий этих переменных? Функция принимает копию переменных. Меняет местами те. Возвращает. Поскольку подкачка производилась на копиях, никаких изменений вне функции не наблюдается.   -  person Algirdas Preidžius    schedule 10.10.2019
comment
@LightnessRacesinOrbit Ребята, у нас есть раздел для ответов. Спасибо. 1) Да, но мой первый ответ был просто предположением, прежде чем вопрос был отредактирован, чтобы включить недостающую информацию. Ответы должны быть ответами, а не догадками. 2) Даже после редактирования я думаю, что на этот вопрос уже есть ответы где-то еще (на которые я ссылался).   -  person Algirdas Preidžius    schedule 10.10.2019
comment
Перемещение этого swap так, чтобы оно шло после main, немного отвлекающий маневр. Его удаление имело бы тот же эффект.   -  person Pete Becker    schedule 10.10.2019
comment
@AlgirdasPreidžius Если все, что у вас есть, это догадки, лучше ничего не публиковать. Но defo не делайте этого в комментариях, где это не может быть рецензировано. Когда вы уже подозреваете, что ваше предложение неверно, это вдвойне плохо. Вы можете просто предоставить ответ тем, кто знает, и перейти к другому вопросу, на который, как вы чувствуете, вы можете ответить. :) Раздел комментариев не предназначен для предоставления решений, уверенно или нет. Ваше здоровье.   -  person Lightness Races in Orbit    schedule 10.10.2019
comment
@LightnessRacesinOrbit Если все, что у вас есть, это догадка, лучше ничего не публиковать. Даже если это догадка: скорее всего, это обоснованная догадка. Как правило, он формируется с учетом аналогичных проблем, замеченных в прошлом, но без необходимой информации, в текущем вопросе, для их подтверждения. Следовательно, если вы примете к сведению эти предубеждения, прежде чем высказать свое предположение о проблеме: я не вижу ничего плохого в этом, вместо того, чтобы просто писать сухое общее заявление Пожалуйста, предоставьте минимально воспроизводимый пример.   -  person Algirdas Preidžius    schedule 10.10.2019
comment
@LightnessRacesinOrbit Если вы уже подозреваете, что ваше предложение неверно, это вдвойне плохо. Почему вы думаете, что я подозреваю, что мое предложение неверно? Я этого не сделал. Я подозревал, что мое предположение правильное, но в вопросе не было достаточно информации, чтобы подтвердить его. Но, тем не менее, по сути, это было просто предположение, даже если я был на 99% уверен, что проблема наблюдается. И даже после того, как вопрос был отредактирован, чтобы включить всю информацию: я чувствую, что это вопрос, составленный из 3 других вопросов, на которые уже ответили на SO, поэтому, на мой взгляд, лучше закрыть его как дубликат.   -  person Algirdas Preidžius    schedule 10.10.2019


Ответы (1)


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

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

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

person Lightness Races in Orbit    schedule 09.10.2019
comment
Большое спасибо. - person ; 10.10.2019
comment
@MarshallMathew Нет проблем - person Lightness Races in Orbit; 10.10.2019