将值与单个表达式中的其他两个值进行比较,同时仅引用第一个值

时间:2014-03-01 01:35:39

标签: c bit-manipulation boolean-expression

假设您有一个函数foo(),它返回一个数字。

您想检查返回值是否等于NM

你可以做foo() == N || foo() == M。但这需要两次调用foo()

如何在仅调用foo()一次的情况下制作单个布尔C表达式?

修改:如标题中所述,我想引用第一个值 一次。并且这必须在单个C表达式中,即没有临时变量,这需要单独的声明语句。否则答案是微不足道的。

5 个答案:

答案 0 :(得分:2)

if((x = foo()) == N || x == M) ...

答案 1 :(得分:0)

尝试

int x = foo();
if (x == N || x == M) ...

似乎相当明显

答案 2 :(得分:0)

为什么不将foo()的结果设置为中间变量?

x = foo();
if(x == N || x == M)
  ...

答案 3 :(得分:0)

您需要一个临时存储foo的返回值,以便不再调用它两次,然后您可以通过一对==||以简单的方式执行此操作。但是如果你真的希望if更像是“原子”的东西,你可以用这样的临时值来做到这一点:

  int temp;
  if (temp = foo(), !((temp ^ N) * (temp ^ M))) {
    // your code here
  }

它可能会从短路评估中保存分支,具体取决于编译器生成的内容。

没有临时性:
如果您不关心修改N和M,则可以在没有temp的语句中进行测试。 N'持有N ^ MM'持有M ^ foo()。因此N' ^ M'给出N ^ foo()。逗号运算符从左到右进行求值,表达式的值等于其手侧。

  if (N ^= M, M ^= foo(), !(M * (N ^ M))) {
    // your code here
  }

答案 4 :(得分:0)

假设N > MN - M是2的幂,而我们的无符号整数是32位。

应该有另一个2的幂,K使k * (N - M)回绕到0。

如果N - M是2 i ,那么K将是2 32-i

然后表达式!(K * (foo() - M))将给出答案。

但这取决于许多条件;我正在为所有可能的NM寻找解决方案。