c - 为什么我不能在 C 中仅使用 1 个相等运算符来检查多个条件?

标签 c operators equality

在我下面的代码中,a 是一个字符数组,我的 if 语句检查特定字符是否为 ADO ,Q,RP

if 条件中检查条件的常规方法如下面的代码所示。

/代码片段/

scanf("%s",a);
len=strlen(a);
for(i=0;i<len;i++)
{
        if(a[i]=='A'||a[i]=='D'||a[i]=='O'||a[i]=='Q'||a[i]=='R'||a[i]=='P')
             //Do something
}           

我的疑问:

1) 假设我这样写 if 语句:

if(a[i]=='A'||'D'||'O'||'Q'||'R'||'P')

为什么它的行为方式与我在上面代码片段中的 if 语句的行为方式不同?这个声明是如何工作的?

2) 如果我想检查多个条件(比方说成百上千个条件)怎么办,我怎样才能只使用一个相等运算符进行检查,而不必像这样使用多个相等运算符:

if(a[i]=='A'||a[i]=='D'||a[i]=='O'||a[i]=='Q' ||a[i]=='R'||a[i]=='P')

可以吗?如果是,如何?如果不是,为什么?

最佳答案

有两件事要检查,

  1. Operator Precedence ,它告诉 ==||

  2. 有更高的优先级
  3. || 运算符本身,它要求[第 6.5.14 章,C99]

the || operator guarantees left-to-right evaluation; there is a sequence point after the evaluation of the first operand. If the first operand compares unequal to 0, the second operand is not evaluated.

答案 1)

所以,对于像

这样的表达式
if(a[i]=='A'||'D'||'O'||'Q'||'R'||'P')

评估会像这样,

  1. 如果 a[i]=='A' 为 TRUE,则 if 返回 TRUE/成功,其他操作数不计算。

  1. 如果 a[i]=='A' 为 FALSE,则检查下一个操作数 D [ASCII 值],其计算结果始终为 TRUE。

无论哪种方式,只有 一个a[i] 值进行比较。 || 的其他操作数只是。不涉及比较。

答案 2)

因此,您无法使用单个 == 来检查多个值的(不)相等性。但是,您可以改用 switch 语句。

如果 a[i] 的值与 case 中的任何匹配,则将执行所需的代码块。

switch (a[i])
  case 'A':
  case 'D':
  case 'O':
  case 'Q':
  case 'R':
  case 'P':
            //some code
            break;

关于c - 为什么我不能在 C 中仅使用 1 个相等运算符来检查多个条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27997820/

相关文章:

java - 为什么会进入无限循环?

kotlin - 运算符 '==' 不能应用于 'Boolean' 和 'Char'

Javascript。 | & 和 toString

java - 在 Java 中测试两个 BST 是否相等

c - 字符串输入到gmp整数的最大长度?

c - 如何在不返回或传入的情况下访问在一个函数、另一个函数中创建的数据结构?

c - fork 为这个 c 程序生成不正确的输出?

c# - 将 double 与零进行比较时等于与 ==

java - Java 中 == 和 equals() 有什么区别?

c++ - 我是在为操作系统或处理器编码吗?