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

本文关键字:是什么 int 意思 | 更新日期: 2023-09-27 18:34:21

我在开始在这里学习变量时偶然发现了这个:

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

但是,我不知道这如何成为法律表达(确实如此)。我以为你不能使用 a = (b=c) 分配给某物,因为 (b=c) 不会产生要赋值的值?

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

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

这是

合法的。 从 = 运算符 C# 参考页:

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

(强调我的)

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

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

MSDN 的整个引文是:

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

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

正如其他人所指出的,您实际上不会编写此代码。这是一个人为的例子。

我一直在用这种东西。

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

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

i = 20

当然是20. 因此:

i = (i = 20);

与以下相同:

i = 20;

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

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

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

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

int x, y;
x = y = 5;

现在,xy都具有5值。

这在 C# 中是合法的,因为默认情况下运算符的计算顺序是从左到右的,这与不定义序列点限制的 C/C++ 语言不同。=运算符将值分配给 20,并将值作为结果返回。它被解析为:

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

这是一个模棱两可的表达

该代码是将文本值 20 分配给局部变量 i 的非线程安全方法。

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

在任何情况下,您都不想编写此确切的代码。

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

如果其他人将维护您的代码,并看到如下所示的内容:

if ( i = some_function() )

他们可能会认为这是一个错误,并与== =关系。要表明这是您打算执行的操作,您可以使用

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

但是,我个人认为if ( i = /* = */ some_function() )或只是i = some_function(); if (i)更干净。

甚至以下内容在 C++ 和 C# 中也有效:

int i = i =

i = 20;

上面的语句是分配运算符从右到左操作数分配阀门的简单用法。

你可以做同样的方法,关于如何声明一个变量......它只是你阅读的那个使阅读变得复杂。

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

赋值运算符返回分配的值。

因此

i = 20

返回 20

分配给 i。

所以

i = (i = 20);

和一样好

i = 20;