以下のコードの出力はコンパイラに依存しますか、それともすべてのコンパイラで同じであることが保証されていますか?
int main()
{
int i=5;
i=i/3;
printf("%d\n",i);
return 0;
}
以下のコードの出力はコンパイラに依存しますか、それともすべてのコンパイラで同じであることが保証されていますか?
int main()
{
int i=5;
i=i/3;
printf("%d\n",i);
return 0;
}
はい、あなたの例の動作は明確に定義されています。
ただし、負の値の場合はあまり明確ではありません。C99 より前では、整数除算がゼロに向かって丸められるか、負の無限大に向かって丸められるかは、実装定義のままでした。
いずれかのオペランドが負の場合、演算子の結果が
/
代数商よりも小さい最大の整数であるか、代数商よりも大きい最小の整数であるかは実装定義です
C99 では、ゼロに丸めることが義務付けられています。
整数が除算されると、
/
演算子の結果は小数部分が破棄された代数商になります。
C99 標準、セクション 6.5.5、パラグラフ 6:
整数を除算すると、/ 演算子の結果は、小数部分が破棄された代数商になります。商 a/b が表現可能な場合、式 (a/b)*b + a%b は a と等しくなります。
標準では、これは一般に「ゼロへの切り捨て」と呼ばれることにも注意してください。
そうです、それは明確に定義されています。