2017-04-05 74 views
7

为什么这个代码片段c#字符串如何评估自己的值?

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

产生60ddd

而这一次

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

产生ddd302010

看起来很简单,但我无法理解它。 请给我指示我可以去的方向,以便找到详细的答案。

谢谢!

+4

[运算符关联性](https://en.wikipedia.org/wiki/Operator_associativity)和[C#专门](https://msdn.microsoft.com/en-gb/library/aa691323(v = vs.71))。 aspx) –

+0

[评估的优先顺序和顺序](https://msdn.microsoft.com/en-us/library/2bxt6kc4.aspx) – Aron

+0

@Damien_The_Unbeliever实际上,在这种情况下,运算符+(int,int)和运算符((字符串)int,string)的含糊性是导致混淆的原因。 – Aron

回答

11

+运营商告诉你的表达具有相同的优先级,因为它们是相同的运营商,因此被评价左到右:

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" 
+1

不是所有**操作符都从左到右进行评估。具体而言,所考虑的完整声明中的第一个运算符是赋值运算符,并且这是最后一次估计的结果。类似的'2 + 3 * 5'不会从左到右评估。 –

+0

@Damien绝对正确,谢谢你。看编辑,更好? – CodeCaster

+1

我想强调一点,这只是因为所有这些运算符都是* same *运算符(因此具有相同的优先级),并且'+'在C#(以及大多数其他语言中也是)中是关联的 –

2

这是因为表达式是从左侧到右侧评估的。在第一个例子中,30 + 20 + 10给你int + string(30 + 20 + 10) - int,“ddd” - 字符串。在第二个例子中,“ddd”+ 30是一个字符串“ddd30”,它将“20”和“10”附加到它。这一切都是关于订单(除非你有口供)。

1

运营商+有不同的重载:

INT + INT = INT

INT +字符串=串

字符串+ INT =字符串

在下面的表达式:

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

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

然后50 + 10将被评估,其两者都再次整数所以整数将被输出这是。

然后60 + “DDD”整数+串操作的操作者在这种情况下输出字符串,所以60 + “DDD” 会输出60ddd

在下面的表达式:

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

首先“DDD” + 30了其中字符串+整数操作发生这样的输出将是ddd30评析。

然后ddd30 + 20将得到评估中再次串+整数操作发生这样的输出将是ddd3020

然后ddd3020 + 10将得到评估中再次串+整数操作发生这样的输出将是ddd302010

0

发生这种情况的原因是操作顺序,如果从左到右。但分配是最后一次操作。 要确定价值首先必须计算表达式。

1

它的评估从左到右。第一个例子首先有数字,所以它首先评估为数字。然后它发现它必须评估为字符串。第二个例子是另一种方式。它从字符串开始并继续使用字符串。