c - 判断条件语句中的单个语句为真

标签 c

我有很多信号,可以是真、假或无效,但其中只有一个可以为真,否则就是错误。

我想知道是否有一种方法可以轻松地检查这个而不需要做一个大的 if 语句

enum sig_type
{
  sig_invalid, sig_true, sig_false
};

sig_type sig1 = GetSignal("sig1");
sig_type sig2 = GetSignal("sig1");
sig_type sig3 = GetSignal("sig1");
sig_type sig4 = GetSignal("sig1");

if (sig1 == sig_true)
{
  if (sig2 == sig_true || sig3 == sig_true || sig4 == sig_true)
  {
    // Error
  }
}
else if (sig2 == sig_true)
{
  if (sig1 == sig_true || sig3 == sig_true || sig4 == sig_true)
  {
    // Error
  }
}

等等... 这是大量的代码,并且只会随着我添加信号而增加,因此在这种状态下将无法管理

最佳答案

您可以利用 C 中逻辑表达式的计算结果为 0 表示假或 1 表示真这一事实,并将它们加在一起。如果总数大于 1,则有错误,否则没有错误。

另外,如果您认为将来可能需要更多(或只是数量可变的)信号,我会使用数组来保存它们,而不是单独的变量。然后可以在 for 循环中完成测试:

sig_type sig[NSIGNALS];
int t = 0;

for (int i = 0; i < NSIGNALS; ++i) {
    char buf[50];   /* Make sure your buffer is large enough, of course */
    sprintf(buf, "sig%d", i + 1);    /* Or however you want to generate it */
    sig[i] = GetSignal(buf);
    t += sig[i] == sig_true;
}

if (t > 1) {
    /* Complain */
}

如果您的意思是只有 1 个信号必须为真,请将 t > 1 测试替换为 t != 1

编辑:最初在错误处理程序中有一个throw,尽管那不是 C。

关于c - 判断条件语句中的单个语句为真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24507574/

相关文章:

c - 如何通过按键结束程序?

c - 如何使用 GEOS 库编译程序

c - 如何在c中表示大于long的数字

c - 如何在不使用数组的情况下计算排序序列中的不同元素?

c++ - 服务器套接字的 IP 和端口错误

c - C中纠结的句法位

gcc 中的编译器优化

c++ - libcurl 如何更改编码 url 行为

c - 为什么 gdb 不会在 strcpy 上中断?

c - PCI 输入/输出控制编程