在 ANSI C 中的控制流语句中组合比较测试

问题描述 投票:0回答:3

我试图记住如果使用标准的 c 编译器 (C89),下面的两个 if 语句将以相同的方式评估。

片段1:

boolean function(formattype* format)
{
    if(format != null && (*format == format1 || *format == format2 || *format == format3) )
        return true;
    else
        return false;
}

将以与片段 2 相同的方式进行评估:

boolean function(formattype* format)
{

    if(format != null && (*format == format1 || format2 || format3) )
        return true;
    else
        return false;
}

我只对第二次比较的评价感兴趣,我只是为了说明目的添加了功能。我似乎记得使用一些类似的方法来评估 == 使用每个 ||' 参数而不是全部输入它们但不记得具体细节。

编辑: 也许这个功能让事情变得更混乱,而不是帮助说明。

我正在尝试评估以下内容

if(format != null && (*format == format1 || *format == format2 || *format == format3) )

第一个只是防止取消引用空指针的检查,所以忽略它。后三个查看取消引用的格式指针是否等于三种不同格式类型中的任何一种(如果您必须知道,它们在枚举中)。

我不想用宏,我想简化比较。这可能是不可能的,我只是模糊地记得执行过类似的操作。

我认为这与第二个示例类似。

if(format != null && (*format == format1 || format2 || format3) )
c c89 ansi-c
3个回答
1
投票

不会的。虽然第一个检查是有效的,但第二个会给你一个错误的结果。它基本上意味着:“如果(*格式等于格式 1)或(格式 2 非零)或(格式 3 非零)”——假设格式 2 或格式 3 中的任何一个非零,这将始终评估为真。

您可能打算篡改按位运算符。如果格式 1、2 和 3 是两个不同的幂,那么您可以检查

*format
是否是其中之一使用

if (*format & (format1 | format2 | format3))

不是按位(与逻辑相反)

AND
OR
运算符。然而,这种方法并不安全——即使
format
指向的内存是一些格式 1、2 和 3 常量的总和(假设
formattype
是整数类型),它也会评估为真。


1
投票

不,它们完全不同。第二个例子相当于:

if(format != null && ( (*format == format1) || (format2) || (format3) ) )

0
投票

如果您可以访问 C++11 或 GCC 扩展,这里有两个使用宏的实现,可以执行您想要的操作:

// GCC extension version
#define OR_ALL(CMP, VALUES...) \
({ \
    __typeof__(CMP) values_arr[] = { VALUES }; \
    size_t values_cnt = sizeof(values_arr) / sizeof(*values_arr); \
    int found = 0;\
    for (int i = 0; i < values_cnt; i++) { \
        if (CMP == values_arr[i]){ \
            found = 1;\
            break;\
        }\
    }\
    found;\
})

// C++ 11 version
#define OR_ALL_CPP(CMP, VALUES...) or_all_cpp_impl<decltype(CMP), VALUES>(CMP)

template <typename T, T... args>
bool or_all_cpp_impl(T cmp)
{
    T arguments[] = { args... };
    size_t count = sizeof(arguments) / sizeof(T);

    for (int i = 0; i < count; i++) {
        if (cmp == arguments[i])
            return true;
    }

    return false;
}

我更喜欢 C++ 版本,如果它可用的话,但它们的功能相似。

© www.soinside.com 2019 - 2024. All rights reserved.