所以我得到了我写的代码示例。我的目标是打印存储在ptr char变量中的句子中的数字。所以代码的第一部分完成了这项工作。
#include <stdio.h>
#include <stdlib.h>
void preg(char *p);
int main(int argc, char *argv[])
{
char *ptr;
ptr="John is 5 , jim is 2 and maria is 12";
preg(ptr);
return 0;
}
void preg(char *p)
{
while(*p!='\0')
{
if(*p>='0' && *p<='9')
{
putch(*p);
}
*p++;
}
}
但是如果我将preg函数更改为:
void preg(char *p)
{
while(*p!='\0')
{
if(*p>='0' || *p<='9')// <--- Changed to logical or
{
putch(*p);
}
*p++;
}
}
该程序打印整个句子?这对我来说似乎很奇怪,因为在这种情况下,两个逻辑运算符似乎都适合于给定的任务。我希望有人能解释我的不同之处。我怀疑它必须用字符表示为整数的方式与数字进行比较。
答案 0 :(得分:5)
*p>='0' || *p<='9'
等同于true,因为'9' >= '0'
。
答案 1 :(得分:0)
你应该照顾short-circuit evaluation,它会帮助你理解这种行为。
实际上,*p>='0' || *p<='9'
的所有表达式都不一定会被评估。在逻辑OR的情况下,如果第一个表达式*p>=0
为真,则不会评估第二个表达式{*p<=9
),因为不需要:第一个表达式为真,然后条件被填补。这是一种避免不必要的表达评估的优化。
因此,在您的情况下,如果*p
大于0,则永远不会评估*p<='9'
,这就是您需要使用逻辑AND的原因。