在下面的代码中,a是一个字符数组,我的if语句正在检查特定字符是A
,D
,O
,Q
,{{ 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')
可以吗?如果是,怎么样?如果没有,为什么?
答案 0 :(得分:3)
要检查两件事,
Operator Precedence,告诉==
优先于||
||
运营商本身,其任务[第6.5.14节,C99
]
||运营商保证从左到右的评估;有 评估第一个操作数后的序列点。如果第一个操作数将不等于0,则不计算第二个操作数。
回答1)
所以,对于像
这样的表达式if(a[i]=='A'||'D'||'O'||'Q'||'R'||'P')
评估将如下,
if a[i]=='A'
为TRUE,然后if
返回TRUE / success,不评估其他操作数。或
if a[i]=='A'
,为FALSE,然后检查下一个操作数D
[ASCII值],其值始终为TRUE。无论哪种方式,只有一个与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" );
}