2017-04-05 36 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

它的評估從左到右。第一個例子首先有數字,所以它首先評估爲數字。然後它發現它必須評估爲字符串。第二個例子是另一種方式。它從字符串開始並繼續使用字符串。