为什么许多在线评委建议"不要使用%lld
说明符来读写С++"中的64位整数?
是首选使用cin
, cout
流还是%I64d
说明符?
我相信答案与%lld
意味着long long decimal
有关,不能保证是64位的。例如,在某些系统上它可能是128位的。(虽然如果变量是long long
而不是,比如说,uint64_t
,那么我希望使用%lld
是正确的-否则它会出错)
不幸的是,printf
和scanf
及其兄弟的设计使得编译器实现和格式必须匹配。
显然,cout
和cin
是安全的,因为编译器会自己选择正确的输出和输入转换。
这也可能与"在线裁判"使用的编译器有关——我认为微软编译器在某些时候支持64位整数,但不支持long long
,因此没有%lld
,但有%l64d
。
cin
和cout
上的<<
和>>
操作符有适用于所有整数和浮点类型的版本。如果你使用cin
和cout
,你只需要执行cin >> integer_variable
或cout << integer_variable
就可以了,cin
和cout
会找出该做什么。
如果您使用某种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位。如果您的编译器提供了另一种类型__int64
或int64_t
(加上相同的无符号版本),那正好是64位,您不应该混合和匹配它们的类型说明符,因为这经常是错误的。对于long long
和unsigned long long
,您仍然应该使用"%lld"
和"%llu"
,以及适用于__int64
(也许是"%I64d"
)和int64_t
(PRId64
宏)的任何内容。
基本上,您应该避免使用printf()-like
函数,或者非常小心使用它们。
Ans to 1:
因为在他们的后台使用编译器。GNU
支持%l64d
, MS
支持%lld
和%l64d
。
Ans to 2:
是,最好使用cin
、cout
。因为在内部他们自己做决定