如果我传递的数学表达式为func(a*b/c)
,其中a的类型可能为double
,b
可能为long int
等。
传递这样的参数有什么问题吗?如果结果值太长会怎么样?使用表达式作为函数参数的任何问题?
答案 0 :(得分:1)
不要将函数的 definiion 与函数的调用混合在一起。定义说明论证的类型是什么;在调用中,编译器忠实地执行(编译)表达式,将其转换为已定义的函数参数的适当类型。
void func1(double a);
void func2(int a);
...
func1( 2 * 3/3);
func2( 2.0 * 3/3);
在第一次调用func1()时,表达式被计算为整数,然后结果作为double被压入堆栈。在func2()的第二个cal中,表达式被计算为double,然后将结果转换为整数并推送到堆栈。在第二种情况下,编译器可能会发出关于转换中可能丢失精确度的警告;在第一种情况下,它不会发出这样的警告,因为所有整数结果都适合双倍。
答案 1 :(得分:1)
C11介绍了 _Generic 选择表达式,它提供了一个编译时的机制 基于类型的选择允许使用创建类型通用宏 标准C结构。
#include <stdio.h>
int fn_as_int(int val){return val * 2;}
double fn_as_double(double val){return val * 2;}
long fn_as_long(long val){return val * 2;}
int main(void)
{
int a = 100;
double b = 5.0;
long c = 2;
int x = _Generic(a*b/c, int: 1, double: 2, long: 3, default: 0);
switch (x) {
case 0:
case 1:
printf("As integer = %d\n", fn_as_int(a*b/c));
break;
case 2:
printf("As double = %f\n", fn_as_double(a*b/c));
break;
case 3:
printf("As long = %ld\n", fn_as_long(a*b/c));
break;
default:
printf("Unknown\n");
}
return 0;
}