C++ 为什么我们不';不能将格式说明符与cout一起使用?
当我们使用printf时,我们使用格式说明符(例如%c,%p),但当我们使用cout时,我们不使用它们为什么以及在后台做了什么,因为我们没有使用它们C++ 为什么我们不';不能将格式说明符与cout一起使用?,c++,c,printf,cout,format-specifiers,C++,C,Printf,Cout,Format Specifiers,当我们使用printf时,我们使用格式说明符(例如%c,%p),但当我们使用cout时,我们不使用它们为什么以及在后台做了什么,因为我们没有使用它们 我知道它们在C和C++中的用法不同,但我仍然想知道在CUT中如何格式化,而它是通过格式说明符在PrtTF中完成的。 基本上答案是操作符重载。函数可以具有相同的名称,只要它们采用不同的参数 >操作符 C++ >代码> OFSUCT::操作符< P>,因为 Prtff 被正确设计, CUT/COD>具有恶劣的内部状态。使用printf,每个参数的格式在
我知道它们在C和C++中的用法不同,但我仍然想知道在CUT中如何格式化,而它是通过格式说明符在PrtTF中完成的。
基本上答案是操作符重载。函数可以具有相同的名称,只要它们采用不同的参数<代码> >操作符
C++ >代码> OFSUCT::操作符< P>,因为<代码> Prtff <代码>被正确设计,<代码> CUT/COD>具有恶劣的内部状态。使用
printf
,每个参数的格式在格式字符串中都是明确的;没有隐藏状态。使用cout
,您还可以控制格式设置(如字段宽度等),但它是iostream对象内部的隐藏状态。如果流的前一个用户将其保持在非默认状态,则除非显式重置状态,否则您将执行错误的操作。你甚至不想去想在多线程的使用情况下会发生什么…你是否不知道流修饰符或者问它们是如何工作的?或者更确切地说,它们是如何工作的…@Duck是的,我不知道流修饰符以及它们是如何工作的一个巨大的cout问题是使它易于翻译的可能性变大了。printf()函数至少支持位置参数,这使得它成为可能,只是它在跨平台上的工作不是很好。解决这个问题的另一种方法是Qt字符串的arg()函数,称为QString。在这种情况下,您使用%1、%2、%3。。。引用第一个、第二个和第三个arg()。这意味着您可以用英语写“the%1 car”,用法语写“la voiture%1”(即用颜色替换%1)。用cout!我也不认为printf设计得很好。它没有类型安全性,使用危险的va_列表功能实现,并且对其参数进行无声的隐式提升。因此,我可能会调用printf,因为它远没有像C函数那样正确设计。然后,C++添加了必要的手段来设计更糟糕的控制台打印功能……IoSt流有“隐藏”状态,PrtTf和公司也做了(虽然承认有点少)。仅举一个例子,尝试思考如何在没有内部状态的情况下实现%n
“转换”。虽然转换修饰符的期限较短,但宽度、精度、-
、+
和#
等转换修饰符也会影响隐藏的内部状态。不,与%n
相关的状态是当前调用printf
(自动存储)的状态,而不是文件的状态。作为文件
或全局存储的一部分,没有与printf
格式相关的状态(除了附加格式函数的非标准glibc特定注册,以及UB领域的其他实现上的类似内容)。
ostream& operator<<(ostream& os, const YourObject& rhs) {
os << rhs.member;
return os;
}
class ostream
{
public:
ostream& operator<<( int val );
ostream& operator<<( float val );
ostream& operator<<( const char* val );
};
int val = 0;
printf("%d\n", val);
std::cout << val << std::endl;