Почему функция возвращает только умноженное значение? - PullRequest
1 голос
/ 12 февраля 2020

Почему этот код возвращает 500 и какое-то мусорное значение? Почему не работает функция деления?

#include <stdio.h>

int divmul(int v1, int v2)
{
    int div,mul;
    div =v1/v2;
    mul=v1*v2;
    return div,mul;
}
main()
{
    int val1=50, val2=10;
    printf("%d %d\n", divmul(val1,val2));
}

1 Ответ

7 голосов
/ 12 февраля 2020

Функция может вернуть только один объект, используя оператор return.

В этом операторе возврата

return div,mul;

используется выражение с оператором запятой. Его значение является значением правильного операнда. Таким образом, фактически, поскольку выражение div не имеет побочных эффектов, оператор возврата эквивалентен

return mul;

из C стандарта (оператор 6.5.17 запятой)

2 Левый операнд оператора запятой оценивается как пустое выражение; существует последовательность между его оценкой и оценкой правого операнда. Затем вычисляется правый операнд; результат имеет свой тип и значение. И компилятор выдаст ошибку для вызова printf, потому что не хватает аргументов.

Либо объявите в качестве возвращаемого типа структуру, например,

struct Result
{
    int div;
    int mul;
};

struct Result divmul( int v1, int v2 )
{
    struct Result result = { v1 / v2, v1 * v2 };

    return result;
}

, а затем в main

int main( void )
{
    int val1 = 50, val2 = 10;

    struct Result result = divmul( val1, val2 );

    printf( "%d %d\n", result.div, result.mul );
}

Или вернуть результат из параметров функции (так называемые выходные параметры)

void divmul( int *v1, int *v2 )
{
    int div = *v1 / *v2;
    int mul = *v1 * *v2;

    *v1 = div;
    *v2 = mul;
}

И в main

int main( void )
{
    int val1 = 50, val2 = 10;

    divmul( &val1, &val2 );

    printf( "%d %d\n", val1, val2 );
}

Обратите внимание на согласно стандарту C функция main без параметров должна быть объявлена ​​как

int main( void )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...