プログラミング言語の仕様   ― 塩田研一覚書帳 ―

 移植をするときに気をつけないといけない、プログラミング言語間の仕様の違いをメモしておきます。

剰余

 Python でも C言語でも、整数 a, b に対して a % b は a を b で割った剰余を表しますが、 次のように仕様が異なっています:
  • Python では返り値の符号は除数の符号に合わせる
  • C言語 では返り値の符号は被除数の符号に合わせる
 例えば法演算を行うプログラムを書くとき、 mod n の演算結果を 0 ~ (n-1) で返すとすると、 python なら末尾に % n を付けるだけで済みますが、 C言語では % n で剰余を求めたあと、その値が負の場合には更に += n をする必要があります。
Python:

print "  5  %%   3  = %2d" % (  5  %   3 ) 
print "(-5) %%   3  = %2d" % ((-5) %   3 )
print "  5  %% (-3) = %2d" % (  5  % (-3))
print "(-5) %% (-3) = %2d" % ((-5) % (-3))

  5  %   3  =  2
(-5) %   3  =  1
  5  % (-3) = -1
(-5) % (-3) = -2
C言語:

#include
int main(){
	printf("  5  %%   3  = %2d\n",   5  %   3 );
	printf("(-5) %%   3  = %2d\n", (-5) %   3 );
	printf("  5  %% (-3) = %2d\n",   5  % (-3));
	printf("(-5) %% (-3) = %2d\n", (-5) % (-3));
	return 1;
}

  5  %   3  =  2
(-5) %   3  = -2
  5  % (-3) =  2
(-5) % (-3) = -2

 Python2 と Python3 は別物である、という典型です。 整数 a, b に対して a / b と書くと、Python2 では商が返されますが、 Python3 では分数としての近似値が浮動小数点数で返されます。 Python3 で商を返したければダブルスラッシュ a // b を使い、 これは Python2 でも有効です。
 移植する可能性があるのなら // で書いておけばいい、ということではありますが、 Python2 しか使っていなかった人が知らずに Python3 に移植するととんだバグを生じる恐れがあります。

戻る