【问题标题】:How does c# string evaluates its own value?c#字符串如何评估自己的值?
【发布时间】:2017-04-05 07:38:15
【问题描述】:

为什么这个sn-p的代码

string str = 30 + 20 + 10 + "ddd";
Console.WriteLine(str);

产生60ddd

还有这个

string str = "ddd" + 30 + 20 + 10;
Console.WriteLine(str);

产生ddd302010?

看起来很简单,但我无法理解它。 请告诉我方向,以便找到详细的答案。

谢谢!

【问题讨论】:

  • @Damien_The_Unbeliever 实际上,在这种情况下,operator +(int, int)operator((string)int, string) 的歧义是造成混淆的原因。
  • 但是,归根结底,依靠评估顺序是如何毁掉某人的一天,并从奇怪的错误中造成无法估量的损害的一个典型例子。
  • @Aron - 不,事实上,由于没有括号,在第一个表达式中,要执行的第一个操作显然是两个 ints 之间的 + 和第二个表达式,在stringint 之间是+。由于关联性。

标签: c# .net expression operator-precedence


【解决方案1】:

您显示的表达式中的 + 运算符具有相同的优先级,因为它们是相同的运算符,因此从左到右计算:

30 + 20 + 10 + "ddd"
-- + (int, int) returns (int)50
------- + (int, int) returns (int)60
------------ + (object, string) returns (string)"60ddd"

那么对于另一种情况:

"ddd" + 30 + 20 + 10
----- + (string, object) returns (string)"ddd30"
---------- + (string, object) returns (string)"ddd3020"
--------------- + (string, object) returns (string)"ddd302010"

【讨论】:

  • 不是 所有 运算符从左到右进行评估。具体来说,所考虑的完整语句中的第一个运算符是赋值运算符,它是最后评估的。类似的2 + 3 * 5不会从左到右进行评估。
  • @Damien 绝对正确,谢谢。看看编辑,更好吗?
  • 我要强调的是,这只是因为所有这些运算符都是 same 运算符(因此具有相同的优先级)并且 + 在 C# 中是关联的(以及大多数其他语言)
  • @CodeCaster 谢谢,这很有意义。有时你只是在成功地征服了更复杂的话题之后,就停留在这样的小事上)
【解决方案2】:

这是因为表达式是从左侧到右侧计算的。在第一个例子中 30 + 20 + 10 给你 int + string (30 + 20 + 10) - int, "ddd" - string。在第二个示例中,“ddd”+30 是一个字符串“ddd30”,它附加了“20”和“10”。一切都与顺序有关(除非您有括号)。

【讨论】:

    【解决方案3】:

    它是从左到右评估的。第一个示例首先具有数字,因此它首先以数字形式进行评估。然后它发现它必须评估为字符串。第二个例子是相反的。它以字符串开头并以字符串继续。

    【讨论】:

      【解决方案4】:

      运算符 + 有不同的重载:

      int + int = int

      int + 字符串 = 字符串

      字符串 + 整数 = 字符串

      在以下表达式中:

      string str = 30 + 20 + 10 + "ddd";
      Console.WriteLine(str);
      

      第一个 30 + 20 得到的评估都是整数,因此运算符的输出将是整数,即 50

      然后 50 + 10 将被评估,这两个都是整数,所以整数将被输出 60

      然后 60 +​​ "ddd"整数 + 字符串 操作本例中的运算符输出字符串,因此 60 + "ddd" 将输出 60ddd强>。

      在以下表达式中:

      string str = "ddd" + 30 + 20 + 10;
      Console.WriteLine(str);
      

      First "ddd" + 30 got 评估发生字符串 + 整数运算的位置,因此输出将是 ddd30

      然后 ddd30 + 20 将被评估,其中再次发生字符串 + 整数运算,因此输出将是 ddd3020

      然后 ddd3020 + 10 将被评估,其中再次发生字符串 + 整数运算,因此输出将是 ddd302010

      【讨论】:

        【解决方案5】:

        之所以会这样,是因为操作顺序是从左到右。但是分配是最后的操作。 要赋值第一个表达式必须计算。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多