爲什麼這個代碼片段c#字符串如何評估自己的值?
string str = 30 + 20 + 10 + "ddd";
Console.WriteLine(str);
產生60ddd
,
而這一次
string str = "ddd" + 30 + 20 + 10;
Console.WriteLine(str);
產生ddd302010
?
看起來很簡單,但我無法理解它。 請給我指示我可以去的方向,以便找到詳細的答案。
謝謝!
爲什麼這個代碼片段c#字符串如何評估自己的值?
string str = 30 + 20 + 10 + "ddd";
Console.WriteLine(str);
產生60ddd
,
而這一次
string str = "ddd" + 30 + 20 + 10;
Console.WriteLine(str);
產生ddd302010
?
看起來很簡單,但我無法理解它。 請給我指示我可以去的方向,以便找到詳細的答案。
謝謝!
的+
運營商告訴你的表達具有相同的優先級,因爲它們是相同的運營商,因此被評價左到右:
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絕對正確,謝謝你。看編輯,更好? – CodeCaster
我想強調一點,這只是因爲所有這些運算符都是* same *運算符(因此具有相同的優先級),並且'+'在C#(以及大多數其他語言中也是)中是關聯的 –
這是因爲表達式是從左側到右側評估的。在第一個例子中,30 + 20 + 10給你int + string(30 + 20 + 10) - int,「ddd」 - 字符串。在第二個例子中,「ddd」+ 30是一個字符串「ddd30」,它將「20」和「10」附加到它。這一切都是關於訂單(除非你有口供)。
運營商+有不同的重載:
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。
發生這種情況的原因是操作順序,如果從左到右。但分配是最後一次操作。 要確定價值首先必須計算表達式。
它的評估從左到右。第一個例子首先有數字,所以它首先評估爲數字。然後它發現它必須評估爲字符串。第二個例子是另一種方式。它從字符串開始並繼續使用字符串。
[運算符關聯性](https://en.wikipedia.org/wiki/Operator_associativity)和[C#專門](https://msdn.microsoft.com/en-gb/library/aa691323(v = vs.71))。 aspx) –
[評估的優先順序和順序](https://msdn.microsoft.com/en-us/library/2bxt6kc4.aspx) – Aron
@Damien_The_Unbeliever實際上,在這種情況下,運算符+(int,int)和運算符((字符串)int,string)的含糊性是導致混淆的原因。 – Aron