如果测试,测试相同的多个条件?

我试着谷歌搜索失败了。

使用C,我有一个IF语句。 我想针对两个非连续值测试变量。

有可能吗?

if(state == 1 || 3)

意味着如果state为1或state为3。

或者它必须是

if(state == 1 || state == 3)

我认为第一个实际上意味着如果状态是1或3,这意味着测试将始终为真(如果为真或真)。

有没有办法写这个而不必多次重写变量名?

不,我不想使用case / switch语句。 我想减少打字。

你必须使用长变种

 if (state == 1 || 3) 

始终为true因为它被解释为

 if ((state == 1) || (3)) 

编辑:

因为在评论中提到了C ++,MM提到了运算符重载,这是一个C ++解决方案

 #include  struct State { struct Proxy { int v; bool res; Proxy(int v, bool res) : v(v), res(res) {} Proxy operator || (int a) const { return Proxy(v, res || (a == v)); } operator bool() const { return res; } }; int v; State(int v) : v(v) {} Proxy operator == (int a) { return Proxy(v, a == v); } }; int main(int argc, char *argv[]) { State state(atoi(argv[1])); if (state == 1 || 3 || 5) return 1; else return 0; } 

@cde,’C’编程没有像第一种forms那样使用表达式的构造,所以你必须使用第二种forms,正如许多人已经提到的那样。

您可以尝试以下方法,如果值在比较之前已知,或者在声明时包含它们,或者在稍后的时间填充值(可能是固定或变量集,在这种情况下数组必须动态分配,然后大小必须已经可用)。

注意:内联,静态,const并不是解决方案工作所必需的。 此外,它具有以下优点:只要条件求值为真,函数就会跳过其余的比较,除非状态与任何给定状态不匹配。

 #include  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; } 

有没有办法写这个而不必多次重写变量名?

嗯,是。 #include 你可以使用

 if(memchr(&(char []){1, 3}, state, 2)) 

0R

 if(memchr(&(char []){1, 3, 5, 7, 9}, state, 5)) 

请注意, state不得包含超出char范围的值(可以指定signedness为必需),否则信息可能会丢失。 当sizeof (T) != 1时,不能使用T类型的数组。 还将考虑降低可读性。