【问题标题】:And & Or operators in if statementsif 语句中的 And & Or 运算符
【发布时间】:2013-11-22 17:44:05
【问题描述】:

我已经制作了一个显示您的出生日期的出生日期程序,它还会考虑闰年,因此如果您输入年份为 1995 年第 2 个月第 29 天,它会出现错误,因为它不是闰年。它还需要计算每个月有多少天,这就是我需要帮助的部分。目前是这样的:

           if (month == 1 / && day > 31)
            {
                Console.WriteLine("January only has 31 days - Enter again");
                validDay = false;
            }
            else if (day >= 29 && !IsLeapYear(year) && month == 2)
            {
                Console.WriteLine("You were not born on a leap year or February only has 28 days - Enter again");
                validDay = false;
            }
           //And so on for each month

于是我就这样试了:

if (month == 1 || month == 3 || month == 5 || month == 7 || 
                month == 8 || month == 10 || month == 12 && day > 31)
            {
                Console.WriteLine("Your birth month only has 31 days - Enter again");
                validDay = false;
            }
            else if (day >= 29 && !IsLeapYear(year) && month == 2)
            {
                Console.WriteLine("You were not born on a leap year or February only has 28 days - Enter again");
                validDay = false;
            }
            else if (month == 3 || month == 6 || month == 9 || month == 11 && day > 30)
            {
                Console.WriteLine("Your birth month only has 30 days - Enter again");
                validDay = false;
            }

由于某种原因,即使您输入 1997、5、28,它也会始终抛出错误消息。在 5 中选择的月份但日期不是 > 31,那么为什么要这样做?我也对不同的方法持开放态度,因为我觉得还有另一种方法——也许是数组?

【问题讨论】:

  • 因为您的AND 仅应用于最后一个OR。
  • 谢谢大家,使用括号解决了这个问题。我也将其更改为使用日期时间,但我认为使用这种方式会从制作程序中获取乐趣。无论如何,仍然有新的两件事,所以再次感谢:)
  • 你能正确处理世纪闰年吗?有一个DateTime.DaysInMonth method 会让这个丑陋的代码块消失(并解决隐藏在其中的错误)。
  • 这工作:This Works: public static bool IsLeapYear(int year) { if (year % 4 == 0 || year % 100 == 0 && year % 400 == 0) return true; else return false; }

标签: c# if-statement logical-operators


【解决方案1】:

尝试添加一些括号

if ((month == 1 || month == 3 || month == 5 || month == 7 || 
month == 8 || month == 10 || month == 12) && day > 31)

没有括号,最后一个 && 仅指上个月。

你也可以使用 DateTime 构造函数,看看它是否抛出异常 (http://msdn.microsoft.com/en-us/library/xcfzdy4x(v=vs.110).aspx) 或使用 DateTime.TryParse。

【讨论】:

    【解决方案2】:

    我建议您使用 DateTime.TryParse - 它会自动验证所有日期,然后您可以将“无效日期”之类的内容返回给用户。

    【讨论】:

      【解决方案3】:

      运营商有一个叫做precedence order的东西。 尝试使用括号来实现您希望实现的优先级。

      【讨论】:

        【解决方案4】:

        为什么不使用 DateTime.TryParse。

        也请查看以下链接:

        Validating Date (Leap year or not) before inserting into Database

        Validate a DateTime in C#

        【讨论】:

          【解决方案5】:

          我会推荐如下使用 DateTime.TryParseExact...

          string year = "1997";
          string month = "5";
          string day = "28";
          string dateText = string.Format("{0}/{1}/{3}", year, month, day);
          DateTime date;
          
          if (!DateTime.TryParseExact(dateText, "yyyy/MM/dd", null, DateTimeStyles.None, out date))
          {
              Console.WriteLine("Date is invalid");
          }
          

          祝你好运!

          【讨论】:

            猜你喜欢
            • 2012-02-22
            • 1970-01-01
            • 2019-02-10
            • 1970-01-01
            • 2014-05-30
            • 2012-12-19
            • 2012-11-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多