这是什么意思?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) 不会产生要赋值的值?
感谢您对此事的任何澄清。
合法的。 从 = 运算符 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;
现在,x
和y
都具有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;