2017-10-05 504 views
0

我想把一个cout和一个cin放在同一行上,所以cout << "Person 1:" <<cin>> int p1;。有人知道我可以成功做同样的事情吗?如何将cout和cin放在同一行上?

我使用C++上repl.it是否有帮助

+0

是尝试分号来分隔两个不同的语句 - 你可以把多个语句在同一行(虽然频繁,使得它很难把一个在调试器中的第二个或更后的语句中的断点)。 – davidbak

+0

我不明白为什么有这种必要把它放在一行。最好编写一个可读且易于调试的代码,而不是只保存一行代码。 – rcs

+0

为什么?!?!你是否正在努力编写难以理解的代码? –

回答

0

你不能这样做,在一个命令/声明。

你需要做的是这样的:

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

您显示的代码将无法正常工作,因为你不能传递一个std::istream(如std::cin)到std::ostream(如std::cout)的operator<<。您需要将表达式分开,方法是将它们分开:

0

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

当你喜欢写东西std::cout << "he" << 11 << 'o',它提供拨打std::cout << "he"在第一(左关联的operator<< 的情况下)。它完成了它的代码(在stdout上打印“he”)并返回左边的参数,所以现在原始行是std::cout << 11 << 'o',然后再次调用最左边的operator<<,它的参数为:std::cout << 11,控制台上现在为"he11",行可以是解释为std::cout << 'o'

返回左arg流对象即使在您的对象上也提供链接。这与输入操作员的工作相同。 stream >> x >> y;表示从流stream读取的值,将其存储到x然后读取下一个值,将其存储在y中。

0

你可以写:

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

这将是一个可怕的想法在字迹清晰的代码,我主要是张贴在回应其他几个方面谁说,这实际上不可能。

0

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

您可以将istream的运算符重载为完成该任务,然后在返回istream之前使用istream的unget(),这会导致输入转到cout然后转到p1变量。这可以看出,在我下面的示例代码:

#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 
+0

两个操作数都在'namespace std'中的重载操作符意味着它不会被ADL找到;它发生在这个玩具程序中,但会在使用命名空间的大型程序中失败 –

+0

哦,我知道,我正在展示OP可以运行问题中发布的代码行的方式。并不意味着我建议这样做。 –