strcmp返回值布尔类型的判断

strcmp: 用于比较两个字符串,原型如下:

int strcmp ( char const *s1, char const *s2);
如果s1小于s2,strcmp函数返回一个小于零的值。如果s1大于s2,函数返回一个大于零的值。如果两个字符串相等,函数就返回零。

警告:初学者常常会编写下面这样的表达式
         if ( strcmp (a, b))
    他以为如果两个字符串相等,它的结果将是真。但是,这个结果将正好相反,因为在两个字符串相等的情况下返回值是零(假)。 把这个返回值当作布尔值进行测试是一种坏风格,因为它具有三个截然不同的结果:小于、等于和大于。 所以更好的方法是把这个返回值与零进行比较。

当然我们在实际工作中也经常会碰到将其返回值与布尔值进行判断,我们来看下面这个例子:

   char a[];
   ……
if ( !strcmp( a, "5"))
   {   printf(“equally!”);
   }else{
       printf("unequal!");
   }

在这个例子中我们分析下:
如果a的值为5,则返回值为0,那么判断也就成为 if(!(0)) ,(0)取反后为1 ,1位TRUE则判断为 if( TRUE )
如果a的值小于5,则返回一个负数,而负数的取反是FALSE; 大于5,则返回一个正数,正数的取反也是FALSE; 
因此上例中a 的值为5 则输出 equally ; 不等于5都输出 unequal 

我们可以做一个小测试 -1 、 0 、 1三数分别取反,会得到 0、1、0 。

标准并没有规定用于提示不相等的具体值。它只是说如果第一个字符串大于第二个字符串就返回一个大于零的值,如果第一个字符串小于第二个字符串就返回一个小于零的值。一个常见的错误是一位返回值就是1和-1,分别代表大于和小于。这个假设并不总是成立。 (跟具体的编译器有关)

转自:http://piao8163.blog.163.com/blog/static/96972478200981343957704/

原文地址:https://www.cnblogs.com/l2017/p/7651775.html