在我下面的代码中,a 是一个字符数组,我的 if 语句检查特定字符是否为 A
、D
、O
,Q
,R
或 P
。
在 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')
可以吗?如果是,如何?如果不是,为什么?
最佳答案
有两件事要检查,
Operator Precedence ,它告诉
==
比||
有更高的优先级
||
运算符本身,它要求[第 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')
评估会像这样,
如果 a[i]=='A'
为 TRUE,则if
返回 TRUE/成功,其他操作数不计算。
或
如果 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/