手元にコンパイラはありませんが、これは私の好奇心をかきたてます。次のようなコードがある場合:
float a = 1;
float b = 2;
-a.add(b);
次のように実行されますか?
add(-a, b);
また
-add(a, b);
手元にコンパイラはありませんが、これは私の好奇心をかきたてます。次のようなコードがある場合:
float a = 1;
float b = 2;
-a.add(b);
次のように実行されますか?
add(-a, b);
また
-add(a, b);
floatもちろん、メソッドを持たないという事実は別としてadd、言語が何らかの形でadd関数のプロパティを知っている場合を除きます。そうしないと、明らかに間違っている可能性があります。 forに置き換える-f(x)とどうなるか想像してみてください。f(-x)f(x) = x * x
ただし、コンパイラがそれaddが単なる追加であることを認識している場合 (たとえば、関数をインライン化する場合)、結果が変更されない限り、任意の方法を選択できます。
式の場合-a.add(b)、は とは明らかに(-a) + b異なる-(a + b)ため、コンパイラは正しいものを選択します。優先順位表によると、関数呼び出しの方が優先度が高いため、-(add(a, b))選択されます。
後者は、加算/減算に関して符号が重要になるためです。
のようなものを定義すると仮定するとfloat add(float a, float b) { return a + b; }、それは 2 番目になります。関数呼び出しは、単項マイナスよりも演算子の優先順位が高いため、関数を呼び出してから、単項マイナス結果を呼び出します。