为什么在c++中首选使用cin、cout或%I64d而不是%lld说明符?



为什么许多在线评委建议"不要使用%lld说明符来读写С++"中的64位整数?

是首选使用cin, cout流还是%I64d说明符?

我相信答案与%lld意味着long long decimal有关,不能保证是64位的。例如,在某些系统上它可能是128位的。(虽然如果变量是long long而不是,比如说,uint64_t,那么我希望使用%lld是正确的-否则它会出错)

不幸的是,printfscanf及其兄弟的设计使得编译器实现和格式必须匹配。

显然,coutcin是安全的,因为编译器会自己选择正确的输出和输入转换。

这也可能与"在线裁判"使用的编译器有关——我认为微软编译器在某些时候支持64位整数,但不支持long long,因此没有%lld,但有%l64d

cincout上的<<>>操作符有适用于所有整数和浮点类型的版本。如果你使用cincout,你只需要执行cin >> integer_variablecout << integer_variable就可以了,cincout会找出该做什么。

如果您使用某种printf(),那么您必须非常小心传递给它的内容。如果你给它传递一个int,你也必须传递它的类型说明符"%d",对于unsigned int"%u",对于long"%ld",对于unsigned long long"%llu",对于size_t"%zu",以此类推。如果传递的类型说明符与整型不匹配,则会调用未定义行为。结果,你的程序可能会打印错误的数字或损坏自己或挂起或崩溃或以其他一些神秘的方式表现不佳。

现在,c++ 11语言标准(和C99)至少有一种64位或更长时间的整数类型long long(以及它的无符号对应unsigned long long)。如果你使用它,你必须知道它可以超过64位。如果您的编译器提供了另一种类型__int64int64_t(加上相同的无符号版本),那正好是64位,您不应该混合和匹配它们的类型说明符,因为这经常是错误的。对于long longunsigned long long,您仍然应该使用"%lld""%llu",以及适用于__int64(也许是"%I64d")和int64_t (PRId64宏)的任何内容。

基本上,您应该避免使用printf()-like函数,或者非常小心使用它们。

Ans to 1:因为在他们的后台使用编译器。GNU支持%l64d, MS支持%lld%l64d

Ans to 2:是,最好使用cincout。因为在内部他们自己做决定

相关内容

  • 没有找到相关文章

最新更新