【问题标题】:How do I put a cout and a cin on the same line?如何将 cout 和 cin 放在同一行?
【发布时间】:2017-10-05 01:55:00
【问题描述】:

我试图将 cout 和 cin 与cout << "Person 1:" << cin >> int p1; 放在同一行。有人知道我可以成功地做同样的事情吗?

如果有帮助,我会在 repl.it 上使用 C++

【问题讨论】:

  • 尝试用分号分隔两个不同的语句 - 您可以在一行中放置多个语句(尽管在调试器中,这通常会导致难以在第二个或后面的语句上放置断点)。
  • 我不明白为什么有必要将它放在一行中。编写一个可读且更易于调试的代码比仅仅保存一行代码要好。
  • 为什么?!?!您是否尝试编写难以理解的代码?
  • 你想让代码做什么?

标签: c++ io cin cout


【解决方案1】:

您显示的代码将不起作用,因为您不能将std::istream(如std::cin)传递给operator<<std::ostream(如std::cout)。您需要分隔表达式,通过以下任一方式分隔它们:

【讨论】:

    【解决方案2】:

    你可以写:

    int p1 = (cin >> (cout << "Person 1: ", p1), p1);
    

    就编写清晰的代码而言,这将是一个糟糕的想法,我发布它主要是为了回应其他几个说这实际上不可能的人。

    【讨论】:

      【解决方案3】:

      您不能在单个命令/语句中做到这一点。

      你需要这样做:

      int p1;
      cout << "Person 1:";
      cin >> p1;
      

      【讨论】:

        【解决方案4】:

        所有流操作符都是返回流对象。 cincoutistreamostream 类的全局实例。当您使用operator&lt;&lt;/operator&gt;&gt; 时,它们是返回流对象以提供链接。

        当你写像std::cout &lt;&lt; "he" &lt;&lt; 11 &lt;&lt; 'o' 这样的东西时,它首先提供调用std::cout &lt;&lt; "he"(以防左结合 operator&lt;&lt;)。它完成了它的代码(在标准输出上打印“he”)并返回左参数,所以现在原行是std::cout &lt;&lt; 11 &lt;&lt; 'o',然后将再次调用最左边的operator&lt;&lt; 及其参数:std::cout &lt;&lt; 11,在控制台上将@987654333 @now,该行可以解释为std::cout &lt;&lt; 'o'

        left arg 流对象的返回甚至在您的对象上提供链接。这与输入运算符相同。 stream &gt;&gt; x &gt;&gt; y; 表示从流stream 读取值,将其存储到x,然后读取下一个值,将其存储在y

        【讨论】:

          【解决方案5】:

          我不知道你为什么要这样做,但我还是会尝试回答你。

          您可以为 istream 重载

          #include <iostream>
          using namespace std;
          istream &operator<<(ostream& out, istream& in){
            int a = 0;
            in >> a;
            out << a;
            in.unget();
            return in;
          }
          
          int main()
          {
            int p1;
            cout << "Person 1: " << cin >> p1;
            cout << "Test: " <<  p1 << endl;
            return 0;
          }
          

          请注意,此重载专门用于整数,不适用于其他数据类型。您可能会在action here, 中看到此代码,但请注意,真正的输出实际上是

          Person 1: 5
          5Test: 5
          

          【讨论】:

          • 两个操作数都在namespace std中的重载运算符意味着ADL找不到它;它恰好在这个玩具程序中工作,但在使用命名空间的更大程序中会失败
          • 哦,我知道,我展示了一种 OP 可以运行问题中发布的代码行的方式。并不意味着我建议这样做。
          【解决方案6】:

          只需按 空格 而不是 Enter

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-03-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-07-08
            • 1970-01-01
            相关资源
            最近更新 更多