当表达式作为c中的参数传递时,将存储结果的类型

时间:2015-03-17 08:21:02

标签: c function

如果我传递的数学表达式为func(a*b/c),其中a的类型可能为doubleb可能为long int等。

传递这样的参数有什么问题吗?如果结果值太长会怎么样?使用表达式作为函数参数的任何问题?

2 个答案:

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

现场演示:https://ideone.com/3JdXy7