这句话可以评估为FALSE吗?

时间:2010-04-12 21:58:13

标签: c#

我在进行审核时偶然发现了这个问题并且作者无法访问:

int n = Convert.ToInt32(text);
if (((n > 0) || (n < 0)) || (n == 0))
{
  return 1;
}

一般来说,代码看起来很稳固,我很难相信这段代码的唯一目的是让审稿人感到困惑,但我没有看到这种情况失败的方法。我错过了什么吗?

10 个答案:

答案 0 :(得分:9)

这可能是nullable类型的残余。请参阅msdn以获取解释,但基本上如果您的代码最初是这样的:

int? n = StringToInt(text);    // People roll their own functions to do this, though
                               // they really shouldn't
if (((n > 0) || (n < 0)) || (n == 0))
{
  return 1;
}

然后这可能会失败。上面的每个语句都是false,因为n可能是函数的null,假设它在错误的输入上返回null,并且代码支持可空类型。

不太可能,但在查看“维护代码”时,任何事情都是可能的。但是如上所述,它必须返回1(或抛出异常,正如此线程中其他人所提到的那样)。

答案 1 :(得分:5)

假设它到达那里它将永远返回true。

考虑:

bool x = (n > 0) || (n < 0);
bool y = (n == 0);

if (x || y)
{
    return 1;
}

如果n不为零,则n > 0n < 0为真,因此x为真且y为假。

如果n为零,则n == 0为真,因此x为false且y为真。

无论哪种方式,OR的一侧都是真的。

答案 2 :(得分:2)

这肯定对我来说是100%真实的陈述。所有这些括号至少应该无关紧要,因为||是关联的,即

(a || b) || c == a || (b || c) == a || b || c

答案 3 :(得分:1)

int n = Convert.ToInt32(text);可能会抛出异常,在这种情况下,if语句甚至不会被评估。

请参阅MSDN上的Convert.ToInt32()

答案 4 :(得分:1)

如果重载了类的关系运算符,则条件可能会计算为false,但由于nint,因此它总是计算为{{ 1}}

答案 5 :(得分:0)

如上所述,它始终是真的,因为根据定义,任何实数都是零,小于零或大于零,并且您已涵盖代码中的所有情况。

答案 6 :(得分:0)

除非Convert.ToInt32(text)抛出异常,否则始终为1。

答案 7 :(得分:0)

我看不出它如何评价为假。

但是,如果n声明在不同的范围内,其中多个线程可以访问它并且其中一个线程更改其值,那么条件很可能会失败。

答案 8 :(得分:0)

当你写下它可能存在的所有状态时,它总是如此(例如&lt;&gt; ==)

答案 9 :(得分:-1)

是的,如果转换失败,它也可能抛出异常: - )