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

时间:2012-08-21 21:35:21

标签: c ansi c89

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

不,不会。虽然第一次检查有效,但第二次检查会给您一个错误的结果。它基本上意味着:“如果(*格式等于format1)或(格式2非零)或(格式3非零)” - 假设format2或format3中的任何一个非零,则总是评估为true。

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

检查*format是否是其中之一
if (*format & (format1 | format2 | format3))

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

答案 2 :(得分: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 ++版本,如果它可用,但它们的功能相似。