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

时间:2015-01-17 08:57:18

标签: c operators equality

在下面的代码中,a是一个字符数组,我的if语句正在检查特定字符是ADOQ,{{ 1}}或R

P条件下检查条件的传统方法如下面的代码所示。

/ 代码段 /

if

我怀疑:

1)让'说我写这样的声明:

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
}           

为什么它的行为与if语句在上面的代码片段中的行为方式相同?这个陈述如何运作?

2)如果我想检查多个条件(比如数百或数千个),如何只使用一个相等运算符检查并且不必使用多个相等运算符,如下所示:

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

可以吗?如果是,怎么样?如果没有,为什么?

5 个答案:

答案 0 :(得分:3)

要检查两件事,

  1. Operator Precedence,告诉==优先于||

  2. ||运营商本身,其任务[第6.5.14节,C99]

  3.   

    ||运营商保证从左到右的评估;有   评估第一个操作数后的序列点。如果第一个操作数将不等于0,则不计算第二个操作数。

    回答1)

    所以,对于像

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

    评估将如下,

    1. if a[i]=='A'为TRUE,然后if返回TRUE / success,不评估其他操作数。
      1. if a[i]=='A',为FALSE,然后检查下一个操作数D [ASCII值],其值始终为TRUE。
      2. 无论哪种方式,只有一个a[i]值进行比较。 ||的其他操作数,只是。没有比较。

        回答2)

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

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

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

答案 1 :(得分:2)

in c每个not null值的计算结果为true。

当你写这个:

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

你可以这样想:

if(a[i]=='A' || true || true , ...)

所以你的陈述永远是真的!

有更多的可能性进行此类检查,这取决于哪一个最好:

switch(a[i]) {
  case 'A':
  case 'D':
  case 'O':
  case 'Q':
  case 'R':
  case 'P':
    // your if code here
    break;
  default:
    // your else code here
    break;
}

char check[6] = {'A','D','O','Q','R','P'};
for(int j = 0; j < 6; j++)
  if(check[j]==a[i]) {
    // your code
    break;
  }

或者如果您可以对值进行分组:

if(a[i] > 'A' && a[i] < 'D' || a[i] > 'P' && a[i] < 'T')  // warning! other values, just for demo!

还有更多。

答案 2 :(得分:1)

a[i]=='A'

==运算符用于LHS和RHS上的操作数,如果你有

(a[i] == 'A' || 'B' ||......)

然后==将对a[i] == 'A'进行处理,如果结果为TRUE,则其余操作数不会被评估为(1 || 0 == 1)

答案是你不能使用单个==运算符来检查多个条件。

答案 3 :(得分:0)

您可以将您感兴趣的字符添加到数组中,如下所示:

#include <stdio.h>

int main(){
    char a[10] = { 0 };
    printf("enter string sequence:");
    scanf("%s", a);
    int len = sizeof(a)/sizeof(a[0]);
    char review[] = { 'A','D','O','Q','R','P' };
    int rLen = sizeof(review) / sizeof(review[0]);
    int found = 0;
    for (int i = 0; i<len; i++)
    {
        for (int j = 0; j < rLen; j++){
            if (a[i] == review[j]){
                printf("found atlast !!!");
                found = 1;
                break;
            }
        }
        if (found == 1)
            break;
    }
    if (found == 0)
        printf("Could not be found");
}

通过使用这样的数组:char review[] = { 'A','D','O','Q','R','P' };,可以很容易地跟踪检查的内容。

由于您的代码需要更改要审核的字符,因此您只需在一个地方进行更改。

答案 4 :(得分:0)

2)您可以使用查找表通过单个比较来确定某个字符是否在给定集合中。实际上,这是一些编译器如何实现由isupper定义的isalpha <ctype.h>和相关函数/宏。

成本是您需要手动编写256个条目的表,或者需要代码在运行时填写表。这也假设你不关心unicode字符,因为这会使表格变得更大。

以下代码在启动时初始化表,并定义一个宏,允许您在不使用一个相等运算符的情况下检查字符是否在集{'A', 'D', 'O', 'Q', 'R', 'P'}中。

#include <stdio.h>
#include <string.h>

#define isSpecial(x) (specialArray[x])

char specialArray[256];
int specialList[] = { 'A', 'D', 'O', 'Q', 'R', 'P', EOF };

int main( void )
{
    memset( specialArray, 0, sizeof(specialArray) );
    for ( int i = 0; specialList[i] != EOF; i++ )
        specialArray[specialList[i]] = 1;

    if ( isSpecial( 'A' ) )
        printf( "A is special\n" );
    else
        printf( "A is normal\n" );

    if ( isSpecial( 'B' ) )
        printf( "B is special\n" );
    else
        printf( "B is normal\n" );
}