【问题标题】:Differences between prefix-increment operator in C and C++C和C++中前缀自增运算符的区别
【发布时间】:2018-11-21 13:39:20
【问题描述】:

我刚看了C reference about prefix increment operator,发现前缀自增运算符的结果不是左值,但在C++中却是左值,令人惊讶。之后我读了this answer,它解释了为什么它是一个左值,但我不明白:

(第 3 行):["] 看起来是这样,因此您可以获取其地址或分配给引用。[."]

下面是一个例子:

int i;
extern void f (int* p);

f (&++i);   /* Would be illegal C, but C programmers
              havent missed this feature */
...

那么允许这样做有什么好处呢?这样做的唯一目的是在全球区域增加i 是非法的吗?如果这是我认为这是对 C 中无法/难以解决的缺陷的补救措施的唯一原因,或者为了可读性可能应该重写程序,对吧?

顺便说一句,我不明白为什么左值也被称为“定位器值”,我读过this - line 4,但定位器对我来说是模糊的。什么是定位器,是指针什么的吗?

编辑:为了您宝贵的时间阅读 wth is locator value,这里是我的 自制 backronym

  • lvalue:位置值,你知道它的位置。
  • rvalue:读取值,只能读取值。

如果出了什么问题,别怪我。

【问题讨论】:

  • 有趣的观察。我冒昧地猜测,如果您深入研究运算符重载,那么这种类型的用法可能是有意义的。这可以解释为什么它是 C++ 而不是 C 的一部分。
  • 相关/欺骗:stackoverflow.com/questions/371503/…。我认为最佳答案是我见过的最好的推理。 IT 不可能在 C 中做到这一点,因为 C 没有引用,但 C++ 有,所以这将是一个自然的扩展。
  • 我以前从未见过“定位器值”,并怀疑它是一个反义词。据我所知,左值和右值最初是指赋值表达式的左右两边。
  • @TimRandall 居然是C99标准,让我吃惊。
  • @NathanOliver r 值是否有相应的“含义”?

标签: c++ c


【解决方案1】:

在 C++ 中,前缀++ 给出左值其实是很自然的。

因为 C++ 有运算符重载。对于大多数可能复杂类型的迭代器,前缀++ 返回迭代器本身的左值。

因此对于泛型编程,将基本类型作为特例会很不方便。

例如;

auto &iter = ++old_iter;

如果指针的前缀增量给出右值,则不起作用。

【讨论】:

  • 那么最小权限原则可以节省时间,对吧?允许它成为原始类型的左值不会造成任何麻烦。 C是最好的,我知道。 (不要冒犯,C++ 也是最好的:))
  • 我不买它。据我所知,C++ 可以具有与 C 相同的规则,并且仍然以相同的方式实现重载的 ++ 运算符。它会影响您使用结果的方式,而不一定影响您必须如何计算结果。
猜你喜欢
  • 2013-06-14
  • 1970-01-01
  • 2015-07-29
  • 2013-02-27
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
相关资源
最近更新 更多