为什么赋值语句返回值?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

这是允许的:

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”分配给s,但该操作不应该返回任何值。

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

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

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

在C#中只有一种表达方式不会产生某种价值,也就是说,调用某些类型为返回void的东西。每种其他类型的表达式都会产生一个值或变量或引用或属性访问或事件访问等等。

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

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

有人可能会注意到这个问题已经被讨论过了:为什么这种C语言的这种习惯呢?

你必须要问Dennis Ritchie是否确定,但我的猜测是,任务几乎总是会留下刚才分配到寄存器中的值。C是一种非常“接近机器”的语言。看起来似乎是合理的,并且与C的设计保持一致,即语言特征基本上意味着“继续使用我刚分配的值”。为此功能编写代码生成器非常简单; 你只需继续使用存储已分配值的寄存器即可。

用户回答回答于

使用赋值运算符的这个属性的常见情况是从文件中读取行...

string line;
while ((line = streamReader.ReadLine()) != null)
    // ...

扫码关注云+社区