为什么cout.put()在流中不能正常工作?

时间:2014-02-11 12:04:56

标签: c++

为什么程序结果在这两种情况下不同?

案例1)

cout<<"using cout.put(c): "<<cout.put(c);
cout.put('!');

案例2)

cout<<"using cout.put(c): ";
cout.put(c);
cout.put('!');

案例1)是: 使用cout.put(c):0x477864!

案例2)是: 使用cout.put(c):U!

2 个答案:

答案 0 :(得分:3)

详细说明其他人所说的:在案例1中,编译器 将尝试为返回值找到<<运算符 cout.put(c),并使用它。 cout.put(c)返回 一个std::ostream&,没有<<,但有一个 std::ostream将隐式转换为bool(C ++ 11)或 a void*(早期的C ++)。因此,您<<致电void* (从你的输出来判断)。

另请注意,在cout.put(c)内调用<<时 表达式是未指定的(除了它必须在之前 void*的{​​{1}}。所以你很容易就会得到:

Uusing cout.put(c): 0x477864!

using cout.put(c): U0x477864!

(因为<<实际上是函数调用,它引入了 排序,我不认为任何其他组合是可能的。)

一般情况下,只要你有一个<<的序列,就可以期待 无论任何一方,要输出的右侧的 表达可能有的影响。你打电话给cout.put(c) 它的副作用,而不是它的价值,所以你不应该使用它 一个<<。 (要输出序列中的单个字符,只需使用 << c。)

答案 1 :(得分:1)

cout.put(c)返回对cout对象的引用。在第一种情况下,您打印该对象。

std::basic_ostream::put reference