为什么赋值语句会返回一个值?

2024-01-25

这是允许的:

int a, b, c;
a = b = c = 16;

string s = null;
while ((s = "Hello") != null) ;

据我了解,作业s = ”Hello”;应该只会导致“Hello”被分配给s,但该操作不应返回任何值。如果这是真的,那么((s = "Hello") != null)会产生错误,因为null会被比作什么都没有。

允许赋值语句返回值的原因是什么?


据我了解,赋值 s = "Hello";应该只会导致“Hello”被分配给 s,但该操作不应返回任何值。

你的理解是100%不正确的。你能解释一下为什么你相信这个错误的事情吗?

允许赋值语句返回值的原因是什么?

首先,任务声明不产生价值。任务表达式产生一个值。赋值表达式是合法的语句;在 C# 中,只有少数表达式是合法语句:表达式的等待、实例构造、递增、递减、调用和赋值表达式可以在需要语句的地方使用。

C# 中只有一种表达式不会产生某种值,即调用类型为返回 void 的内容。 (或者,等效地,没有关联结果值的任务的等待。)每种其他类型的表达式都会生成值或变量或引用或属性访问或事件访问,等等。

请注意,所有与语句一样合法的表达式都是对它们的副作用有用。这是这里的关键见解,我认为也许是您直觉认为赋值应该是语句而不是表达式的原因。理想情况下,每个语句只有一个副作用,并且表达式中没有副作用。它is有点奇怪的是,副作用代码可以在表达式上下文中使用。

允许此功能的原因是因为 (1) 它通常很方便,并且 (2) 它在类 C 语言中是惯用的。

有人可能会注意到有人提出了这样一个问题:为什么在类 C 语言中这是惯用语?

不幸的是,丹尼斯·里奇(Dennis Ritchie)不再可以询问,但我的猜测是,作业几乎总是会落下刚刚分配的值在寄存器中。 C 是一种非常“接近机器”的语言。似乎有道理,并且符合 C 的设计,有一个语言功能基本上意味着“继续使用我刚刚分配的值”。为此功能编写代码生成器非常容易;您只需继续使用存储分配值的寄存器即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么赋值语句会返回一个值? 的相关文章

随机推荐