10

これは、面接準備の本 - Algorithms for Interviews で見ました。答えが何であるかは言わなかった。

私の知識に基づいて、それは false を返します。何か不足していますか?

4

7 に答える 7

12

Javascriptが頭に浮かびます。それには特別な数値がありますInfinity

したがって、これは実際には true を返します。

var x = Infinity;
alert(x == x + 1);
于 2011-07-13T06:50:38.853 に答える
8

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 を追加します、同じ結果になることはありません (提供される整数型のビット数に関係なく)。ゼロより大きい)。

于 2011-07-13T07:02:16.087 に答える
3

そうすべき :)

それはまた真実です

x = Int32.MaxValue;
result = x == x + 1;
于 2011-07-13T06:44:04.550 に答える
3

言語と演算子の優先順位によって異なります。==演算子の優先順位が演算子と同じか、それよりも高い可能性があり+ます。その場合、式は に展開され((x == x) + 1)、エラーが発生するか (ブール値に 1 を追加しているため)、または 2 に評価される可能性があります (多くの言語でTRUEは equalsであるため1)。

==あるとすれば、どの言語が同等またはそれよりも優先されるかはわかりません+

于 2011-07-13T06:56:18.930 に答える
3

C および C++ では、符号付き整数の最大値が整数型にオーバーフローを格納する場合の動作が定義されていません。たとえば、型の最大の正当な値は(Standard ヘッダーで使用可能)intとして知られています。これらの言語は、特に何もする必要はありませ。. しかし、(パフォーマンス上の理由から) すべての算術演算からオーバーフローをテストする追加のマシン コードを生成する可能性はほとんどありません。むしろ、通常は CPU がオーバーフローに反応し、感じられる結果を生成します。INT_MAXINT_MAX + 1INT_MAX

CPU レベルでは、オーバーフローの可能性を検出したり、追加を無視したり、なんらかの例外を生成したりして、CPU が救済しない本当の理由はありません。後者が OS/アプリに伝播されないか、それらによって無視される場合、本来の価値が見られるかもしれません。しかし、ほとんどの CPU は、符号付きの型の "+ 1" を符号なしの型の場合と同じように扱います。C/C++ では、モジュロを単純にラップする必要があります2^#bits。符号付きの数値としてどのように解釈されるかは、符号付きの数値表現のどれに依存するかによって異なります。使用中です。一部の言語と CPU では、BCD 値の整数演算が可能である場合があります。オーバーフローにどのように反応するかを推測するのはさらに困難です。

于 2011-07-13T08:13:49.437 に答える
2

たとえばJavaではx == x + 1、コードが複数のスレッドで実行される場合にも当てはまります。

その間に別のスレッドが変更xされる可能性があるため、最終的に条件が true になる可能性があります。xキャッシュされないようにするには、変数を volatile として宣言する必要があります。

于 2013-10-30T06:45:39.153 に答える
0

もちろん、Paul の言うことを実行しない限り、これは false に違いありません ;) x+1 は、x よりも 1 大きい値に評価されます。したがって、たとえば 45 == 45 + 1 は false です。この式では代入は行われません。

于 2011-07-13T06:50:48.557 に答える