как мне заставить несколько целых чисел передавать несколько функций?

#c

#c

Вопрос:

В этом коде я пытаюсь вывести сумму и разницу двух входных данных. Когда я запускаю эту программу, сумма выводится нормально, но вместо разницы выводится первый ввод. Как я могу заставить эту программу выводить разницу, а также сумму?

 void Modify(int *x, int *y) {
    *x = *x   *y;
    
    if (*x >= *y)
        *y = *x - *y;
    if (*x < *y)
        *y = *y - *x;
                
}

int main() {
    
    int x, y;
    
    int *ptr_x = amp;x;
    int *ptr_y = amp;y;
    
    cin >> x;
    cin >> y;
    
    Modify(ptr_x, ptr_y);
    
    cout << x << endl;
    cout << y;
                 
    return 0;
}
  

Комментарии:

1. После изменения значения при x некотором хитром мышлении потребуется использовать предыдущее значение в будущих операциях. Возможно, вы захотите использовать временную переменную.

2. если я не могу ничего изменить ниже int main, есть ли способ создать временную переменную?

3. Поместите временную переменную выше int main , где это необходимо.

Ответ №1:

 void Modify(int *x, int *y) {
    *x = *x   *y;
    
    if (*x >= *y)
        *y = *x - *y;
    if (*x < *y)
        *y = *y - *x;
                
}
  

Ваша первая строка *x = *x *y; перезаписывает *x значение с *x *y помощью, следовательно, следующие утверждения вводят в заблуждение

     if (*x >= *y)
        *y = *x - *y;
    if (*x < *y)
        *y = *y - *x;
  

и не выполняют то, что вы ожидаете.

В качестве общего совета, сохраняйте свой код простым и понятным в отношении ваших намерений:

 #include <cmath>

void Modify(int *x, int *y) {

    using std::abs;

    int sum      = *x   *y;
    int abs_diff = abs(*x - *y);
    
    *x = sum;
    *y = abs_diff;
}
  

Комментарии:

1. Одна только ясность стоит кивка.

Ответ №2:

Было бы неплохо, если бы вы объяснили, почему вы не можете сделать что-то простое, как std::cout << x y << endl << x - y; без вызова какой-либо функции.

Но если вы хотите сделать это таким образом, без дополнительных переменных, один из вариантов таков:

 void Modify(int *x, int *y) {
    *x = *x   *y;      ///x = original x   original y
    *y = *x - 2*(*y);  ///y = (original x   original y) - 2*(original y)        
}
  

Примечание: будьте осторожны с переполнениями

Редактировать: если вам нужно абсолютное значение разницы, используйте вместо *y = abs(*x - 2*(*y)) ;

Ответ №3:

Это не разница в печати, потому что вы обновляете значение x с суммой обоих, *x = *x *y как @user4581301, предложенной в комментарии. Вы можете сделать что-то вроде этого.

  
void Modify(int *x, int *y) {
    int* temp = new int(*x);
    *x = *temp   *y;
    
    if (*temp >= *y)
        *y = *temp - *y;
    if (*x < *y)
        *y = *y - *temp;
    delete temp;
}
  

Что это сделает, так это то, что вы создадите новый целочисленный указатель temp , в котором будет сохранено значение x , и теперь вы можете изменить x , но в других местах, где x это было необходимо, мы будем использовать temp вместо x . И в конце мы удаляем temp .

Комментарии:

1. Какая-либо причина int temp = *x; не сработает? Выделение для одного int может стать дорогостоящим, если функция вызывается повторно. Любая причина, по которой вы не используете if (*temp < *y) ?