手元にコンパイラはありませんが、これは私の好奇心をかきたてます。次のようなコードがある場合:
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 番目になります。関数呼び出しは、単項マイナスよりも演算子の優先順位が高いため、関数を呼び出してから、単項マイナス結果を呼び出します。