ostream 链接,输出顺序

2024-01-09

我有一个函数需要ostream引用作为参数,将一些数据写入流,然后返回对同一流的引用,如下所示:

#include <iostream>

std::ostream& print( std::ostream& os ) {
  os << " How are you?" << std::endl;
  return os;
}

int main() {
  std::cout << "Hello, world!" << print( std::cout ) << std::endl;
}

这段代码的输出是:

 How are you?
Hello, world!0x601288

但是,如果我将链接表达式分成两个语句,如下所示

int main() {
  std::cout << "Hello, world!";
  std::cout << print( std::cout ) << std::endl;
}

然后我至少在输出中得到正确的顺序,但仍然得到一个十六进制值:

Hello, world! How are you?
0x600ec8

我想了解这里发生了什么事。正常功能是否优先于operator<<,这就是输出顺序相反的原因?编写将数据插入到数组中的函数的正确方法是什么?ostream但这也可以与operator<<?


您的代码的行为是未指定根据 C++ 标准。

解释

以下内容(我删除了std::endl为了简单起见)

std::cout << "Hello, world!" << print( std::cout ); 

等价于:

operator<<(operator<<(std::cout, "Hello, World!"), print(std::cout));

这是一个函数调用,传递两个参数:

  • 第一个参数是:operator<<(std::cout, "Hello, World!")
  • 第二个参数是:print(std::cout)

现在,标准没有指定计算参数的顺序。这是未指定。但是你的编译器似乎首先评估第二个参数,这就是它打印的原因“你好吗?”首先,将第二个参数计算为 type 的值std::ostream&然后它被传递给上面显示的调用(该值是对象std::cout本身)。

为什么要输出十六进制?

您会得到十六进制输出,因为第二个参数的计算结果为std::cout,它被打印为十六进制数,因为std::cout隐式转换为指针值void*类型,这就是为什么它被打印为十六进制数字。

尝试这个:

void const *pointer = std::cout; //implicitly converts into pointer type!
std::cout << std::cout << std::endl;
std::cout << pointer << std::endl;

它将为两者打印相同的值。例如,这个例子位于ideone http://ideone.com/GwsjQ打印这个:

0x804a044
0x804a044 

另请注意,我没有使用explicit投掷;相当std::cout is 隐含地转换为指针类型。

希望有帮助。


编写将数据插入到数组中的函数的正确方法是什么?ostream但这也可以与operator<<?

什么时候取决于你所说的链接是什么意思?显然,以下内容是行不通的(如上所述):

std::cout << X << print(std::cout) << Y << Z; //unspecified behaviour!

不管你怎么写print().

然而,这是明确定义的:

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

