【问题标题】:Why can't the result of a modulo operation be used in an if statement directly?为什么不能直接在 if 语句中使用模运算的结果?
【发布时间】:2013-06-04 23:53:27
【问题描述】:

我正在做一本书的挑战,它要求我创建一个从 20 倒数到 0 的循环,并让我为每个数字打印一条消息。但是,它要求我为每个可被 5 整除的数字打印一条特殊消息。我见过一些例子,包括这个:

if (number%5==0)
{
    //your code here
}

我知道模在做什么,但为什么这段代码后面有==0?例如,为什么不直接这样编码:

if (number%5)
{
    //your code here
}

【问题讨论】:

  • if 语句中的条件必须为真。因此,“number%5”必须等于 0。

标签: c# loops if-statement modulo


【解决方案1】:

因为number%5 是0 到4 之间的整数,而number%5==0 是布尔值。与 C/C++ 等可以将整数视为布尔值(例如 0 -> false,1 -> true)的语言不同,在 C# 中,if 的条件必须是“真实”布尔值。

(即使 C# 允许您在 if 条件中使用整数,您对代码的建议更改也是不正确的。如果 number%5 为 0,前一段代码将运行您的代码,后一段代码将运行您的代码如果 number%5 不为 0,则代码。)

编辑:正如 Eric Lippert 在 cmets 中所说,在 if 条件中使用 bool 的替代方法是使用实​​现 implicit operator bool 作为强制转换或实现运算符 truefalse 的东西,比如http://msdn.microsoft.com/en-us/library/6x6y6z4d.aspx。但据我所知,除了bool 之外,没有任何原语满足其中任何一个。

【讨论】:

  • 我相信设计决策是为了解决您发现的问题(即逻辑不正确)。
  • @Matthew 我认为另一个问题是在整数被认为是布尔值的系统中,所有非零都是真,零是假。所以你可以有一个布尔值评估为 True 的值,例如 2) 然后执行 2 == True 并惊讶地发现你得到 False!
  • 我明白了,所以条件必须为真或假。它不能是整数。例如,如果我说“if(x=12)”,x=12 要么是真要么是假的陈述。 X 要么等于 12,要么不等于。对或错。有道理。
  • @Chris Smith 我希望你的意思是输入 x==12,而不是 x=12!
  • 你的回答很好,但有一个小错误。从技术上讲,C# 不要求if 的条件为bool 类型。相反,它要求要么 (1) 条件可隐式转换bool 或(2) 条件表达式实现operator true 生成@987654334 @ 来自给定的表达式。顺便说一句,while 和所有其他基于布尔值分支的构造也是如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 2015-07-20
  • 1970-01-01
  • 2014-02-27
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多