次のような方法はありますか:
char* a = "Hello";
char* b = NULL;
char* c = a | b;
Result should be c = "Hello";
Char* では動作しないようですが、そのような方法はありますか?
次のような方法はありますか:
char* a = "Hello";
char* b = NULL;
char* c = a | b;
Result should be c = "Hello";
Char* では動作しないようですが、そのような方法はありますか?
これは、ポインターのビット演算子が非常に... 興味深い... 結果をもたらすだけでなく、主にNULL が 0 で表されることが保証されていないため、ナンセンスです。
三項演算子を使用して可能です。以下のコードは、a == NULL の場合はcをbに設定し、それ以外の場合はcをaに設定します。
char *c = (a == NULL)? b : a;
ここで、ビット単位の演算子を明確にします: | および & は、オペランドのビットに作用します。a = 10000001 (128) と b = 10000010 (129) という 2 つの変数があるとします。a と b の型は問題ではなく、それらの値のビット表現のみが重要です。
| | b = 10000011、つまり、a と b のビット間でビットごとの OR を取ります。
a & b = 10000000、つまり、a と b のビット間でビットごとの AND を取ります。
これらの演算子は、変数の値のビットを直接操作する場合に意味があります。C では、ポインタの値はメモリのチャンクのアドレスであり、チャンクの内容ではありません。ポインターにビット演算を適用するということは、ポインターが保持するアドレスにビット演算を適用することを意味します。この操作の結果は、メモリ上のほぼすべての場所を指す可能性があり、このポインターを使用すると、セグメンテーション フォールト(または少なくともジャンク データ) が発生する可能性があります。