1.endl是一个特殊值,称为操纵符,将它写入输出流时,不仅具有输出换行的效果,而且它刷新与设备关联的缓冲区,通过刷新缓冲区,用户可立即看到写入到流中的输出;'/n'仅仅是一个换行符,将它写入到输出流时,只能起到一个换行的作用,不能刷新输出。 因此建议,在能用cout < <endl;的形式时不要用cout < <"/n"形式。 程序员经常在调试过程中插入输出语句,这些语句都应该刷新输出流。忘记刷新输出流可能会造成输出信息停留在缓冲区,如果程序崩溃,将会导致对程序崩溃位置的错误判断。
2.
#include "stdafx.h"
#include <iostream>
#include <iomanip>
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << std::setw(10) << std::setfill('*') << std::endl; // (1)
std::cout << std::setw(10) << std::setfill('*') << '/n'; // (2)
return 0;
}
关于“第一行什么也没输出,第二行输出”的一个应该是正确的解释:
endl为put('/n') + flush(),有的系统上换行符不是'/n',另当别论。而put()不能使用setw()和setfill()指定格式,所以只是单纯的输出一个字符,所以第一行没有输出。 这个和flush无关,flush只是强迫输出,并不清理标志。