【问题标题】:C++ mixing printf and cout [duplicate]C ++混合printf和cout [重复]
【发布时间】:2012-12-02 07:44:59
【问题描述】:

可能重复:
mixing cout and printf for faster output

我使用的是 Microsoft Visual Studio 6.0。

下面的程序,

#include "stdafx.h"
#include "iostream.h"

int main(int argc, char* argv[])
{
printf("a");
printf("b");
printf("c");
return 0;
}

产生“abc”。

虽然下面的程序,

#include "stdafx.h"
#include "iostream.h"

int main(int argc, char* argv[])
{
printf("a");
cout<<"b";
printf("c");
return 0;
}

产生“acb”。

有什么问题?我不能在同一个程序中混合使用 cout 和 printf 吗?

【问题讨论】:

  • sync_with_stdio 能解决问题吗?我从来没用过。
  • @CaptainMurphy:不,不是。混合宽窄的语义是未指定的,而上述代码的语义是明确定义的,它必须打印“abc”,除非调用sync_with_stdio(false),这不会发生在这里。基本上 MSVC6 不符合标准...

标签: c++ printf cout


【解决方案1】:

标准规定:

当标准 iostream 对象 str 与标准同步时 stdio流f,插入字符c的效果by

fputc(f, c);

效果是一样的

str.rdbuf()->sputc(c);

对于任何字符序列;

默认情况下,除非您调用sync_with_stdio(false),否则cout 将与stdout 同步。因此,您的第二个代码 sn-p 相当于:

printf("a");
fputc(stdout, 'b')
printf("c");

即使在您的实施中也必须产生“abc”。

底线:MSVC6 不符合标准,这并不奇怪,因为它已经很老了。

【讨论】:

  • “这并不奇怪,因为它已经很老了”——不管怎样,在微软没有人在乎标准。
  • @H2CO3:不完全正确......他们确实致力于改进他们的 C++ 编译器。特别是你不能这么说,例如,MSVC10 不是对 MSVC6 的改进。
  • @H2CO3 这在很长一段时间内都是正确的。现在 MS 处于视线水平。根据我们的可移植性团队,MS 在实现 C++11 方面更快
  • @H2CO3:你正在改变讨论的主题。这里没有人谈论 C,我认为 MSVC 纯粹是一个 C++ 编译器。特别是因为我不关心 C 支持。今天,它非常接近于成为一个符合标准的 C++ 编译器,以至于很难将它与 GCC 进行比较。是的,两者都有错误,但两者都很好。
  • @H2CO3:我的评论是针对您的评论(我引用),“无论如何,在微软没有人关心标准。”每个人都可以判断
猜你喜欢
  • 2011-06-26
  • 2020-08-12
  • 2011-02-12
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
相关资源
最近更新 更多