当前位置: 首页 > 知识库问答 >
问题:

cout

裴哲
2023-03-14

以下代码:

myQueue.enqueue('a');
myQueue.enqueue('b');
cout << myQueue.dequeue() << myQueue.dequeue();

将“ba”打印到控制台

同时:

myQueue.enqueue('a');
myQueue.enqueue('b');
cout << myQueue.dequeue();
cout << myQueue.dequeue();

印“AB”这是为什么?

似乎cout在调用最外层(最接近;)函数优先,它的工作方式,这是它的行为方式吗?

共有1个答案

李光华
2023-03-14

<<运算符没有序列点,因此编译器可以自由地首先计算dequeue函数。可以保证的是,第二个dequeue调用的结果(按照它在表达式中出现的顺序,而不一定按照它的求值顺序)是第一个<<'的结果的<<'(如果您明白我的意思的话)。

所以编译器可以自由地将您的代码翻译成类似于这些(伪中间C++)的东西。这并不是一个详尽无遗的清单。

auto tmp2 = myQueue.dequeue();
auto tmp1 = myQueue.dequeue();
std::ostream& tmp3 = cout << tmp1;
tmp3 << tmp2;

auto tmp1 = myQueue.dequeue();
auto tmp2 = myQueue.dequeue();
std::ostream& tmp3 = cout << tmp1;
tmp3 << tmp2;

auto tmp1 = myQueue.dequeue();
std::ostream& tmp3 = cout << tmp1;
auto tmp2 = myQueue.dequeue();
tmp3 << tmp2;

下面是在原始表达式中,临时词所对应的。

cout << myQueue.dequeue() << myQueue.dequeue();
|       |               |    |               |
|       |____ tmp1 _____|    |_____ tmp2 ____|
|                       |
|________ tmp3 _________|
 类似资料:
  • 主要内容:C++ cout成员方法格式化输出,使用流操纵算子格式化输出在某些实际场景中,我们经常需要按照一定的格式输出数据,比如输出浮点数时保留 2 位小数,再比如以十六进制的形式输出整数,等等。 对于学过 C 语言的读者应该知道,当使用 printf() 函数输出数据时,可以通过设定一些合理的格式控制符,来达到以指定格式输出数据的目的。例如 %.2f 表示输出浮点数时保留 2 位小数,%#X 表示以十六进制、带 0X 前缀的方式输出整数。 关于 printf()

  • 主要内容:C++ tellp()成员方法,C++ seekp()成员方法通过前面章节的学习我们知道,无论是使用 cout 输出普通数据,用 cout.put() 输出指定字符,还是用 cout.write() 输出指定字符串,数据都会先放到输出流缓冲区,待缓冲区刷新,数据才会输出到指定位置(屏幕或者文件中)。 值得一提的是,当数据暂存于输出流缓冲区中时,我们仍可以对其进行修改。ostream 类中提供有 tellp() 和 seekp() 成员方法,借助它们就可以修改

  • 在C语言中,我们通常会使用 scanf 和 printf 来对数据进行输入输出操作。在 C++语言中,C语言的这一套输入输出库我们仍然能使用,但是 C++ 又增加了一套新的、更容易使用的输入输出库。 【例1】简单的输入输出代码示例: 运行结果如下(↙表示按下回车键): Please input an int number: 8↙ The int number is x= 8 Please inpu

  • 问题内容: 我需要针对其产生太多输出到一对夫妇共享库链接到我的C 程序 ,并 使得它们既没有用我的用途。我可以访问这些库的C 源代码,但无法对其进行修改。 当与我的代码链接时,是否可以将其输出重定向到其他流或取消显示?我希望使用C ++的简洁方式,但是由于担心那是不可能的,我也会对肮脏的链接程序黑客感到满意。作为最后的手段,“代理”也可以。 我使用的是GNU工具链(工作,,Linux下)。 问题答

  • 问题内容: 好吧,主题基本上说明了一切。 我有一个命令行实用程序,可以使用管道或I / O重定向来交互使用或在脚本中使用。我使用和用于I / O,我想在结束时,如果输出控制台写一个额外的EOL,使用户提示将从下一行开始。在脚本中这将是有害的。 我可以假设吗?我知道没有干净的方法来获取流的文件描述符。还是? 问题答案: 可以使用rdbuf()在程序中更改std :: cin和std :: cout的

  • 本文向大家介绍c++中cin/cout与scanf/printf的区别比较,包括了c++中cin/cout与scanf/printf的区别比较的使用技巧和注意事项,需要的朋友参考一下 cin 、cout    基本说明:   cin代表标准输入设备,使用提取运算符 ">>" 从设备键盘取得数据,送到输入流对象cin中,然后送到内存。   cin是输入流,cout是输出流,重载了">>"、"<<"运

  • std::cout是std::ostream的一个实例。我可以在一个名为usr/include/c/7/iostream的文件中看到std::cout的声明: 而std::ostream由typedef std::basic\u ostream定义 此外,您似乎无法创建std::ostream的实例。请参阅此演示代码片段: 以下是编译器对上述代码段的抱怨: 问题来了,因为

  • 我在下面的某个地方看到了代码片段。 由于前面提到的代码片段工作得很好,它表明std::cout是从std::ostream派生而来的。但我还找不到任何直接的参考资料。 根据文件,其中说[强调我的]: 全局对象std::cout和std::wcout控制输出到实现定义类型的流缓冲区(源自std::stream buf),与标准C输出流stdout相关联。 上面的引文表示,控制输出到派生自std::s