为什么使用cin,cout或%I64d优于C++中的%lld说明符?

Ris*_*abh 16 c++

为什么许多在线评委建议"不要使用%lld说明符来读取或写入С++中的64位整数.最好使用cin,cout流或%I64d说明符." ?

Mat*_*son 13

我相信答案与%lld手段无关long long decimal,不保证是64位.例如,它可能是某些系统上的128位.(虽然如果变量long long不是,比如说,uint64_t那么我认为%lld是正确的选择 - 或者反过来会出错)

不幸的是,printfand scanf和他们的兄弟姐妹的设计是这样的,编译器实现和格式必须匹配.

显然,cout并且cin是在这个意义上安全的编译器将选择合适的输出和输入翻译本身.

它也可能与"在线评委"使用的编译器有关 - 我认为微软编译器在某些时候支持64位整数,但不是long long,因此没有%lld,但确实有%l64d.


Ale*_*nze 5

and上的 and 运算符具有<<适用于每个整数和浮点类型的版本。如果你使用and ,你只需执行or就完成了,并且会弄清楚要做什么。>>cincoutcincoutcin >> integer_variablecout << integer_variablecincout

如果您使用某种printf(),那么您必须非常小心传递给它的内容。如果传递给它 an int,则还必须传递其类型说明符"%d"、 for unsigned intit's "%u"、 for longit's "%ld"、 for unsigned long longit's "%llu"、 for size_tit's"%zu"等等。如果您传递的类型说明符与整数的类型不匹配,则会调用未定义的行为。因此,您的程序可能会打印错误的数字或自行损坏或挂起或崩溃或以其他某种神秘的方式行为不当。

现在,C++11 语言标准(和 C99)至少有一种 64 位或更长的整数类型long long(及其无符号对应类型unsigned long long)。如果您使用它,您必须注意它可能比 64 位长。如果您的编译器提供了另一种类型,__int64或者int64_t(加上相同类型的无符号版本),这正是 64 位,您不应该混合和匹配它们的类型说明符,因为这经常是错误的做法。您仍然应该使用"%lld"and "%llu"for long longandunsigned long long以及任何适合__int64(也许,"%I64d")和 for int64_tPRId64宏)的内容。

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