网上有对于C++编程要避免使用cin、cout、fstream;而是使用scanf、printf、FILE *的说法, 请问是正确的吗?

为什么会有这样的说法呢?
关注者
742
被浏览
830,025

69 个回答

竞赛是这样的,无论他们的性能差别多小,只要是有一丁点差别,那肯定是你输。所以即便两者的性能差别非常小,在竞赛中也会直接决定输赢跟名次。

然后,什么情况下还需要用cin,cout搞输入输出?似乎最主要的场合就是算法竞赛。

这里需要指出:C++的流处理算法严重依赖编译器优化,而 某些 算法竞赛的C++语言是强制关闭优化的(据说是为了平衡其它语言的性能),这就导致了你使用C++输入输出影响性能。

需要避免使用cin,cout,stream的场合,就是那些要求关闭C++编译优化的场合。这种场合它们确实比不上printf。

--

至于商业编程场合,一般不会限制这个。

我个人不用的主要原因是cout的语法太坑了,比不上printf清晰。性能问题倒是次要的。当然,你非要想要用,应该也能用。

为什么cout的语法不够清晰呢?因为要输出的变量可能是某个名字很长的类的某个名字很长的成员变量再调用某个名字很长的函数获得,这样的东西会将当前要输出内容的语意完全割断,使得一眼很难形成「我究竟要打印一串什么句子」的粗略概念。而printf则能够精准的看清楚我究竟要输出什么,然后将其中部分元素,在后续的参数中填进去就好。

C++现在自己都醒悟了,C++20推出了std::format。cout原来那套我也是受不了,只要输出的内容一长,马上看的眼瞎。

std::cout << "Print out " << a << ", " << b << ", " << c << ", " << d << " and " << e << endl;
printf("Print out %d, %d, %d, %d and %d\n", a, b, c, d, e);

你看,就是cout会把一段完整的句子拆成好几段,看的眼瞎。依靠std::format,就能跟其他语言一样。比如可以写的这样,直接跟C#无缝连接。

std::cout << std::format("Print out {0}, {1}, {2}, {3} and {4}\n", a, b, c, d, e);

甚至可以缺省0,1,2这些下标,跟python学习,写成

std::cout << std::format("Print out {}, {}, {}, {} and {}\n", a, b, c, d, e);

这看着马上就清爽多了。