假设您有一个函数foo()
,它返回一个数字。
您想检查返回值是否等于N
或M
。
你可以做foo() == N || foo() == M
。但这需要两次调用foo()
。
如何在仅调用foo()
一次的情况下制作单个布尔C表达式?
修改:如标题中所述,我想引用第一个值 一次。并且这必须在单个C表达式中,即没有临时变量,这需要单独的声明语句。否则答案是微不足道的。
答案 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 ^ M
,M'
持有M ^ foo()
。因此N' ^ M'
给出N ^ foo()
。逗号运算符从左到右进行求值,表达式的值等于其手侧。
if (N ^= M, M ^= foo(), !(M * (N ^ M))) {
// your code here
}
答案 4 :(得分:0)
假设N > M
,N - M
是2的幂,而我们的无符号整数是32位。
应该有另一个2的幂,K
使k * (N - M)
回绕到0。
如果N - M
是2 i ,那么K
将是2 32-i 。
然后表达式!(K * (foo() - M))
将给出答案。
但这取决于许多条件;我正在为所有可能的N
和M
寻找解决方案。