是否有更简洁/更短的方式来写出如下内容:
if(var1 == 1 && var2 == 1 && var3 == 1)
或
if(var1 == 1 || var1 == 4 || var1 == 6)
我知道有各种常用的语法快捷方式可以让事情看起来更清晰一些,我想可能还有其他一些我不知道考虑到它变得多么庞大的方式来编写它。
有没有优雅的方式
你可以抛出任意多的抽象,它只会导致堆积层和更多需要调试的代码。最重要的是,您提供的代码非常好、可读、清晰、简短且非常优雅。
我唯一会做的就是通过声明一个具有可读名称的变量来删除magic number。喜欢
int this_is_important_number = 1; if (var1 == this_is_important_number && var2 == this_is_important_number && var3 == this_is_important_number)
.
你可以给它一个宏:
#define ALL_EQ_1(x, a) ((x) == (a))
#define ALL_EQ_2(x, a, ...) ALL_EQ_1(x, a) && ALL_EQ_1(x, __VA_ARGS__)
#define ALL_EQ_3(x, a, ...) ALL_EQ_1(x, a) && ALL_EQ_2(x, __VA_ARGS__)
#define ALL_EQ_N(_4,_3,_2,_1,N,...) \
ALL_EQ##N
#define ALL_EQ(x, ...) \
(ALL_EQ_N(__VA_ARGS__,_4,_3,_2,_1)(x,__VA_ARGS__))
int main() {
int var1 = 1, var2 = 2, var3 = 3;
return ALL_EQ(1, var1, var2, var3);
}
你可以给它一个可变函数:
#include <stdarg.h>
#include <stdbool.h>
#include <limits.h>
bool all_eq_INT_MAX_v(int to, va_list va) {
while (1) {
const int v = va_arg(va, int);
if (v == INT_MAX) {
break;
}
if (v != to) {
return false;
}
}
return true;
}
bool all_eq_INT_MAX(int to, ...) {
va_list va;
va_start(va, to);
const bool r = all_eq_INT_MAX_v(to, va);
va_end(va);
return r;
}
#define all_eq(x, ...) all_eq_INT_MAX(x, __VA_ARGS__, INT_MAX)
int main() {
int var1 = 1, var2 = 1, var3 = 1;
return all_eq(1, var1, var2, var3);
}
或任何其他抽象。问题是您必须稍后维护此类代码。
对于 or 语句,您可以使用 switch 语句,其中结果通过 case 下降,直到达到所需状态。
switch(variable) {
case 1:
case 4:
case 6:
// do thing
default:
// handle any other cases
}
和的说法是有限的。你可以试试 Eugene Sh。上面提到了 memcmp.