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 链接,输出顺序 的相关文章

随机推荐

  • 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