【问题标题】:Null-coalescing operator and order of operations?空合并运算符和操作顺序?
【发布时间】:2021-08-31 00:40:25
【问题描述】:

谁能向我解释为什么这个代码:

int? a = 54;
decimal b = a ?? 0 / 100m;

b 的值为 54 ?

但是如果我添加一些括号:

int? a = 54;
decimal b = (a ?? 0) / 100m;

它的值为0.54?

我不明白为什么会这样。因为a 的值是 54,我原以为?? 运算符什么也不做。

【问题讨论】:

  • 操作员不能“什么都不做”。它必须评估为 something。你认为b 在这两种情况下会是什么?
  • a ?? 0 / 100ma ?? (0 / 100m)(a ?? 0) / 100m 当然是完全不同的东西。
  • 顺便说一句(因为有很多回答已经回答了您的问题),但是如果您这样做,decimal b = a.Value / 100m; 将实现您尝试做的事情,减少对空合并运算符的依赖觉得很混乱。
  • 您忽略了非常基本的 C# 功能:括号中的 highest priority 按计算顺序排列。

标签: c# null-coalescing-operator


【解决方案1】:

From MSDN:

空合并运算符 ??返回其左手的值 如果操作数不为空;否则,它评估右手 操作数并返回其结果。这 ??运营商不评估其 如果左侧操作数的计算结果为非空,则为右侧操作数。

在您的第一种情况下,

int? a = 54;  //Here "a" is not null
decimal b = a ?? 0 / 100m; //As "a" is not null, Value of "a" will be assigned to "b".

在第二种情况下,

  // precedence of "(<expression>)" is greater than "null coalescing operator" 
  int b = (a ?? 0) / 100m;
          //+++++++        --This will evaulate first and returns 54
         //          +++  -- This will be calculated as 54 / 100m i.e 0.54

【讨论】:

  • “如果左侧操作数的计算结果为非空,则 ?? 运算符不计算其右侧操作数” - 啊,没有括号,0/100m 被视为右手操作员。明白了,非常感谢!
  • 那一点文档不一定对你有帮助,因为你不知道右手是什么。你需要运算符优先级来告诉你
  • @Charlieface,关于运算符的优先级,我同意您的观点,但需要文档才能理解 null coalescing 运算符,如果 OP 理解它,那么他将理解为什么 b 会以 @987654326 的形式出现@在他的第一个案例中
  • @Charlieface 我在回答中引用的文档中给出了 OP 第一个问题b has the value of 54 ? 的答案
【解决方案2】:

这纯粹是运算符优先级的问题。

The documentation lists the order of precedence 用于不同的运算符,您会看到/ 的优先级高于??,这意味着它将首先被评估。

所以,

decimal b = a ?? 0 / 100m;

总是被评估为

decimal b = a ?? (0 / 100m);

【讨论】:

    【解决方案3】:
    decimal b = a ?? 0 / 100m;  
    

    评估为

    decimal b;
    if (a == null)
    {
        b = 0 / 100m;
    }
    else
    {
        b = a;
    }
    

    【讨论】:

      【解决方案4】:

      只是一个想法:

      decimal b = a ?? 0 / 100m;
      

      相当于:

      decimal b = a ?? (0 / 100m);
      

      所以100不适用于第一种情况

      【讨论】:

        【解决方案5】:

        ??has lower 优先于/

        1 例:

        54 ?? (0 / 100) == 54

        2 例:

        (54 ?? 0) / 100 == 0.54

        【讨论】:

          【解决方案6】:
          int? a = 54;
          decimal b = (a ?? 0) / 100m;
          

          如您所见,评估为 b = (54) / 100mb = 0.54

          【讨论】:

            猜你喜欢
            • 2011-09-10
            • 2017-07-14
            • 2011-02-13
            • 2012-09-19
            • 1970-01-01
            • 1970-01-01
            • 2020-05-01
            • 2022-12-11
            • 2013-09-13
            相关资源
            最近更新 更多