我在进行审核时偶然发现了这个问题并且作者无法访问:
int n = Convert.ToInt32(text);
if (((n > 0) || (n < 0)) || (n == 0))
{
return 1;
}
一般来说,代码看起来很稳固,我很难相信这段代码的唯一目的是让审稿人感到困惑,但我没有看到这种情况失败的方法。我错过了什么吗?
答案 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 > 0
或n < 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
,但由于n
是int
,因此它总是计算为{{ 1}}
答案 5 :(得分:0)
如上所述,它始终是真的,因为根据定义,任何实数都是零,小于零或大于零,并且您已涵盖代码中的所有情况。
答案 6 :(得分:0)
除非Convert.ToInt32(text)
抛出异常,否则始终为1。
答案 7 :(得分:0)
我看不出它如何评价为假。
但是,如果n
声明在不同的范围内,其中多个线程可以访问它并且其中一个线程更改其值,那么条件很可能会失败。
答案 8 :(得分:0)
当你写下它可能存在的所有状态时,它总是如此(例如&lt;&gt; ==)
答案 9 :(得分:-1)
是的,如果转换失败,它也可能抛出异常: - )