1

私はこれが基本的なものの一部であることを理解していますが、私は立ち往生しています:-(誰かが私を助けてくれますか?

プログラム1:

#include <stdio.h>
#include <stdlib.h> 

int main()
{
 int a=1,b=2,c;
 c=(a+b)++;
}

出力にエラーがあるのはなぜですか?左辺値が必要ですか?

プログラム2:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
 char *p1="name";
 char *p2;

 p2=(char*)malloc(20);
 memset(p2,0,20);

 while(*p2++=*p1++);
 printf("%s\n",p2);

}

出力が空の文字列であるのはなぜですか?そして、インクリメントの順序を逆にすると、つまりwhile(++*p2=++*p1);、左辺値エラーが発生するのはなぜですか?

4

4 に答える 4

8

最初の質問では、 (a+b)++「の値をa+b1つ増やす」という意味です。

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)、または「p21つインクリメントされたものは何でも」を意味します。

繰り返しますが、次のように言うと、問題が発生します。

 int a = 5, *p2 = &a;
 ++*p2 = 10;
 printf("a = %d\n", a);

これが何を印刷すると思いますか?どちらかといえば、コンパイラにそのことを伝えているので、9を出力するはずです*p2+1 = 10

Cコンパイラがその方程式を解くことは期待できませんが、言語を単純かつ効率的に保つために、この種のことは禁止されています。

于 2011-05-30T07:10:38.980 に答える
2
c=(a+b)++;

a+bは左辺値ではありません-加算の結果(右辺値)にどのように何かを割り当てたいですか-そして++/-演算子は新しい値を割り当てます。

while(*p2++=*p1++);

p2\0は、文字列の最後にあるを指します。ループの前に、p2が指す元のアドレスを保存する必要があります。

char *p3 = p2;
while(*p2++=*p1++)
    ;
printf("%s\n",p3);
于 2011-05-30T07:08:52.693 に答える
1
c=(a+b)++;

演算子は++一時変数を操作しません。(a+b)一時的なものを形成します。

while(*p2++=*p1++);

ここでインクリメントp2しています。ループの後、最後の呼び出しp2によって返されたメモリブロックの先頭を指しなくなります。malloc()

于 2011-05-30T07:09:08.917 に答える
1

whileループを見ると、次のようになります。

while(* p2 ++ = * p1 ++);

式がゼロ以外の場合はCで「True」であり、ゼロの場合はfalseであることに注意してください。ループに本体がない場合でも、制御の流れは次のとおりです。

条件の確認->本文のステートメントの実行->条件の確認

ここで、「条件のチェック」とは、「ステートメントを評価して、ゼロ以外かどうかを確認する」ことを意味します。

whileループは、p1がゼロを指すまで動作し続けます。ゼロになると、制御はprintfに渡されます。

例えば

int main() 
{
    int array1[] = {2, 3, 1, 0, 3, 5};
    int array2[20];
    int * p2 = (int *)memset(array2, 0, 20*sizeof(int));
    int * p1 = array1;

    while(*p2++ = *p1++) {
        printf("In while: p1 is %d\n", *p1);
    }
    printf("Out of while: %d\n",*p2);
    return 0;

}

収量:

In while: p1 is 3
In while: p1 is 1
In while: p1 is 0
Out of while: 0
于 2011-10-03T14:27:08.543 に答える