【问题标题】:why negative number is taken as true in condition statement? [duplicate]为什么在条件语句中将负数视为真? [复制]
【发布时间】:2014-07-10 10:07:32
【问题描述】:

在这里,我对具有负数的条件语句感到困惑,如果在条件中仅给出负数,则 if(-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");
  }
}

【问题讨论】:

  • 您的以下代码的问题是由于有符号/无符号比较,与您上面的问题无关。见:“strlen(s1) - strlen(s2)” is never less than zero
  • 您的strlen() 问题很有趣(也许是您的问题中唯一有趣的一点,而许多学习C 的文档都没有直接回答)。你应该只问这个,这样回答者就不会专注于前两个琐碎的问题。
  • 这是一个size_t类型的无符号整数,返回strlen的值。所以会以无符号计算。改为if((int)strlen(a)-(int)strlen(b)&gt;0)
  • if(2-3&gt;0)i.e if(-3&gt;0) -- 我不知道你是怎么得出这个结论的。 2-3 &gt; 0 等价于 -1 &gt; 0
  • if(strlen(a) &gt; strlen(b)) 有什么问题?

标签: c if-statement negative-number


【解决方案1】:

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

任何非零数都被评估为true

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

-1 小于 0 这就是为什么表达式 -1 &gt; 0 评估为 false

if(strlen(a)-strlen(b)&gt;0) //怎么是真的 ?if(2-3>0)i.e if(-3>0) 这是假的 //这里为什么是真的

strlen 返回size_t 类型,即unsignedstrlen(a)-strlen(b 的结果将是 unsigned int。但是-1不是unsigned,所以在比较之前转换为unsignedstrlen(a)-strlen(b)&gt;0会导致比较UINT_MAX -1 &gt; 0

【讨论】:

  • 谢谢你先生,但在上面的代码中 if(strlen(a)-strlen(b)>0) 那么这个语句应该是假的,因为它相当于 if(2-3>0) 即如果(-3>0)但为什么是真的?
【解决方案2】:

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

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

【讨论】:

  • 我看不出这个答案有什么问题。为什么投反对票?
  • @hacks 反对者认为这部分问题不应该回答,因为它是现有问题的重复。我想知道为什么版主认为删除发生的来回是有用的。
【解决方案3】:

在 if 语句中,每个不为 0 的值都被评估为 true。

【讨论】:

    【解决方案4】:

    添加到现有答案:

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

    strlen 返回size_tsize_t 的不同结果也将是 size_t。 无符号数始终为&gt;= 0。在您的情况下,它类似于

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

    live code here

    你应该将条件改写为:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2012-04-12
        • 2016-02-20
        • 1970-01-01
        • 2011-12-18
        • 2012-02-24
        • 2015-03-14
        • 1970-01-01
        • 2020-06-04
        • 2016-10-03
        相关资源
        最近更新 更多