最初の質問では、 (a+b)++
「の値をa+b
1つ増やす」という意味です。
a+b
ただし、変数ではないため、インクリメントすることはできません。次のコードで何が起こると思いますか?
int a = 1, b = 2;
printf("a = %d, b = %d, a+b = %d\n", a, b, a+b);
(a+b)++;
printf("a = %d, b = %d, a+b = %d\n", a, b, a+b);
明らかに最初printf
は印刷する必要があります
a = 1、b = 2、a + b = 3
しかし、2番目のものはどうですか?
a =?、b =?、a + b = 4
合計をインクリメントした場合、aまたはbがどうあるべきかは明確ではありません。
2番目の質問については、データをコピーするときに変更することを忘れないでください。p2
したがって、データが指しているものを印刷するように要求するときは、文字列の先頭ではなく末尾を指していることに注意してください。
文字列のコピーを行う簡単な方法は、次のstrcpy
ように使用することです。
strcpy(p2, p1);
p1
の文字列のサイズがのサイズより大きくないことがわかっているため、これは安全であることに注意してくださいp2
。文字列のサイズがわからない場合(たとえば、ユーザー入力から文字列を取得する場合)、ウィキペディアで概説されているように注意する必要があります。
なぜwhile(++*p2=++*p1);
機能しないのかについては、次のようになりwhile(*p2++=*p1++);
ます。
Postfix-++
は。よりも優先順位が高くなり*
ます。これは、*p2++
を意味し*(p2++)
ます。それで
*(p2++) = something;
と同じです
*p2 = something;
p2 += 1;
一方、++*p2
は++(*p2)
、または「p2
1つインクリメントされたものは何でも」を意味します。
繰り返しますが、次のように言うと、問題が発生します。
int a = 5, *p2 = &a;
++*p2 = 10;
printf("a = %d\n", a);
これが何を印刷すると思いますか?どちらかといえば、コンパイラにそのことを伝えているので、9を出力するはずです*p2+1 = 10
。
Cコンパイラがその方程式を解くことは期待できませんが、言語を単純かつ効率的に保つために、この種のことは禁止されています。