"逻辑或"和"逻辑和"如果在c不同的输出中声明尽管看起来相同

时间:2014-10-27 19:04:40

标签: c

所以我得到了我写的代码示例。我的目标是打印存储在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++;
            }
    }

该程序打印整个句子?这对我来说似乎很奇怪,因为在这种情况下,两个逻辑运算符似乎都适合于给定的任务。我希望有人能解释我的不同之处。我怀疑它必须用字符表示为整数的方式与数字进行比较。

2 个答案:

答案 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的原因。