如果A == B&& amp;有更好的方法吗? B == C&& ç== d?

时间:2013-02-03 23:00:15

标签: c

是否有“如果A,B和C都等于D”的简写?在我现在所处的场景中,我实际上只关心它们是否都是平等的,而不是它们的实际值,所以“如果A,B,C和D是相同的”也适用。< / p>

6 个答案:

答案 0 :(得分:2)

问题被标记为C,但如果允许C ++ 11,您可以按如下方式定义all_equal

template <typename T1>
inline bool all_equal(T1&& val) {
 return true;
}

template <typename T1, typename T2, typename... Ts>
inline bool all_equal(T1&& val1, T2&& val2, Ts&&... rest) {
  return val1 == val2 && all_equal(std::forward<T2>(val2), std::forward<Ts>(rest)...);
}

使用示例:

all_equal(3);    // true
all_equal(3, 3); // true
all_equal(3, 4); // false
all_equal(x, y, z); // would be expanded to 'x == y && y == z'

参数的数量没有限制。

如果你想坚持使用C,你可以使用variable-length argument lists,但我不推荐它。

答案 1 :(得分:2)

你不太可能遇到这可能是速度限制的情况。 但是,通常最小化循环中的分支是最快的。

我做

!(a^b | b^c | c^d)

我怀疑位运算符|将比wildplasser应答中的短路||更快,至少每次执行循环时结果都不一样 不要假设。如果真的很重要,请尝试并测量它。

虽然

是非常简短的语法

答案 2 :(得分:1)

短路异或技巧:

int abcd(unsigned aa, unsigned bb, unsigned cc, unsigned dd)
{
#define FOUR_UNEQUAL(a,b,c,d)  ((a^b^c^d) || (a^b) || (c^d) || (b^c)) ? 1 : 0

return FOUR_UNEQUAL(aa,bb,cc,dd);
}

生成的程序集(GCC 4.6.1-9ubuntu3):

type   abcd, @function
abcd:
.LFB23:
        .cfi_startproc
        movl    %esi, %eax
        xorl    %edi, %eax
        xorl    %edx, %eax
        cmpl    %ecx, %eax
        jne     .L7
        cmpl    %esi, %edi
        jne     .L7
        cmpl    %ecx, %edx
        setne   %al
        cmpl    %edx, %esi
        setne   %dl
        orl     %edx, %eax
        movzbl  %al, %eax
        ret
        .p2align 4,,10
        .p2align 3
.L7:
        movl    $1, %eax
        ret
        .cfi_endproc

而且,如前所述,速度提升是微不足道的(如果有的话)。

答案 3 :(得分:0)

您可以定义一个宏来执行此操作:

#DEFINE ARE_ALL_EQUALS(A, B, C, D) (((A) == (B)) && ((B) == (C)) && ((C) == (D)))

但要注意对B和C的多重评估。

答案 4 :(得分:0)

您可以定义像

这样的宏
#define ALL_EQUAL(A, B, C, D) ((A) == (B)) && ((B) == (C)) && ((C) == (D))

但我看不出比平常更有优势。

答案 5 :(得分:0)

也许“最快”的方法是比较对,然后检查对的结果: OP确实表明了(A == B) && (C == D) && (A == C)。对于更多元素,工作对,并将结果组合成完整的二叉树。可能会重新排序,以便&&平均尽早失败。在任何情况下,这是一个非常专门的操作(如果我曾经做过类似的事情就不能记得),所以为此提供额外的记法可能会比可以获得的更多。

一如既往:首先编写最易读的代码,并在测量显示值得的情况下按性能进行按摩。人工时间(编写,调试,维护代码)比计算机运行它的时间更有价值,除非非常罕见的情况。