ostream 链接,输出顺序 的相关文章

  • 使用链表进行堆排序

    我想知道是否有人曾经使用链表进行堆排序 如果他们可以提供代码 我已经能够使用数组进行堆排序 但尝试在链表中进行排序似乎不切实际 而且在你知道的地方很痛苦 我必须为我正在做的项目实现链接列表 任何帮助将不胜感激 我也用C 答案是 你不想在链表
  • C# 静态类型不能用作参数

    public static void SendEmail String from String To String Subject String HTML String AttachmentPath null String Attachme
  • 如何从字符串中提取子字符串直到遇到第二个空格?

    我有一个像这样的字符串 o1 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 如何仅提取 o1 1232 5467 要提取的字符数并不总是相同 因此 我只想提取直到遇到
  • C# 中的 Stack<> 实现

    我最近一直在实现递归目录搜索实现 并且使用堆栈来跟踪路径元素 当我使用 string Join 连接路径元素时 我发现它们被颠倒了 当我调试该方法时 我查看了堆栈 发现堆栈内部数组中的元素本身是相反的 即最近 Push 的元素位于内部数组的
  • 无法继承形状

    为什么我不能使用继承 a 的类Shapes class http msdn microsoft com en us library ms604615 28v vs 90 29 我需要延长Rectangle具有一些方法的类 但我想以与使用相同
  • 如何修复错误:“检测到无法访问的代码”

    我有以下代码 private string GetAnswer private int CountLeapYears DateTime startDate return count String answer GetAnswer Respo
  • MVC 5 中具有 ASP.NET Identity 的 Autofac 不会验证 OWIN 管道中的安全标记

    我在 MVC 5 中设置了 AutoFac 来与 ASP NET Identity 一起使用 表面上一切似乎都工作正常 即用户可以创建帐户并登录 但后来我发现 当安全标记更改时 用户不会注销 通过在 AspNetUsers 表中进行暴力破解
  • 用于在标头更改时重新编译的简单 C 项目的示例 makefile

    有谁有完整的 makefile 可以执行以下操作 如果 HEADER 文件发生更改 则重建项目 cpp 文件在 makefile 中列出 头文件未在 makefile 中列出 头文件允许与 cpp 文件具有不同的名称 部分cpp文件没有头文
  • Makefile 和 .Mak 文件 + CodeBlocks 和 VStudio

    我对整个 makefile 概念有点陌生 所以我对此有一些疑问 我正在 Linux 中使用 CodeBlocks 创建一个项目 我使用一个名为 cbp2mak 的工具从 CodeBlocks 项目创建一个 make 文件 如果有人知道更好的
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • 读取依赖步行者输出

    I am having some problems using one of the Dlls in my application and I ran dependency walker on it i am not sure how to
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • 调用 .ToArray() 时出现 ArgumentException

    我有一个经常被清除的列表 代码完全是这样的 VisitorAgent toPersist List
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • 如何在C#中控制datagridview光标移动

    我希望 datagridview 光标向右移动到下一列 而不是在向单元格输入数据后移动到下一行 我试图通过 dataGridView1 KeyDown 事件捕获键来控制光标 但这并不能阻止光标在将数据输入到单元格后移动到下一行 提前感谢你的
  • 构建 C# MVC 5 站点时项目之间的处理器架构不匹配

    我收到的错误如下 2017 年 4 月 20 日构建 13 23 38 C Windows Microsoft NET Framework v4 0 30319 Microsoft Common targets 1605 5 警告 MSB3
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • 如何在 C# 中获取 CMD/控制台编码

    我需要指定正确的代码页来使用 zip 库打包文件 正如我所见 我需要指定控制台编码 在我的例子中为 866 C Users User gt mode Status for device CON Lines 300 Columns 130 K
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调

