c - 为什么函数只返回相乘的值?
问题描述
为什么这段代码返回 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));
}
解决方案
一个函数使用 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 )
推荐阅读
- html - 从后端编辑 WordPress 页面
- javascript - JS select2插件在选项打开时不滚动
- node.js - 使用范围导入本地 npm 包
- c - 在 swift 5 中将 void* 参数传递给 c 函数时,不推荐使用“withUnsafeBytes”警告
- swift - 使用 takeSnapshot 的 WKWebView 的间歇性空白/部分屏幕截图
- opencv - 如何通过相机校准的结果计算以毫米为单位的焦距?
- javascript - 数组函数类型语法
- go - 总是从 POST req 得到空的身体
- wordpress - 元查询比较事件日期的问题
- javascript - jquery DataTable中按钮的onClick函数