【问题标题】:Program flow - booleans c#程序流程 - 布尔值 c#
【发布时间】:2017-12-13 22:54:47
【问题描述】:

在一些帮助下,我设法得到了这些问题的正确答案,但我想了解这些概念(即理解为什么这些代码是正确的),因为理解非常重要并且不仅仅是语法记忆。

第一个问题是给你3场比赛的结果(真=赢),第一个奖金是1,第二个是2,第三个是3。返回总奖金(你可以赢任何奖品组合)

答案是:

 public static int GetTotalPrize(bool first, bool second, bool third)
    {
        var result = 0;

        if (first)
        { result += 1; }

        if (second)
        { result += 2; }

        if (third)
        { result += 3; }

        return result;
    }

程序如何知道如果您要赢得一等奖、二等奖和三等奖,那么总数是 6?或者如果你要赢得第一和第三,总数是4?换句话说,上面的代码如何解释所有可能的组合?

第二个问题是您获得了 3 场比赛的结果,其中一场比赛是您获胜的(真 = 获胜)。第一名的奖金是1,第二名是2,第三名是3。返还奖金。

我的回答是:

public static int GetPrize(bool first, bool second, bool third) 
{ 
if (first) 
    return 1; 

if (second) 
    return 2; 

if (third) 
    return 3; 

return 0; 
}

没有“return 0;”最后的部分,我的代码显示为不正确。为什么?正如问题所说,我赢得了其中一个奖项,换句话说,我不会空手而归。

提前致谢

【问题讨论】:

  • 我建议您阅读 += 运算符的作用。这将是您问题的答案
  • “如果没有最后的“return 0;”部分,我的代码会显示为不正确。为什么?”因为所有布尔值都可能是假的,那么你会不返回任何东西。所以你必须添加return 0。编译器试图提供帮助,他做到了
  • 我知道它的作用,但你没有正确阅读我的问题@Sergey
  • 谢谢蒂姆,这很有道理
  • @S.Dan:顺便说一句,如果没有booltrue,您也可以抛出异常,而不是返回0。如果这是一个例外情况,那可能是更好的选择,因此永远不应该发生并表明存在错误。所以你可以用throw new ArgumentException("One of the bools must be true")替换return 0;

标签: c# if-statement boolean


【解决方案1】:

第一段代码如下(读作伪代码)


定义一个名为result的数字 将其值设置为0

if参数(first)等于true,将1添加到result

[对(second)(third) 再次执行此操作,但使用它们各自的数值]

返回result


它只是计算分数,然后返回它。

你问题的第二部分:


您将方法定义为保证返回int。因此,如果不遵循该保证,您将无法编写该方法。你不能返回 NOTHING (void),否则编译器会报错。

您也不能返回 null ,因为 int 不能为空。

如果我们采用您第二个问题的逻辑,并被告知使其能够接受任何轮,那么最后return 语句的原因可能会变得更加明显:

    public static int GetPrize(params bool[] scores)
    {
        for (int i = 0; i < scores.Length; i++)
        {
            if (scores[i]) // there is no guarantee any of the bools passed along equals true, so we might never hit this return statement.
                return i + 1;
        }

        //if we never hit the first return statment, 
        //we will end up here, and will not have won anything.
        //we still need to return an int, though.
        return 0;
    }

【讨论】:

    【解决方案2】:

    好吧,让我们一步一步来。

    第一个答案:

    public static int GetTotalPrize(bool first, bool second, bool third)
    {
        var result = 0;
    
        if (first)
        { result += 1; }
    
        if (second)
        { result += 2; }
    
        if (third)
        { result += 3; }
    
        return result;
    }
    

    这里发生的情况如下:

    1. 变量result初始化为0。
    2. 接下来是一系列 if 语句。注意它们是如何只有 if 而不是 if-else,这意味着它们不是相互排斥的。
      • 当 if 语句为真时,result += [some number] 发生。这意味着为 result 分配了值(结果 + [某个数字])。
    3. 最后返回result

    第二个答案:

    public static int GetPrize(bool first, bool second, bool third) 
    { 
        if (first) 
            return 1; 
    
        if (second) 
            return 2; 
    
        if (third) 
            return 3; 
    
        return 0; 
    }
    

    在这里,您被告知您肯定赢得了其中一个。如果你没有赢得第一个,那么你可能会赢得第二个或第三个。如果你还没有赢得第二个,那么你一定赢得了第三个。所以正确的代码是:

    if (first)
        return 1;
    else if (second)
        return 2;
    else
        return 3;
    

    在这种情况下,if 语句 是相互排斥的,因为您被告知您已经赢得了其中的 一个。与第一个答案不同,此语法保证将返回其中一个值(1、2 或 3)。

    返回保证很重要,因为您已将函数定义为返回类型int。这意味着,无论代码中发生什么,它总是返回一个int。在您的代码中,如果不是 return 0,那么如果所有 if 都是 false,则不会有 return 语句。当然,你被告知至少有一个是真的。但是编译器不知道这一点,因此它不会让您编译一个不满足始终返回值的要求的函数。

    【讨论】:

    • 完美的解释。 “互斥”部分有助于消除我的误解。非常感谢
    • 第二段代码(if、else if、else)返回一个错误,虽然它很有意义...?
    • @S.Dan 代码本身没问题,我在发布之前确定了。你得到什么错误?
    • 我在 Microsoft Visual Studio 上似乎看不到错误的位置,但在“bool third”下方有一条绿色波浪线表示“参数“third”似乎不是在这个方法中使用。考虑删除它。如果由于编译原因必须声明参数,请将其重命名为仅包含下划线字符'。
    • @S.Dan 您看到的不是错误,而是警告。即使您保持原样,代码也会编译。但是,VS 告诉你你没有在任何地方使用third(你没有),所以最好从函数的参数中删除它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 2017-06-26
    相关资源
    最近更新 更多