0

我试图记住,如果使用标准 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) )
4

3 回答 3

1

不,它们完全不同。第二个例子等价于:

if(format != null && ( (*format == format1) || (format2) || (format3) ) )
于 2012-08-21T21:37:40.257 回答
1

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

您可能打算篡改按位运算符。如果格式 1、2 和 3 是 2 的不同幂,那么您可以*format使用

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

不是按位(与逻辑相反)ANDOR运算符。但是,这种方法并不安全——即使指向的内存format是某些格式 1、2 和 3 常量的总和(假设formattype是整数类型),它也会评估为真。

于 2012-08-21T21:37:56.833 回答
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++ 版本,但它们的功能相似。

于 2012-08-21T22:02:38.007 回答