gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:52:54 36 4
gpt4 key购买 nike

这是允许的:

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

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

据我了解,赋值 s = ”Hello”; 应该只会导致 “Hello” 被赋值给 s,但是操作不应返回任何值。如果那是真的,那么 ((s = "Hello") != null) 会产生一个错误,因为 null 将被比较为空。

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

最佳答案

To my understanding, assignment s = "Hello"; should only cause "Hello" to be assigned to s, but the operation shouldn’t return any value.

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

What is the reasoning behind allowing assignment statements to return a value?

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

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

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

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

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

Dennis Ritchie 不能再问了,不幸的是,但我的猜测是赋值几乎总是在寄存器中留下刚刚分配的值。 C 是一种非常“接近机器”的语言。这似乎是合理的,并且与 C 的设计保持一致,有一种语言功能基本上意味着“继续使用我刚刚分配的值”。为此功能编写代码生成器非常容易;您只需继续使用存储分配值的寄存器即可。

关于c# - 为什么赋值语句会返回一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51072413/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com