0

「Programminginobjective-c」の著者であるKochanからobjective-cを学んでいます。第3版。第8章「継承」では、高ちゃん氏がその方法について次のように説明しています。

-(void) setOrigin: (XYPoint *) pt
{
if (! origin)
origin = [[XYPoint alloc] init];
origin.x = pt.x;
origin.y = pt.y;
}

"このメソッドは、最初にインスタンス変数の原点がゼロ以外であるかどうかをテストします(そのテストと、使用されている論理否定演算子の使用を理解してください!)すべてのインスタンス変数が最初にゼロに設定されていることを思い出してください。オブジェクトが割り当てられると、originを含むそのインスタンス変数はゼロに設定されます。

原点がゼロの場合、setOrigin:メソッドは新しいXYPointオブジェクトを割り当てて初期化し、そのオブジェクトへの参照を原点に保存します。」

論理的な間違いはありますか?「setOrigin」メソッドは、原点がゼロ以外の場合にのみ新しいXYPointオブジェクトを割り当てませんか?

4

3 に答える 3

5

あなたの引用は言う:

原点がゼロの場合、..。

つまり、originがゼロ(nil)の場合、! origintrueになり、新しいXYPointものが割り当てられます。

ここでは論理的な矛盾は見られません。

于 2012-10-15T03:42:06.943 に答える
1

いいえ、「!」この場合、は論理NOT演算です。「origin」がゼロの場合、!originはTRUEです。「origin」がゼロ以外の場合、!originはFALSEです。したがって、次の行(XYPointオブジェクトを割り当てて初期化する)は、原点がゼロの場合にのみ実行されます。著者が述べているように。

于 2012-10-15T03:44:00.127 に答える
0

著者は確かに正しいです。

これが、Cでの不完全な比較が好きではない理由です。

彼がコーディングした場合if (origin)、そのブール式は、originゼロ以外の値に対して真になります。

したがって、彼がそれを否定すると、ブール式if (! origin)は原点がゼロの場合にのみ真になります。

IMO、これは恐ろしいことif (origin == NULL)であり、それをはるかに明確にするためにコーディングする必要があります。

彼は悪いコーディングの習慣を教えるために邪魔をしているように私には思えます。この種の構成は常にコードの臭いを放ちます。

于 2012-10-15T03:38:01.217 に答える