【问题标题】:C# IF statement condition execution order (VS2010)C# IF 语句条件执行顺序(VS2010)
【发布时间】:2014-03-21 07:45:46
【问题描述】:

我有一个包含 4 个条件的 if 语句:

if (Global.LoggedAdmin != null &&
    LaunchDataGridView.CurrentCell.ColumnIndex == 5 ||
    LaunchDataGridView.CurrentCell.ColumnIndex == 6 ||
    LaunchDataGridView.CurrentCell.ColumnIndex == 9 )
                 {
                   //code
                 }

如果列索引为 5,由于某种原因它不会执行代码,而其余列索引则有效,我知道如果您有 ||乙 || c ||....|| z,如果其中至少一项为真,则代码应执行。 LoggedAdmin 始终不为空。我尝试将列索引条件 1'st 和 LoggedAdmin 条件最后放在 if 括号内,然后如果列索引为 5 || 则执行代码6但不是9,这是正常的吗?如果是,为什么? PS:我有另一个带有 3 个参数的 IF 语句,它或多或少类似于上面的那个,它也没有满足其中一个条件(列索引条件),但是当我将列索引部分放在括号中时它起作用了),例如上面,如果我把它们放在括号中,它不适用于任何列索引:/,我什么都不懂了。

【问题讨论】:

  • 提示:运算符优先级。
  • 用大括号分隔术语总是对我有用:(a != null && (b1 || b2 || b3))
  • you 期望Global.LoggedAdmin != null && 会与其余条件发生什么交互?你说LoggedAdmin 总是为空,所以想必你认为它和false && 是一样的,那么你认为它会如何交互?
  • 将答案标记为已接受就足够了 - 无需标记您的问题 [已解决],因为接受答案正是如此。

标签: c# if-statement


【解决方案1】:

我怀疑Global.LoggedAdmin 可能实际上是 null 并且评估的表达式是:

(Global.LoggedAdmin != null && LaunchDataGridView.CurrentCell.ColumnIndex == 5)
 ||
LaunchDataGridView.CurrentCell.ColumnIndex == 6
 ||
LaunchDataGridView.CurrentCell.ColumnIndex == 9

我想你的意思可能是:-

Global.LoggedAdmin != null && (
    LaunchDataGridView.CurrentCell.ColumnIndex == 5 ||
    LaunchDataGridView.CurrentCell.ColumnIndex == 6 ||
    LaunchDataGridView.CurrentCell.ColumnIndex == 9)

由于Global.LoggedAdmin 为空,它仍然不会执行代码。

【讨论】:

  • 他们在问题中声明LoggedAdminnull,所以我很难理解他们认为这个声明会做什么。
  • @VenomXlr,不确定您的意思是不是 LoggedAdmin 有时可以为空,有时不为空,或者LoggedAdmin 必须始终不为空。选择 col 5 时代码无法执行的证据意味着 col 5 未选择或 LoggedAdmin 为空。你决定。 This is further backed by the fact that when you move the LoggedAdmin condition to the bottom, the code doesn't execute when col 9 is selected means that again LoggedAdmin is null.您可能应该仔细检查LoggedAdmin 是否真的为空,如果您真的想要LoggedAdmin != nullLoggedAdmin == null
  • 好的,我发现了问题,LoggedAdmin 实际上总是为空,我很确定它不是空的,因为它必须在某个地方初始化,但现在不是按应有的方式执行 if,抱歉所有的混乱和感谢您的时间和耐心。
【解决方案2】:

您的问题原则上已经回答了多次,但为了清楚起见,我仍然会添加一些细节,以供您以及以后可能阅读您的代码的任何其他人:

您可以将您的 if 子句视为进行两项测试:一项测试Global.LoggedAdmin != null 是否,另一项测试ColumnIndex 是否是您指定的值之一。

为清楚起见,您可以将其拆分如下;结果,您最初的问题也会消失:

if (Global.LoggedAdmin != null && IsRelevantColumn())
{
    //code
}


private static bool IsRelevantColumn(){
    return LaunchDataGridView.CurrentCell.ColumnIndex == 5 ||
           LaunchDataGridView.CurrentCell.ColumnIndex == 6 ||
           LaunchDataGridView.CurrentCell.ColumnIndex == 9;
}

