这个短路的if语句有什么问题?

时间:2012-05-01 19:29:02

标签: c#

我知道这可能真的很蠢,但我无法弄清楚为什么这个if语句失败了:

如果我在控制台输入12,则第一个if语句失败,但如果我首先将结果存储在bool中,则第二个if语句会失败。为什么?我可能在这里做些蠢事吗?

Console.WriteLine("Enter 1 for AM or 2 for PM?"); 
string amOrPM = Console.ReadLine();

//Why does this fail if I enter 1 or 2?
if (amOrPM != "1" || amOrPM != "2") 
    Console.WriteLine("You must enter 1 for AM or 2 for PM. Try again.");

//This works!
bool valid = (amOrPM != "1" || amOrPM != "2"); 
if (!valid) 
    Console.WriteLine("You must enter 1 for AM or 2 for PM. Try again.");

我刚注意到第一个if语句,我不得不把&&而不是||,但这很令人困惑,因为我将其读作:如果amOrPm不等于1amOrPM不等于2,则转到控制台行。我在读这个错误的定义吗?

4 个答案:

答案 0 :(得分:7)

以这种方式思考 - 如果 1,那么它不可能是2,反之亦然。所以它肯定是 “not 1”“not 2”。

你的意思是:

if (amOrPM != "1" && amOrPM != "2") 

(如果它是“不是1”它是“不是2”。)

或者:

if (!(amOrPm == "1" || amOrPm == "2"))

有关更多转化,请参阅De Morgan's Laws

答案 1 :(得分:3)

你有!在第二种情况下有效前 - 你正在反转结果。删除它!他们两个都表现得一样。

答案 2 :(得分:2)

正确的事情是if (amOrPM != "1" && amOrPM != "2")。如果它既不是1也不是2,你想写。第二个是因为它否定,它是1或2。

答案 3 :(得分:2)

或者是合乎逻辑的。这意味着什么:

如果输入1则第一个条件为假,但第二个条件为真,因此失败。

如果输入2,则第一个条件为真,但第二个条件为假,因此失败。对于他们两个人来说,这种情况永远都不是假的。