7

以下はC++ のコードです。Python のようなものを試すと-2%5、結果は正の 3 になりますが、c++ C# ( code ) やフラッシュなどの他の多くの言語では -2が返されます。

なぜ彼らは-2を与え、一方のバージョンが他方よりも正しいのですか?

#include <cstdio>
int main(){
printf("%d\n", 2%5);
printf("%d\n", -2%5);
printf("%d\n", -2%77);
printf("%d\n", 2%-77);
printf("%d\n", -2%-77);
}

出力:

2
-2
-2
2
-2
4

3 に答える 3

7

場合r = a % nは、a = n * q + rいくつかの場合qrこれは、選択される の値に応じて、の値に多くの選択肢があることを意味しますq

http://en.wikipedia.org/wiki/Modulo_operationを読むことをお勧めします。ほとんどのプログラミング言語r-n < r < n. つまり、rがゼロでない限り、 の値には 2 つの選択肢がありますr。1 つは正、もう 1 つは負です。プログラミング言語が異なれば、肯定的なものと否定的なもののどちらを採用するかについても、さまざまな決定が下されます。そのページには、さまざまな言語の機能をまとめた表があります。

  • Python は(上に表示されているものと同じ)rと同じ記号を選択しnます。
  • C++ 2011 はr、と同じ符号を選択​​しますa(2011 標準より前では、実装で定義されています)。

Python で確実に正の値を取得したい場合は、次のようにします。

r = a % n
if r < 0:
  r += n
于 2012-02-17T08:32:14.483 に答える
2

C++のドキュメントによると:

負の値の場合、ライブラリの実装によって結果が異なる場合があります。

これは奇妙に思えます。Pythonのドキュメントには、これだけが書かれ​​ています:

モジュロ演算子は常に、2 番目のオペランドと同じ符号 (またはゼロ) の結果を返します。結果の絶対値は、2 番目のオペランドの絶対値より厳密に小さくなります。

Python の方がより論理的であるように私には思えますが、それは直感にすぎません。

于 2012-02-17T08:32:01.620 に答える
-1

下記を見ていただければと思います。わずかに異なるアルゴリズムを使用するだけでなく、演算子の優先順位も重要です。括弧で試してください:

In [170]: 2%5
Out[170]: 2

In [171]: -2%5
Out[171]: 3

In [172]: (-2)%5
Out[172]: 3

In [173]: -(2%5)
Out[173]: -2
于 2012-02-17T08:31:46.237 に答える