为什么在条件陈述中将负数视为真?

时间:2014-07-10 10:07:33

标签: c if-statement negative-number

这里我对具有负数的条件陈述感到困惑,如果在条件中只给出负数,如果给出(-1)那么它是真的但是如果(-1> 0)则它变为假,请解释任何一个提前谢谢

if(-1) // This true why and how?
if(-1>0)//This is false why and how

现在对下面的代码有什么影响请帮助理解

#include <stdio.h>
#include <string.h>

main()
{
  char a[]="he";
  char b[]="she";
  if(strlen(a)-strlen(b)>0)//how it is true ?if(2-3>0)i.e if(-3>0) which is false
    //here why it is true                   
  {
    printf("-ve greater then 0 ");
  }
  else 
  {
    printf(" not greater then 0");
  }
}

5 个答案:

答案 0 :(得分:4)

  

if(-1) //这是真的为什么以及如何?

任何非零数字都会被评估为true

  

if(-1>0) //这是错误的原因和方式

-1小于0,这就是为什么表达式-1 > 0评估为false的原因。

  

if(strlen(a)-strlen(b)>0) //怎么回事?if(2-3> 0),即if(-3> 0)是假的       //这里为什么是真的

strlen返回size_t类型unsignedstrlen(a)-strlen(b的结果为unsigned int。但是-1不是unsigned,因此在比较之前它会转换为unsignedstrlen(a)-strlen(b)>0会导致比较UINT_MAX -1 > 0

答案 1 :(得分:2)

函数strlen()返回size_t,这是一个无符号整数类型。

因此,strlen(a)-strlen(b)是无符号减法。它会产生一个非负数,因为它会产生size_t,而size_t的所有值都是非负数。

答案 2 :(得分:1)

如果句子中的每个值(非0)都会被评估为真。

答案 3 :(得分:1)

添加到现有答案:

char a[]="he";
char b[]="she";
if(strlen(a)-strlen(b)>0)

strlen返回size_t。不同size_t的结果也是size_t。 无符号数始终为>= 0。在你的情况下,它类似于

if((2U - 3U) > 0U)

请参阅live code here

您应该将条件重写为:

if(strlen(a) > strlen(b))

答案 4 :(得分:0)

任何非零数字都被认为是真实的想法是计算机科学中一个非常古老的概念。可以把它想象为将原始位作为大OR门的输入。如果任何位是1,则输出为1(或为真)。负数是最高有效位(符号位)为1的数字。