0

これはばかげた質問かもしれません。

私はこれについて完全に混乱しています。基本を正しく理解していないことを認めます。なぜ

BOOL *booleanTest = (5 < 1)? YES : NO;

コンパイルエラーをスローしませんでした。これはプリミティブデータ型であり、ポインターを持つことはできません。内部の条件に関係なく、常にコンパイルして yes を返すようにしました。

理由と理由を教えてください

int *magicNumber = value / 25;

コンパイルエラーをスローしませんでした。

4

2 に答える 2

2

C は、あなたが思っているほど厳密には型付けされていません。通常は賢明ではありませんが、ポインタに整数を代入することは正当です。ただし、コンパイラは、割り当てがキャストなしで整数からポインターを作成することを警告する必要があります。

于 2013-07-10T03:24:52.713 に答える
-1

どちらの場合も、変数を宣言し、初期化を一切行わずに変数自体を使用しています。

宣言と初期化の違いがわからないので、宣言中に変数の値がガベージまたはランダムな値に設定されると仮定しています。それがどのように割り当てられるかは、ポインターが指しているメモリセルが、そこに値を残した他のアプリケーションによって使用されたランダムなメモリセルであるためです。最初のケースで何が起こるか:

BOOL *booleanTest = (5 < 1)? YES : NO;

ポインター booleanTest は BOOL 型に設定されており、ポインターが指す値は、完全なメモリ セルを指すのに必要な数値の半分だけです。したがって、セルの最初の数ビットを占め、これはおそらく 1 であるため、常に YES になります。

2番目のケースでは

int *magicNumber = value / 25;

指定された値内に値を格納することが合法的に許可されているため、コンパイル エラーは発生しません。ポインターの正確な変数型にキャストされた型を取得します。

于 2013-07-10T03:33:45.080 に答える