Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我们不';不能将格式说明符与cout一起使用?_C++_C_Printf_Cout_Format Specifiers - Fatal编程技术网

C++ 为什么我们不';不能将格式说明符与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,每个参数的格式在

当我们使用printf时,我们使用格式说明符(例如%c,%p),但当我们使用cout时,我们不使用它们为什么以及在后台做了什么,因为我们没有使用它们


我知道它们在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;