后缀(前缀)增量、L 值和 R 值(在 C 和 C++ 中)

2023-12-02

我刚刚了解到以下事实:

  • 前缀增量 (++var_name) 的结果是 C 中的 R 值(至少,我是 确保它不是 C 中的 L 值),但它是 C++ 中的 L 值。

  • 后缀增量 (var_name++) 的结果是 C 中的 R 值(至少,我是 确保它不是 C) 中的 L 值。这在 C++ 中也是如此(它说结果 是纯右值)。

我在 VS2010(.cpp 和 .c)和 Ubuntu(gcc 和 g++)中检查了这些。

在 C++ 标准第 109 页(5.3.2)中http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf, 这个已经写完了

前缀++的操作数通过加1来修改,或者如果它是bool则设置为true(不推荐使用这种用法)。这 操作数应是可修改的左值。操作数的类型应为算术类型或指向 完全定义的对象类型。结果是更新后的操作数;它是一个左值, and...

并在第 101 页中,(5.2.6)

后缀++表达式的值是其操作数的值。 ...结果是 纯右值。结果的类型是操作数类型的 cv 未限定版本。另见 5.7 和 5.17。

(不过我不知道 R 值和纯右值之间的区别)。

对于C标准http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf, prefix ++在6.5.3.1中描述,postfix在6.5.2.4中描述,但是从描述中,我无法得到明确的答案。

我想知道为什么它们是R值或L值。我只知道

We can assign a value to a (modifiable) L-value, for example, a variable name. R-value is a value of an expression.

但我不知道为什么 postfix ++ 在 C 和 C++ 中不是 L 值,以及为什么 prefix ++ 在 C 中不是 L 值。(我看到类似“postfix ++...存储...在临时地址中,然后...”,但我仍然不明白)。

还有一个问题是为什么前缀++在C和C++中不同?将 prefix ++ 设为 L 值(在 C++ 中)有很多优点吗?如果是这样,为什么 C 不改变这一点? (除了向后兼容性之外的其他原因,或者至少为什么更改它会导致很多问题)。


C 和 C++ 是不同的语言。 C++ 有运算符重载,而 C 没有。这++运算符,无论是前缀还是后缀,都是可以在 C++ 中重载的运算符。 C++也有引用,而C没有。

In C, ++i and i++两者都产生一个不是值lvalue。这是可取的,否则您可能会因尝试修改相同序列点边界内的相同标量而与未定义的行为发生冲突。

深思:在 C 语言中,逗号运算符也会产生一个不是左值的值,因此要“删除”低价值, 你可以做:

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

后缀(前缀)增量、L 值和 R 值(在 C 和 C++ 中) 的相关文章

  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri

随机推荐

  • 如何让 javafx 类进入运行时?

    我愿意第一次尝试javafx 我去了Oracle上javafx网站发现javafx现在自带了JDK 7u25 我更新了我的 java 版本 但我不确定我在寻找什么 每当我尝试导入和使用 javafx 类时 都会出现 找不到符号 错误 我在
  • 是否可以在不同线程上使用 std::deque::push_back() 和 std::deque::front()/std::deque::pop_front() 而不同步? [复制]

    这个问题在这里已经有答案了 我有一个生产者 消费者的情况 只有一个生产者和一个消费者 共享一个公共的 std deque 让我写一些代码 deque
  • 无法使用参数调用 Word VBA 宏

    我有一个 VB6 应用程序 需要调用 Word 2010 VBA 例程并提供字符串参数 VBA 例程位于通过打开的文档启用的插件中 根据MSDN参考 http msdn microsoft com en us library ff83893
  • 从 JavaScript 调用 JAX-WS Web 服务时的空参数

    我有一个 JAX WS Web 服务 当从任何客户端 即 Java destkop 应用程序 调用但不能从 JavaScript 调用时 该服务工作正常 我的 WS 界面如下所示 WebService public interface Li
  • 将光标设置在 EditText 上的右侧,并提示重力居中

    这可能吗 有任何 EditText 属性可以这样做吗 Thanks 您可以使用 android ellipsize end android gravity center 当你声明 EditText 时在你的 xml 中 第一行是将光标移动到
  • 自跟踪实体和延迟加载

    有没有办法在上下文打开时使用延迟加载和自我跟踪实体 会有什么问题吗 我需要考虑什么 非常感谢您的提前答复 STE 根本不支持延迟加载 因为延迟加载需要在实体上创建动态代理 但 STE 在设计上并未代理 检查摘要中的附加注释 or MSDN问
  • 在python中向时间序列图添加水平限制线

    我想为温度时间序列图添加水平上限和下限线 假设上限线为 30 下限线为 10 df3 plot x Date y Temp PM Temp AM figsize 20 8 我认为这个解决方案可以帮助你 import matplotlib p
  • Joomla URL:一篇文章本身没有漂亮的 URL?

    我是 Joomla 1 5 的新手 我试图澄清一些有关 Joomla 处理 URL 的方式 我已经激活了他们所说的 搜索引擎友好的网址 但似乎页面 或 文章 只有在我从菜单链接到它时才会获得这样的 URL 漂亮的 无参数 URL 真的只在我
  • JQuery 滑块替代品? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在使用 JQuerySlider用作双面滑块的控件 这是一个很棒的 UI 控件 但我正在寻找一个不那么 胖 的替代方案 现在 为了让我使用滑块控件 我必须包括 jQuery核心
  • 'virtualenv' 'pip install sqlalchemy' 但看不到 'pip list'

    我学会了安装python的虚拟环境 看来我对一些基本的点子常识不太熟悉 That is 在虚拟环境中 virtualenv test 然后我有一个名为 test 的虚拟环境 然后我通过激活它 source test bin activate
  • 这个哈希对于安全性有优势吗?

    有什么好处吗 sha1 sha1 sha1 password salt 基本上有多个 sha1 与只有一个 sha1 sha1 password salt 我再说一遍 不要DO NOT尝试通过对哈希值进行 特殊 操作来使密码哈希值更安全 F
  • 使用 auto 访问类的私有结构

    我发现下一个奇怪的代码编译并运行 在 VS 2019 上 include
  • 什么是条件同步?

    有人可以向我解释条件同步吗 一个例子 最好是 C 的 也将不胜感激 听起来你的教授正在谈论线程 线程使计算机程序能够一次执行多件事情 在线程已经运行的情况下启动新线程的行为被计算机程序员称为 启动线程 线程可以共享相同的内存空间 条件同步
  • 0xC0000005:读取位置 0x00000008 时发生访问冲突

    我已经为此苦苦挣扎了一段时间 想知道是否有人可以提供帮助 我正在尝试使用 C 和 SDL1 3 制作粒子样本 到目前为止我已经取得了巨大的成功 程序编译并打开屏幕 但没有任何反应 当我运行调试器时 我收到此错误 SDL 1 3 Space
  • 为每个用户选择每天最高的 3 个分数

    我有一个像这样的 MYSQL 表 id userid score datestamp 1 1 5 2012 12 06 03 55 16 2 2 0 5 2012 12 06 04 25 21 3 1 7 2012 12 06 04 35
  • Windows 堆栈和堆地址范围

    到目前为止 我在使用 Linux 时 堆栈地址非常高 而堆地址非常低 通过使用 C 程序打印堆和堆栈地址可以看出 我对 Win32 进程内存布局有一个问题 MWSDN说堆栈地址高于堆地址 但从我在实践中看到的情况来看 堆栈地址低于堆地址 所
  • 关闭 MySQL 连接 (PHP)

    我编写了一个类来创建与 MySQL 的自动连接并创建查询 它看起来是这样的 include constants php class MySQLDB var connection function construct this gt conn
  • openpty 之后的 ncurses newterm

    我正在尝试弄清楚如何执行以下操作 创建一个新的伪终端 打开在 从属 伪终端内运行的 ncurses 屏幕 fork A 将 I O 从程序运行的终端 bash 转发到新的 从属 终端或 B 退出 让 ncurses 程序在新 pty 中运行
  • 从 R 中未知密度的分位数生成随机样本[重复]

    这个问题在这里已经有答案了 如何从未知密度的分位数生成随机样本数据f x for x之间0 and 4 in R f function x x 1 2 exp x 3 3 2 x 2 2 x 如果我理解正确的话 你想生成具有密度函数由下式给
  • 后缀(前缀)增量、L 值和 R 值(在 C 和 C++ 中)

    我刚刚了解到以下事实 前缀增量 var name 的结果是 C 中的 R 值 至少 我是 确保它不是 C 中的 L 值 但它是 C 中的 L 值 后缀增量 var name 的结果是 C 中的 R 值 至少 我是 确保它不是 C 中的 L