随机推荐

  • std::vector 向下调整大小

    C 标准似乎没有声明任何有关容量的副作用resize n with n lt size or clear 它确实对摊余成本做出了声明push back and pop back O 1 我可以设想一种执行通常类型的容量更改的实现 ala C
  • iPhone 应用程序启动

    如何让我的 iPhone 应用程序每次都在同一位置启动 即我的 主 屏幕 我不希望用户回到上次玩游戏时的位置 就在游戏过程中 但这就是正在发生的事情 预先感谢您的任何提示 您需要设置UIApplicationExitsOnSuspend输入
  • asp-for 和 if 条件在同一组件中

    我正在尝试在组件内使用 asp for 和条件 但我找不到方法来做到这一点 这是我的代码
  • 设置定时器问题

    我的双核机器上运行以下代码 当我在同一台 PC 上运行该应用程序的一两个实例时 我的正确计时分辨率为 100 毫秒 然而 当我在同一台 PC 上运行同一应用程序的 3 个实例时 计时分辨率超过 100 毫秒 是否有可能使应用程序的 3 个实
  • Magento XML 用简单的英语构建?

    我一直在阅读有关 Magento 的内容 并且了解其请求周期的核心流程等 基于配置的 MVC 和类重写等 但是 我似乎找不到关于具体细节的好文章 文档 特别是当涉及到为自定义模块等构建 config xml 所需的不同节点时 或者 XML
  • 将不同版本的 python 与 virtualenvwrapper 一起使用

    我使用 Macports 在我的 Mac 上安装了各种版本的 python 当我选择 python 2 7 通过 port select python python27 virtualenvwrapper 工作完美 但是如果我选择另一个版本
  • 使用 boost 创建具有自定义环境的子进程

    文档boost https www boost org doc libs 1 64 0 doc html process html没有提供任何使用自定义环境创建子进程的示例process child 给出了一个例子process syste
  • 如何在单个事务中保存多个 django 模型?

    在我看来 我将数据保存在多个模型中 def myview request do some processing model1 save model2 save 如何确保有回滚model1 save 以防万一model2 save 引发错误
  • 当计时器结束时如何自动继续?

    我想在计时器用完时自动继续 我在这里构建了一个计时器 class Timer var timer NSTimer the callback to be invoked everytime the timer ticks var handle
  • 创造一个只是兑现的空洞承诺? [复制]

    这个问题在这里已经有答案了 我有一个包装器 可以捕获承诺的最后结果 对其进行格式化并输出数据 req resolve promise gt return promise then gt res json req user catch Seq
  • 使用跨几何图形的通用美学和数据框过滤 ggplot2 的几何图形

    假设我有以下数据框 Dummy data frame df lt data frame x rep 1 5 2 y runif 10 z rep c A B each 5 x y z 1 1 0 92024937 A 2 2 0 37246
  • 使用 python 解压主文件夹中的文件夹内的 gz 文件

    我在多个文件夹中有 gz 压缩文件 这些文件都位于名为 usa 的主文件夹中 我能够使用下面的代码提取单个文件 import gzip import shutil source r C usauc300 dbf gz output r C
  • Schedulers.io() 上的并行数据库搜索

    我想知道当我并行访问数据库表时是否应该使用 Schedulers io 还是 Schedulers newThread 例如 如果我使用 Schedulers io 并行地从数千个表中选择记录 则任务完成后会在线程池中创建很多新创建的线程
  • Scala 解释器有哪些限制和解决方法?

    什么样的结构需要 scalac 编译以及如何制作可在解释器中工作的等效结构 Edit 我想使用 scala 而不是 python 作为脚本语言 使用 usr bin scala 您应该能够在 REPL 中执行任何可以在外部代码中执行的操作
  • 将 UIImage 转换为 NSString(反之亦然)

    我需要一种方法来转换 NSString 中的 UIImage 然后将 NSString 转换回 UIImage Thanks 适用于 gt iOS 7 NSString imageToNSString UIImage image NSDat
  • mupdf for android:ndk-build问题(错误:typedef的重新定义......)

    我正在按照必要的步骤安装适用于 Android 的 MuPDF MuPDF 是在我的系统上构建的 我能够使用 C 来利用它 现在尝试使用 Android README 中的所有步骤均已成功执行 但当我执行到步骤 10 时 我就必须这样做nd
  • Rails 错误:`rescue in ':未初始化的常量 Bundler (NameError)

    今天早些时候 我更新了系统上的 gems gem update 它更新了一些 gem 但之后我无法启动我的 Rails 服务器 我收到此错误 Users gugguson rubys my rails app config boot rb
  • NoSuchMethodError Lcom/google/gson/Gson;改造响应后

    因此 我的应用程序发布近一年了 但没有看到此问题 现在它出现了 即使现在 我手机上的调试版本也没有这个问题 我从 Android Studio 打开的任何模拟器都没有任何问题 然而 Google 开发者控制台中的预发布报告中的几乎每个模拟器
  • 了解编译器的工作原理

    我正在学习 C 编程语言 我对编译器如何创建可执行文件有疑问 我的书上说 C 是一种编译语言 因此您需要将源代码翻译为计算机可以执行的文件 这个文件是由编译器生成的 称为目标代码 obj 但是像 hello world 程序这样的程序是由我
  • ostream 链接,输出顺序

    我有一个函数需要ostream引用作为参数 将一些数据写入流 然后返回对同一流的引用 如下所示 include