首页 > 解决方案 > 为什么函数只返回相乘的值?

问题描述

为什么这段代码返回 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));
}

标签: cfunctionreturn-valuedeclarationdefinition

解决方案


一个函数使用 return 语句只能返回一个对象。

在这个返回声明中

return div,mul;

使用逗号运算符的表达式。它的值是右操作数的值。所以实际上由于表达式div没有副作用,所以 return 语句等价于

return mul;

来自 C 标准(6.5.17 逗号运算符)

2 逗号运算符的左操作数被评估为 void 表达式;在它的求值和右操作数的求值之间有一个序列点。然后对右操作数求值;结果有它的类型和值。并且编译器将为 printf 调用发出错误,因为没有足够的参数。

或者将结构声明为返回类型,例如

struct Result
{
    int div;
    int mul;
};

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

    return result;
}

然后在主要

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;
}

而在主要

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

    divmul( &val1, &val2 );

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

请注意,根据 C 标准,不带参数的函数 main 应声明为

int main( void )

推荐阅读