【讨论】:

    【解决方案3】:

    && 的优先级高于 || 运算符,这就是 && 首先计算的原因:

    Global.LoggedAdmin != null && LaunchDataGridView.CurrentCell.ColumnIndex == 5 ...
    

    您可以在此处查看优先级:http://msdn.microsoft.com/en-us/library/aa691323(v=vs.71).aspx

    这意味着Global.LoggedAdminnull,否则如果索引为5,它也会被执行。你要么也必须使用|| 而不是&&

    if (Global.LoggedAdmin != null ||
        LaunchDataGridView.CurrentCell.ColumnIndex == 5 ||
        LaunchDataGridView.CurrentCell.ColumnIndex == 6 ||
        LaunchDataGridView.CurrentCell.ColumnIndex == 9 )
     {
       //code
     }
    

    或者您需要使用== null 并将其余部分括在圆括号中。如果LoggedAdmin 始终为空,正如您所提到的,这可能是有道理的:

    if (Global.LoggedAdmin == null && (
        LaunchDataGridView.CurrentCell.ColumnIndex == 5 ||
        LaunchDataGridView.CurrentCell.ColumnIndex == 6 ||
        LaunchDataGridView.CurrentCell.ColumnIndex == 9 ))
     {
       //code
     }
    

    更新

    LoggedAdmin 始终不为空,我在编写时出错了

    这可能是你的代码:

    if (Global.LoggedAdmin != null && (
        LaunchDataGridView.CurrentCell.ColumnIndex == 5 ||
        LaunchDataGridView.CurrentCell.ColumnIndex == 6 ||
        LaunchDataGridView.CurrentCell.ColumnIndex == 9 ))
     {
       //code
     }
    

    【讨论】:

    • 请阅读我添加的答案,LoggedAdmin 始终不为空,我在那里写错了。
    • @VenomXLR:你的问题仍然包含 "LoggedAdmin is always null"
    • @VenomXLR:但是,您只需将 == null 更改为 != null 但保留括号,编辑我的答案。
    【解决方案4】:

    如您所知,括号的优先级更高。

    if (Global.LoggedAdmin != null &&
            LaunchDataGridView.CurrentCell.ColumnIndex == 5 ||
            LaunchDataGridView.CurrentCell.ColumnIndex == 6 ||
            LaunchDataGridView.CurrentCell.ColumnIndex == 9 )
                         {
                           //code
                         }
    

    等价于

    if ((Global.LoggedAdmin != null) &&
        (LaunchDataGridView.CurrentCell.ColumnIndex == 5 ||
        LaunchDataGridView.CurrentCell.ColumnIndex == 6 ||
        LaunchDataGridView.CurrentCell.ColumnIndex == 9) )
                     {
                       //code
                     }
    

    【讨论】:

    • 你确定吗?
    • @Micheal.yes && 的优先级高于 ||
    • 我也这么认为。这就是为什么我认为: (a && b || c || d) 不等同于 ((a) && (b || c || d)) 但等同于 ((a && b) || c | | d) - 还是我理解错了?
    【解决方案5】:

    你是说Global.LoggedAdmin总是null。然后你必须做这样的事情:

    if (Global.LoggedAdmin == null &&
    LaunchDataGridView.CurrentCell.ColumnIndex == 5 ||
    LaunchDataGridView.CurrentCell.ColumnIndex == 6 ||
    LaunchDataGridView.CurrentCell.ColumnIndex == 9 )
    {
       //code
    }
    

    或者,你可以这样做:

    if (Global.LoggedAdmin == null &&
    (LaunchDataGridView.CurrentCell.ColumnIndex == 5 ||
    LaunchDataGridView.CurrentCell.ColumnIndex == 6 ||
    LaunchDataGridView.CurrentCell.ColumnIndex == 9 ))
    {
       //code
    }
    

    【讨论】:

      猜你喜欢
      • 2013-05-18
      • 1970-01-01
      • 2015-03-04
      • 1970-01-01
      • 2023-04-04
      • 2023-01-03
      • 2021-06-17
      • 2013-10-17
      • 2019-01-24
      相关资源
      最近更新 更多