为什么这个代码片段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