链接运算符<<和运算符++的问题

2024-01-10

我正在学习C++,我遇到了这个问题:

#include <iostream>
using namespace std;


class test
{
    public:
    test(){};
    test(int i):var{i}{};

    test& operator++(){++var; return this;}  
    test  operator++(int dummy){test tmp =*this;var++;return tmp;}

    friend ostream& operator<<(ostream&, const test&);


   private:
   int var;
};

ostream& operator<<(ostream& o, const test& obj)
{
    o<<obj.var;
    return o;
}


int main()
{
    test obj{2};
    cout << obj << endl;
    obj++;
    cout << obj << endl;
    cout << obj <<' '<< ++obj<<endl;

    return 0;
}

我预期的输出是: 2 3 3 4

相反,我有: 2 3 4 4

如果我用 obj++ 替换最后一个增量 ++obj ,情况会更奇怪: 2 3 4 3

就像以相反的方式读取流一样,你能帮助我吗?


我们来看看这条线如何

cout << obj << ' ' << ++obj << endl;

已翻译。

Step 1.

cout << obj

becomes

// A non-member function.
operator<<(cout, obj)

Step 2.

operator<<(cout, obj) << ' '

becomes

// Also a non-member function.
operator<<(operator<<(cout, obj), ' ')

Step 3.

operator<<(operator<<(cout, obj), ' ') << ++obj

becomes

// Also a non-member function.
operator<<(operator<<(operator<<(cout, obj), ' '), ++obj)

Step 4.

operator<<(operator<<(operator<<(cout, obj), ' '), ++obj) << endl;

becomes

// A member function.
operator<<(operator<<(operator<<(cout, obj), ' '), ++obj).operator<<(endl);

这就是整条线。

在这样的表达式中,不能保证operator<<(cout, obj)将在之前执行++obj。看来在你的平台上,++obj之前执行过operator<<(cout, obj)被执行。这解释了这种行为。

请注意,标准已更改。如果您能够使用 C++17,您将获得预期的行为。

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

链接运算符<<和运算符++的问题 的相关文章

