这是什么意思? int i =(i = 20);

时间:2012-05-16 00:26:58

标签: c#

我在这里开始学习变种时偶然发现了这一点:

http://msdn.microsoft.com/en-us/library/bb384061.aspx

但是,我不知道这是一个法律表达(它是)。我以为你不能使用a =(b = c)来分配东西,因为(b = c)不会产生要分配的值?

感谢您对此事的任何澄清。

10 个答案:

答案 0 :(得分:31)

这是合法的。来自= operator C# reference page

  

赋值运算符(=)将其右侧操作数的值存储在由其左侧操作数表示的存储位置,属性或索引器中,将该值作为其结果返回。 < / p>

(强调我的)

示例中的代码是设计的(并且毫无意义),但它可以在其他情况下用于以更简洁的方式执行有用的操作。例如:

BinaryTree tree;
TreeNode node;
if((node = tree.FindNodeForKey(10)) != null)
{
    // do useful things with returned node
}

答案 1 :(得分:14)

MSDN的全部引用是:

  

使用var声明的变量不能在初始化表达式中使用。换句话说,这个表达式是合法的:int i =(i = 20);但是这个表达式会产生一个编译时错误:var i =(i = 20);

关键是你不能在初始化表达式中使用var声明的变量。换句话说,如果你使用var来声明i,那么你就不能在=符号的另一边使用i。

正如其他人所说,你实际上不会写这段代码。这是一个人为的例子。

答案 2 :(得分:6)

我一直都在使用那种东西。

public class Parameters
{
    public readonly bool ContainsSquareBrackets;

    public Parameters(string paras)
    {
        if(ContainsSquareBrackets = paras.Contains(']') || paras.Contains('['))
        {
             // do something ...
        }
    }
}

答案 3 :(得分:4)

这个特殊代码毫无意义。赋值表达式返回刚刚分配的值。因此,结果:

i = 20

当然是20。因此:

i = (i = 20);

与:

相同
i = 20;

有时,赋值返回某些内容的事实可能很有用,例如for for循环:

for (string line; (line = reader.ReadLine()) != null;) { ... }

(对于它的价值,我不会在这种特殊情况下使用这个成语)

或者为多个变量分配相同的值:

int x, y;
x = y = 5;

现在,xy的值均为5

答案 4 :(得分:3)

它在C#中是合法的,因为默认情况下为the order of evaluation for operators is left to right,与C / C ++语言不同,{+ 3}}中没有定义限制。 =运算符将值赋值为20并返回值作为结果。它被解析为:

int i; //<- i is declared. 
i = 20; // assign 20 to i variable and returns.
i = i; // assign i as i value of.

它是sequence point.

答案 5 :(得分:2)

代码是非线程安全的方式,将文字值20分配给局部变量i。

表达式i = 20具有向i分配20的副作用,并且在赋值后具有值i。表达式i = (i = 20)(i = 20)分配值,该值几乎总是i在外部赋值时的值。如果线程被中断,表达式(i = 20)仍将具有值20,尽管在外部赋值发生时我可能有不同的值。

在任何情况下,您都不希望编写这些确切的代码。

答案 6 :(得分:1)

虽然它与i = 20的含义相同,但在某些情况下可能会有用。

如果其他人会维护您的代码,并看到类似的内容:

if ( i = some_function() )

他们可能认为这是一个错误,并且===重新对齐。 要表明这是您打算做的,您可以使用

if ( i = (i = some_function()) )

但是,我个人认为if ( i = /* = */ some_function() )i = some_function(); if (i)更清洁。

答案 7 :(得分:0)

即使以下内容在C ++和C#中都有效:

int i = i = i = 20;

上面的陈述是一个简单的使用赋值操作符从右到左操作数分配阀门。

答案 8 :(得分:0)

你可以采用相同的方法,如何声明一个变量..它只是你读过的那个让它变得复杂。

它存在是因为它可以用来混淆代码,在我看来它的存在与安全性有很深的联系。

答案 9 :(得分:0)

赋值运算符返回赋值。

因此,

i = 20

返回20

分配给i。

所以,

i = (i = 20);

一样好
i = 20;