21

多くのオンライン審査員が「С++ で 64 ビット整数の読み取りまたは書き込みに %lld 指定子を使用しないでください」とアドバイスする理由

cin、cout ストリーム、または%I64d指定子?を使用することをお勧めします。

4

3 に答える 3

16

答えは%lldmeansに関連していると思いますがlong long decimal、これは 64 ビットであることが保証されていません。たとえば、一部のシステムでは 128 ビットである可能性があります。(ただし、変数がlong longではなく、たとえば、uint64_t%lld使用するのが正しいと思います-または、逆にうまくいかないでしょう)

printf残念ながら、とscanfおよびその兄弟の設計では、コンパイラの実装と形式が一致する必要があります。

明らかにcoutcinコンパイラが適切な出力と入力の変換を選択するという意味で安全です。

また、「オンライン審査員」が使用するコンパイラと関係があるかもしれません.Microsoftコンパイラは、ある時点で64ビット整数をサポートしていたと思いますlong long%lld%l64d.

于 2013-03-30T11:43:56.203 に答える
5

andの<<and>>演算子には、すべての整数型と浮動小数点型のバージョンがありますcincoutandを使用するcinと、 orをcout実行するだけで完了し、何をすべきかがわかります。cin >> integer_variablecout << integer_variablecincout

何らかの種類の を使用する場合はprintf()、渡す内容に十分注意する必要があります。を渡す場合はint、その型指定子"%d"、 for unsigned intit's "%u"、 for longit's "%ld"、 for unsigned long longit's "%llu"、 for size_tit'sなども渡す必要があります"%zu"。整数の型と一致しない型指定子を渡すと、undefined behaviorが呼び出されます。その結果、プログラムが間違った数値を出力したり、プログラム自体が破損したり、ハングしたり、クラッシュしたり、その他の不可解な方法で誤動作したりする可能性があります。

long long現在、C++11 言語標準 (および C99) には、64 ビット以上の整数型(およびその符号なしの対応する型) が少なくとも 1 つありunsigned long longます。これを使用する場合は、64 ビットを超える可能性があることに注意する必要があります。コンパイラが別の型を提供する場合、__int64またはint64_t(および同じものの符号なしバージョンを加えて) それが正確に 64 ビットである場合、それらの型指定子を混在させて一致させるべきではありません。"%lld"and "%llu"for long longand unsigned long longand and and for __int64(おそらく"%I64d") and for int64_t(PRId64マクロ)を使用する必要があります。

基本的に、関数の使用を避けるか、printf()-like十分に注意する必要があります。

于 2013-03-30T11:58:30.447 に答える