随机推荐

  • pyenv-virtualenv:pyenv 中未安装“3.6.4”

    这让我很困惑 我不知道这意味着什么 我的计算机 MacOS 上安装了 3 6 4 但它不想工作 我想不出任何解决办法 也不知道该怎么办 无论你是在 Mac 还是 Linux 上 答案都略有不同 我不习惯在 Windows 上运行 Pytho
  • linux 区域设置未设置

    我有一台基于 ARM 的机器 上面装有 ubuntu 发行版 它经常在运行各种命令时向我提供以下信息 Please check that your locale settings LANGUAGE unset LC ALL unset LA
  • C#计算阶乘

    我有这段代码 它从用户那里获取输入并计算其阶乘和小于输入数字的阶乘 但我一直只获取第一个数字的阶乘 其余为 0 它应该是这样的 例如 如果输入为 5 5 120 4 24 3 6 2 4 1 1 如何让循环遍历输入数字下面的所有数字 usi
  • PrimeNg 数据表不刷新

    使用 Angular v2 4 8 和 PrimeNg v1 1 4 我有一个包含两个组件的页面 Dropzone 用于上传文件 p datatable 显示上传的文件 我将 Dropzone 配置为一次发送 5 个文件 当完成 5 个文件
  • 为什么我的 mysql DISTINCT 不起作用?

    为什么下面的两个查询返回重复的 member id 而不是第三个 我需要第二个查询来处理不同的 每当我运行GROUP BY 这个查询非常慢 并且结果集没有返回与 unique 相同的值 该值是错误的 SELECT member id id
  • 子进程可以在其父进程不死亡的情况下进入吗?

    Kill 它会立即终止进程吗 https stackoverflow com questions 8468866 kill does it kill the process right away 我找到了答案 并设置了一个信号处理程序SIG
  • 尝试打印我的矩阵而不是堆地址

    代码似乎可以运行 除了我得到的不是指定 由用户 大小的矩阵 而是我认为是堆地址 以下是当用户输入 2 作为尺寸 然后输入 4 个数字时返回的结果 输入矩阵大小 2 逐行输入 2 x 2 矩阵 2 3 4 5 行排序矩阵是 D 3c95454
  • jQuery 颜色选择器 z 轴问题

    我正在用这个选色器 http www eyecon ro colorpicker about 这真是太棒了 但是 我想在 jQuery 对话框中使用它 在表单内的输入标记上 但问题是当颜色选择器出现时 它部分位于对话框后面 在 z 轴上 因
  • GCP Cloud Run:禁用默认 URL 并仅使用自定义域?

    是否可以像这样禁用默认 URLhttps my app 332mpca uc a run app并且仅使用域映射中定义的自定义域 您无法使用自定义域来实现这一点 您可以通过在 Cloud Run 前面添加负载均衡器来实现类似的目标 这要归功
  • Node.js SFTP 客户端 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想通过 node js 应用程序访问 sftp 服务器 你知道有这个图书馆吗 或者你知道我如何实现这
  • Python 智能日期解析(不指定年份)

    如何解析没有年份的日期 使用 dateutil 以便当当前日期为 17 11 2012 时 这些日期将被解析如下 print parser parse 23 nov dayfirst True yearfirst False fuzzy T
  • 列表的列表的列表

    表示类型的好方法是什么LoL a 是列表的列表 的 的a 嵌套级别是任意的 但总体上是统一的 外部列表的元素 我想到的情况是对 a 的成员进行分组 列表 然后对每个子组应用下一个分组 依此类推 它 事先并不知道需要应用多少个分组 因此 rG
  • Quill 工具栏未渲染(图标路径显示而不是渲染)

    我正在尝试在 React 中运行本机 Quill 我遵循 quill 的快速入门 但不幸的是工具栏渲染存在问题 见下文 显示图标路径而不是渲染图标路径 请给我同样的指示 套筒组件 import Quill from quill core i
  • AttributeError:“Response”对象没有属性“body_as_unicode”scrapy for python

    我正在 scrapy 中处理响应并继续收到此消息 我只给出了发生错误的片段 我正在尝试浏览不同的网页 并且需要获取该特定网页中的页面数 所以我创建了一个响应对象 我在其中获取下一个按钮的 href 但继续获取AttributeError R
  • 如何为不同的构建配置指定不同的nuget包版本?

    我想为不同的项目配置指定不同的包版本 我知道这在我的 csproj 文件中对于非 NuGet 依赖项 裸 DLL 会是什么样子 但我也想尝试让它与 NuGet 包一起使用 问题是 NuGet 依赖项是在 packages config 中指
  • 为什么使用 redux-persist 而不是手动将状态持久化到 localStorage?

    另一种询问方式是 如果您真的只想使用 localStorage 补充 中保存的数据启动应用程序并将每个 redux 状态更改保存到 localStorage 持久 则使用还原 持久化 https github com rt2zz redux
  • Google Action 和 DialogFlow 错误“抱歉,此操作不适用于您的应用”

    我创建了一个 DialogFlow 应用程序 可以在我的开发者帐户中完美运行 但我需要以另一个用户的身份对其进行测试 因此在我的 Google Action 模拟器中 我添加了另一个测试帐户作为项目的所有者 我验证了该用户在 DialogF
  • 使用 MonoDevelop 4.0(又称 Xamarin Studio)重新获得 C/C++ 项目支持

    使用最新的 Xamarin Studio 从 MonoDevelop 4 0 重新标记 我无法打开 cproj不再可以在 MonoDevelop 3 0 4 7 中运行的项目 The 功能列表 http monodevelop com Do
  • 在 iOS Swift 中检测设备上正在播放的音轨

    我正在创建一个情绪跟踪应用程序 除其他外 它应该使用有关用户收听的歌曲的信息 具体来说 我感兴趣的是在播放曲目时提取从锁定屏幕视图中可见的标题 我搜索过互联网 但没有找到使用 Swift 访问这些数据的解决方案 有人可以帮忙吗 最简洁的答案
  • 链接运算符<<和运算符++的问题

    我正在学习C 我遇到了这个问题 include