为什么许多在线评委建议"不要使用%lld说明符来读取或写入С++中的64位整数.最好使用cin,cout流或%I64d说明符." ?
Mat*_*son 13
我相信答案与%lld
手段无关long long decimal
,不保证是64位.例如,它可能是某些系统上的128位.(虽然如果变量long long
不是,比如说,uint64_t
那么我认为%lld
是正确的选择 - 或者反过来会出错)
不幸的是,printf
and scanf
和他们的兄弟姐妹的设计是这样的,编译器实现和格式必须匹配.
显然,cout
并且cin
是在这个意义上安全的编译器将选择合适的输出和输入翻译本身.
它也可能与"在线评委"使用的编译器有关 - 我认为微软编译器在某些时候支持64位整数,但不是long long
,因此没有%lld
,但确实有%l64d
.
and上的 and 运算符具有<<
适用于每个整数和浮点类型的版本。如果你使用and ,你只需执行or就完成了,并且会弄清楚要做什么。>>
cin
cout
cin
cout
cin >> integer_variable
cout << integer_variable
cin
cout
如果您使用某种printf()
,那么您必须非常小心传递给它的内容。如果传递给它 an int
,则还必须传递其类型说明符"%d"
、 for unsigned int
it's "%u"
、 for long
it's "%ld"
、 for unsigned long long
it's "%llu"
、 for size_t
it's"%zu"
等等。如果您传递的类型说明符与整数的类型不匹配,则会调用未定义的行为。因此,您的程序可能会打印错误的数字或自行损坏或挂起或崩溃或以其他某种神秘的方式行为不当。
现在,C++11 语言标准(和 C99)至少有一种 64 位或更长的整数类型long long
(及其无符号对应类型unsigned long long
)。如果您使用它,您必须注意它可能比 64 位长。如果您的编译器提供了另一种类型,__int64
或者int64_t
(加上相同类型的无符号版本),这正是 64 位,您不应该混合和匹配它们的类型说明符,因为这经常是错误的做法。您仍然应该使用"%lld"
and "%llu"
for long long
andunsigned long long
以及任何适合__int64
(也许,"%I64d"
)和 for int64_t
(PRId64
宏)的内容。
基本上,您应该避免使用printf()-like
函数或非常小心地使用它们。
归档时间: |
|
查看次数: |
21183 次 |
最近记录: |