如果我有两个整数值,我可以简单地测试相等性:
if (a == b)
如果我有三个整数值,那么我可以这样做:
if ((a == b) && (a == c) && (b == c))
我有一种情况,我有6个值来测试相等,这种方法会变得冗长
他们是一个更好的,更多的C惯用语(c-onic?)意味着实现这个目标吗?
实际上,只要写完这篇文章就可以看出:if ((a == b) && (b == c) && (c == d)... )
逻辑上没问题,即您不需要a == b
和b == c
暗示a == c
但就表达清晰度而言,我能接近多少:
if (a == b == c)
?
答案 0 :(得分:7)
我可以告诉你如何在一个可变参数宏中做到这一点,所以我们可以这样写:
if(EQI(a, b, c, d, e, f))
以下是代码:
#include <stdarg.h>
#include <stddef.h>
#define NUMARGS(...) (sizeof((int[]){__VA_ARGS__}) / sizeof(int))
#define EQI(...) ( \
alleqi(NUMARGS(__VA_ARGS__), __VA_ARGS__))
/* takes count number of int arguments */
int alleqi(size_t count, ...)
{
va_list va;
va_start(va, count);
int v0 = va_arg(va, int);
for (; count > 1; count--) {
if (v0 != va_arg(va, int)) {
break;
}
}
va_end(va);
return count == 1;
}
请注意,上述内容仅适用于int
个参数(可能还有其他类型与int
相同的类型,不过我支持某人指责我宣传未定义的行为如果我做广告该!)。
感谢上一篇文章,了解如何计算可变参数宏中的参数:https://stackoverflow.com/a/2124433/4323
答案 1 :(得分:7)
你不会非常接近a == b == c
。
让经验丰富的C程序员最不用惊讶,我认为这是最好的
if(a == b && b == c && c == d && d == e && e == f)
即。基本上就像你已经拥有的那样,括号较少。我并不总是反对添加对编译器没有区别的括号,以帮助那些不了解所有优先规则的人,但我认为比较由&&
分隔(没有{{1}混合in)是一个足够简单的例子,括号比它们的价值更混乱。
如果变量名称很长,那么将它全部放在一行上就不会很漂亮,所以也许
||
或者这可能会更好,因为每一行中if(a == b &&
b == c &&
c == d &&
d == e &&
e == f)
的重复都会立即引人注目:
a
如果你真的希望它是紧凑的,p99 preprocessor library提供了这个:
if(a == b &&
a == c &&
a == d &&
a == e &&
a == f)
看起来像John Zwinck的答案,但不需要辅助功能。
答案 2 :(得分:6)
如果要检查六个值,一种方法是将它们存储在数组中
int a[6];
equals = 1;
for (int i=0; i<5; i++)
{
if (a[i] != a[i+1])
{
equals = 0;
break;
}
}
答案 3 :(得分:2)
使用数组的方法要求您将数据结构更改为数组。
使用可变参数宏的方法需要额外的函数和函数调用(开销)。
除了这两种方法之外,我看到的另一种方法是将它们写出来。我觉得最好的方法,或者更明确的方法是采用第一个变量并将其与所有其他变量进行比较。通过暗示,所有变量都是相等的,或者至少两个变量是不相等的:
if ((a == b) && (a == c) && (a == d)
&& (a == e) && (a == f) && (a == g) ...)