如何检查数组元素是整数还是浮点数?

4

我有两个数组,其中一个被注释了,我想制作一个通用的printf函数来打印这些值:

int values [] = { 88, 56, 100, 2, 25 };
//float values[] = {88.5f, 56.5f, 100.0f, 2.234f, 88.12f};

if (value[0] is int) {
    for(i; i < 5; ++i)
    printf("%d ", *(values + i));
} else {
    for(i; i < 5; ++i)
    printf("%f ", *(values + i));
}

有没有办法进行检查?例如,当我想要查看元素是字符还是整数时,我使用了sizeof。


我不需要一种将两个值类型存储在其中的方法。我需要知道如何查找数组元素是整数还是浮点数的信息。 - F1sher
3
你可能试图做错事。不过,你可以在最新的C标准中使用_Generic(values[0], int: 0, float:1, default:2) - Pascal Cuoq
_Generic(values[0], int: 0, float:1, default: 2); 这很有趣,但无法编译。我目前使用的是最新的Dev-C++ 5.5.3。[错误] 在“int”之前需要表达式。 - F1sher
@PascalCuoq,我之前不知道有_Generic,谢谢! - Matt Bryant
2
你忘记将 i 初始化为 0 了。而且为什么要使用 *(values + i) 而不是 values[i] - Keith Thompson
显示剩余3条评论
2个回答

3

需要注意的是,这是一项非常复杂的“特性”,您只会在调试程序时使用。您可以使用C11的_Generic结构:

_Generic(values[0], int: 0, float:1, default:2)

你可能应该考虑使用条件编译,这更符合你的意图。
#define FLOAT_CASE

#ifdef FLOAT_CASE
float values[] = {88.5f, 56.5f, 100.0f, 2.234f, 88.12f};
#else
int values [] = { 88, 56, 100, 2, 25 };
#endif

... // all the code that is independent of the type of values here

for(i; i < 5; ++i)
#ifdef FLOAT_CASE
  printf("%f ", *(values + i));
#else
  printf("%d ", *(values + i));
#endif

1
为什么你写 *(value + i) 而不是 values[i]?而且你忘记把 i 初始化为 0 - Keith Thompson
@KeithThompson 您应该将所有这些评论直接发送给原帖发布者。我逐字逐句地从问题中提取了程序行,以明确我的答案是使用 #ifdef_Generic,而不是修复样式问题(这对编写 intfloat 的通用代码没有帮助)。 - Pascal Cuoq

2

一种不太优雅的解决方案:如果您只需要区分整数和浮点数,可以将一个非整数值(比如0.1)赋给变量,然后测试实际值。代码如下:

#define IS_INT_TYPE(x) (x=0.1, x==0)

然而,这将破坏宏参数的原始值。如果您使用gcc,可以使用typeof()扩展来转换该值:

#define IS_INT_TYPE(x) (((typeof(x)) 0.1) == 0)

帕斯卡的笔记启发了我解决问题的思路:

#define IS_INT_TYPE(x) (((x*0+1)/2) == 0)

如果您想朝这个方向发展,一个解决方案是,如果知道 x 既不是 0,也不在其类型的极限因子范围内,则 x / (x + x) == 0 - Pascal Cuoq
去除0的限制:x==0 ? ((x+1) / 2 == 0) : … - Pascal Cuoq
1
只需要 x 为有限浮点数:x == 0 ? ((x+1) / 2 == 0) : (x/x) / (x/x + x/x) == 0。[在看到编辑后] 好吧,你的解决方案显然更好,但仍需要 x 是有限的。这很容易测试:!(x < INT_MIN) && !(x > INT_MAX) && … - Pascal Cuoq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接