は、次のコードサンプル考えてみましょう:私は-1
をすることを期待している間にsize_tのremainder演算子で負の剰余を取得するにはどうすればよいですか?
#include <iostream>
#include <string>
int main()
{
std::string str("someString"); // length 10
int num = -11;
std::cout << num % str.length() << std::endl;
}
http://cpp.shにこのコードを実行すると、私は、結果として5
を取得します。
Iはstr.length()
のタイプが符号なしの実装に依存し、そしてためnum
符号なしsize_t
にsigned int
から変換させる二項演算子で発生暗黙的型変換のsize_t
(複数あるため、これが起こることを知っていますhere); これにより、負の値が正の値になり、操作の結果が失われます。
一つはint
に明示的なキャストとの問題に対処すると考えることもできます。これはうまくいくかもしれない
num % (int)str.length()
それはint
の最大値より大きい長さの文字列の場合には、たとえば、保証されていません。 long long
のようなより大きなタイプのリスクを減らすことができますが、size_t
がunsigned long long
の場合はどうなりますか?同じ問題。
この問題は、移植性が高く堅牢な方法でどう対処しますか?
これは剰余演算子です。動作は使用している標準のバージョンによって異なります。 – EJP
2011年以前に書かれたCコードと2011年以前に書かれたC++コードは、この場合、矛盾した動作をする可能性があります。最新のコンパイラ/標準を使用してください。 – Lundin
size_tは長い間長く表現されるかもしれませんが、私はそれが最大になるとは思っていません。あなたのプラットフォームがexa-byte文字列の長さをサポートしていない限り、私はどんな場合でも妥当な制限だと思います。 – Andreas