为什么这行编译?
int foo = foo = 5;
我在一个我正在维护的系统中发现了这个,并且无法理解它的用途。
答案 0 :(得分:5)
没有目的。它相当于:
int foo = 5;
答案 1 :(得分:2)
赋值运算符(=)存储其右侧操作数的值 在左侧用表示的存储位置,属性或索引器中 操作数和返回值作为结果。
您的代码就像右手foo = 5;
一样有效,它会将5
作为值int foo
返回5
。
这就是为什么
int foo = foo = 5;
等于
int foo = (foo = 5);
也等于
int foo = 5;
答案 2 :(得分:2)
好吧,首先声明整数值:
int foo
然后你分配
int foo =
分配foo的值是
foo = 5
因为foo
是先前声明的 而返回结果(5)所以它很好;
最后:
int foo
int foo =
int foo = foo = 5;
5
设置为foo并返回5
答案 3 :(得分:0)
编译和有目的是两件事。
它会编译,因为foo = 5
会返回5
,可以将其分配给foo
。这没有用处,因为foo
已设置为5
。
很可能是重构的结果。
答案 4 :(得分:0)
它说foo等于5而foo等于foo
导致foo为5。
在这种情况下,根本没用。
但是请说:
int foo;
int bar;
foo = bar = 5;
将导致foo和bar都等于5。
我不是说它好或有目的,但它有效
答案 5 :(得分:0)
你的代码说它将相同的变量设置为相同的值,所以没有任何意图,但是这个编译是因为C#允许你以一种方式在一行中为多个变量设置相同的值。一个让它更容易理解的例子:
var foo = 3;
var bar = 1;
foo = bar = 5;
Console.WriteLine("foo: {0}, bar: {1}", foo, bar); // Output: foo: 5, bar: 5
Console.ReadKey();
答案 6 :(得分:0)
为什么要编译?因为没有人在编译器中添加了一个可以防止这种怪异的功能;与其他可以添加的功能相比,它的优先级可能太低了。
关于"它做了什么?",就像其他人所说的那样,=
运算符返回其右操作数,这在某些情况下很有用,例如: while( (line = ReadLine()) != null )
。因此,它将foo
设置为5,然后再次将foo
设置为5 ....