多くのオンライン審査員が「С++ で 64 ビット整数の読み取りまたは書き込みに %lld 指定子を使用しないでください」とアドバイスする理由
cin、cout ストリーム、または%I64d
指定子?を使用することをお勧めします。
多くのオンライン審査員が「С++ で 64 ビット整数の読み取りまたは書き込みに %lld 指定子を使用しないでください」とアドバイスする理由
cin、cout ストリーム、または%I64d
指定子?を使用することをお勧めします。
答えは%lld
meansに関連していると思いますがlong long decimal
、これは 64 ビットであることが保証されていません。たとえば、一部のシステムでは 128 ビットである可能性があります。(ただし、変数がlong long
ではなく、たとえば、uint64_t
を%lld
使用するのが正しいと思います-または、逆にうまくいかないでしょう)
printf
残念ながら、とscanf
およびその兄弟の設計では、コンパイラの実装と形式が一致する必要があります。
明らかにcout
、cin
コンパイラが適切な出力と入力の変換を選択するという意味で安全です。
また、「オンライン審査員」が使用するコンパイラと関係があるかもしれません.Microsoftコンパイラは、ある時点で64ビット整数をサポートしていたと思いますlong long
が%lld
、%l64d
.
andの<<
and>>
演算子には、すべての整数型と浮動小数点型のバージョンがありますcin
。cout
andを使用するcin
と、 orをcout
実行するだけで完了し、何をすべきかがわかります。cin >> integer_variable
cout << integer_variable
cin
cout
何らかの種類の を使用する場合はprintf()
、渡す内容に十分注意する必要があります。を渡す場合は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"
。整数の型と一致しない型指定子を渡すと、undefined behaviorが呼び出されます。その結果、プログラムが間違った数値を出力したり、プログラム自体が破損したり、ハングしたり、クラッシュしたり、その他の不可解な方法で誤動作したりする可能性があります。
long long
現在、C++11 言語標準 (および C99) には、64 ビット以上の整数型(およびその符号なしの対応する型) が少なくとも 1 つありunsigned long long
ます。これを使用する場合は、64 ビットを超える可能性があることに注意する必要があります。コンパイラが別の型を提供する場合、__int64
またはint64_t
(および同じものの符号なしバージョンを加えて) それが正確に 64 ビットである場合、それらの型指定子を混在させて一致させるべきではありません。"%lld"
and "%llu"
for long long
and unsigned long long
and and and for __int64
(おそらく"%I64d"
) and for int64_t
(PRId64
マクロ)を使用する必要があります。
基本的に、関数の使用を避けるか、printf()-like
十分に注意する必要があります。