面试题答案
一键面试类型相关问题及处理方式
- 类型检查:宏本身无法直接进行类型检查,所以在调用宏时,需要确保传入的参数类型是预期的
int
、float
或double
。否则可能导致未定义行为。 - 类型转换:由于要计算平均值,不同类型参数混合时,需要确保正确的类型转换。例如
int
和float
混合,int
应转换为float
以得到准确结果。 - 兼容性:要考虑不同平台下
int
、float
和double
的大小和表示方式可能不同。尽量避免依赖特定平台的特性。
宏定义示例代码
#include <stdio.h>
// 定义一个宏来计算可变参数的平均值
#define PROCESS_ARGS(...) \
({ \
int int_count = 0; \
float float_count = 0; \
double double_count = 0; \
int int_sum = 0; \
float float_sum = 0; \
double double_sum = 0; \
int __i; \
va_list args; \
va_start(args, __VA_ARGS__); \
for (__i = 0; __i < (int)(sizeof((__VA_ARGS__)) / sizeof((__VA_ARGS__)[0])); __i++) { \
if (typeid(*(va_arg(args, void*))) == typeid(int)) { \
int_sum += va_arg(args, int); \
int_count++; \
} else if (typeid(*(va_arg(args, void*))) == typeid(float)) { \
float_sum += va_arg(args, float); \
float_count++; \
} else if (typeid(*(va_arg(args, void*))) == typeid(double)) { \
double_sum += va_arg(args, double); \
double_count++; \
} \
} \
va_end(args); \
printf("Int average: %d\n", int_count > 0? int_sum / int_count : 0); \
printf("Float average: %f\n", float_count > 0? float_sum / float_count : 0); \
printf("Double average: %lf\n", double_count > 0? double_sum / double_count : 0); \
})
宏调用示例代码
int main() {
PROCESS_ARGS(1, 2, 3, 4.5f, 5.5f, 6.0, 7.0);
return 0;
}
上述代码实现了对 int
、float
和 double
类型参数分别计算平均值的功能。在宏定义中,通过 va_list
来处理可变参数,遍历参数并根据类型分别统计和求和,最后计算并输出每种类型参数的平均值。在调用宏时,传入不同类型的参数进行测试。需要注意,实际应用中可以根据需求优化错误处理和输出格式等。