これは、面接準備の本 - Algorithms for Interviews で見ました。答えが何であるかは言わなかった。
私の知識に基づいて、それは false を返します。何か不足していますか?
これは、面接準備の本 - Algorithms for Interviews で見ました。答えが何であるかは言わなかった。
私の知識に基づいて、それは false を返します。何か不足していますか?
Javascriptが頭に浮かびます。それには特別な数値がありますInfinity
。
したがって、これは実際には true を返します。
var x = Infinity;
alert(x == x + 1);
x != x + 1
すべての xに対して、整数を使用します。浮動小数点数では、真であるとは限りません。指数が十分に大きいと、1 は取るに足らないものになり、仮数の最後で失われます。これは、値を無限大にする可能な最大の指数であることからわかる最も簡単なケースです。そして、無限プラス 1 は無限大です。しかし、それはより小さな指数でも機能します。
次に、演算子のオーバーロードをサポートする言語では、そのような些細な数学的法則を破る可能性が非常に高くなります。たとえば、Python では、
>>> class X(object):
... def __eq__(self, other):
... return True
... def __add__(self, other):
... return self
...
>>> x = X()
>>> x == x + 1
True
質問でタイプ (および実装) が指定されていない限り、それが常に true であると想定するのは安全ではありません。しかし、整数であると指定されているのでx != x + 1
、すべての x についてそれを知ることができます。整数は一連のビットとして格納され、最後のビットをトグルして 1 を追加し、それが 1 などだった場合は繰り上げることで 1 を追加しますが、同じ結果になることはありません (提供される整数型のビット数に関係なく)。ゼロより大きい)。
そうすべき :)
それはまた真実です
x = Int32.MaxValue;
result = x == x + 1;
言語と演算子の優先順位によって異なります。==
演算子の優先順位が演算子と同じか、それよりも高い可能性があり+
ます。その場合、式は に展開され((x == x) + 1)
、エラーが発生するか (ブール値に 1 を追加しているため)、または 2 に評価される可能性があります (多くの言語でTRUE
は equalsであるため1
)。
==
あるとすれば、どの言語が同等またはそれよりも優先されるかはわかりません+
。
C および C++ では、符号付き整数の最大値が整数型にオーバーフローを格納する場合の動作が定義されていません。たとえば、型の最大の正当な値は(Standard ヘッダーで使用可能)int
として知られています。これらの言語は、特に何もする必要はありません。. しかし、(パフォーマンス上の理由から) すべての算術演算からオーバーフローをテストする追加のマシン コードを生成する可能性はほとんどありません。むしろ、通常は CPU がオーバーフローに反応し、感じられる結果を生成します。INT_MAX
INT_MAX + 1
INT_MAX
CPU レベルでは、オーバーフローの可能性を検出したり、追加を無視したり、なんらかの例外を生成したりして、CPU が救済しない本当の理由はありません。後者が OS/アプリに伝播されないか、それらによって無視される場合、本来の価値が見られるかもしれません。しかし、ほとんどの CPU は、符号付きの型の "+ 1" を符号なしの型の場合と同じように扱います。C/C++ では、モジュロを単純にラップする必要があります2^#bits
。符号付きの数値としてどのように解釈されるかは、符号付きの数値表現のどれに依存するかによって異なります。使用中です。一部の言語と CPU では、BCD 値の整数演算が可能である場合があります。オーバーフローにどのように反応するかを推測するのはさらに困難です。
たとえばJavaではx == x + 1
、コードが複数のスレッドで実行される場合にも当てはまります。
その間に別のスレッドが変更x
される可能性があるため、最終的に条件が true になる可能性があります。x
キャッシュされないようにするには、変数を volatile として宣言する必要があります。
もちろん、Paul の言うことを実行しない限り、これは false に違いありません ;) x+1 は、x よりも 1 大きい値に評価されます。したがって、たとえば 45 == 45 + 1 は false です。この式では代入は行われません。