我尝试使用谷歌搜索并失败。
使用C,我有一个IF语句。我想针对两个非连续值测试变量。
可以吗
if(state == 1 || 3)
含义如果state为1或state为3。
或者它必须是
if(state == 1 || state == 3)
我认为第一个实际意味着状态是1还是3,这意味着测试将始终为真(如果为真或真)。
不,我不想使用case
/ switch
声明。我试图少打字。
答案 0 :(得分:2)
你必须使用长变种
getOffSetTop : function(){
var stickyNavBar = $(document).find('.stickynav');
var offSetTop = stickyNavBar.offset().top;
if(stickyNavBar.hasClass('fixed')){
stickyNavBar.removeClass('fixed');
offSetTop = $('.stickynav').offset().top;
stickyNavBar.me.addClass('fixed');
}
return offSetTop;
}
始终评估为if (state == 1 || 3)
,因为它被解释为
true
编辑:
因为在评论中询问了C ++,M.M提到了运算符重载,C ++解决方案
if ((state == 1) || (3))
答案 1 :(得分:1)
@cde,' C'编程没有像第一种形式那样使用表达式的构造,所以你必须使用第二种形式,正如许多人已经提到的那样。
如果值在比较之前已知,则可以尝试以下方法:通过在声明时包含它们或者在稍后的时间填充值(可能是固定的或变量集,在这种情况下,数组必须动态分配,大小必须已经可用。)
注意:内联,静态,常量不是解决方案工作所必需的。此外,它具有以下优点:只要条件评估为真,函数就会跳过其余的比较,除非状态与任何给定状态都不匹配。
#include <iostream>
using namespace std;
inline bool isInKnownStates(int state, const int ds[], const int sz)
{
int i = 0;
for (; (i < sz) && (state != ds[i]); i++);
return (i < sz);
}
int main(int argc, const char * argv[]) {
static const int discrete_states[] = {1, 3};
static const int sz = sizeof(discrete_states)/sizeof(discrete_states[0]);
int state0 = 0;
int state1 = 1;
int state3 = 3;
cout << state0 << " " << (isInKnownStates(state0, discrete_states, sz) ? "True" : "False") << endl << flush;
cout << state1 << " " << (isInKnownStates(state1, discrete_states, sz) ? "True" : "False") << endl << flush;
cout << state3 << " " << (isInKnownStates(state3, discrete_states, sz) ? "True" : "False") << endl << flush;
return 0;
}
答案 2 :(得分:0)
有没有办法写这个而不必重写变量 多次命名?
嗯,是的。 #include <string.h>
您可以使用
if(memchr(&(char []){1, 3}, state, 2))
0r
if(memchr(&(char []){1, 3, 5, 7, 9}, state, 5))
请注意,state
不得包含超出char
范围的值(可以根据需要指定签名),否则信息可能会丢失。 sizeof (T) != 1
时,您不能使用类型为T的数组。还将考虑降低可读性。