2016-05-10 12 views
-1
char destination[6]; 
char source[] = "hello"; 
char* a = destination; 
char* b = source; 

while (*a++ = *b++); 
return destination; 

* a〜* bを設定して、value!= 0であるかどうかを確認してポインタを増やしますか?cループ実行中はどのような順序ですか?

またはポインタをインクリメントしてから、以前のものをチェックしてから、それをチェックしてください!= 0?

+0

あなたがコードを実行することによって、これを推測することができます。ステップバイステップでデバッガを使用することができます。 – usr2564301

+0

**ポスト**増分演算子を理解するために何をしましたか?インクリメントは、式に関して順序付けされていません。 – Olaf

+0

@RadLexus:Cやその他の弱い型の言語を試行錯誤することは悪い考えです。副作用のある演算子では悪化します。 – Olaf

答えて

3

Aのようなwhileループ:それはあたかも

while (<expr>) <body>; 

が実行される:

while (true) { 
    int temp = <expr>; 
    if (!temp) { 
     break; 
    } 
    <body> 
} 

だから前に、(例えば、割り当てインクリメントなど)の任意の副作用を含む全体<expr>を評価値がゼロかどうかをテストします。だから、テストの値が変数がインクリメントされる前に割り当てられていたものは何でもある

int new_a = a + 1; int new_b = b + 1; // These may be evaluated in either order 
temp = (*a = *b); // value of temp will be that value that was assigned to *a 
a = new_a; b = new_b; // Also in either order 

表現temp = *a++ = *b++は次のように評価されます。

+0

これは疑問にはあまり答えません。 ''は '* a ++ = * b ++'です。私はOPが何を 'temp'に割り当てるのか知りたいと思っています。 – Caleb

+1

@Calebありがとうございました、私はいくつかのものを追加しました。 – Barmar

+0

@Barmarこれは、ポストインクリメントであるにもかかわらずポインタを最初にインクリメントしますが、a - のデリファレンスをb-の逆参照に割り当て、その割り当てが!= 0であるかどうかを確認します。 –

-1

* a〜* bを設定して、value!= 0であるかどうかを確認してポインタをインクリメントしますか?

ポインタをインクリメントし、それらを割り振り、値を代入し、その値がその値を生成します。つまり、NULLを代入すると、それはfalseと評価され、停止します。

優先順位

  1. ++
  2. *
  3. =
3

まず、* * bが評価され、値が割り当てられます。
第2に、++の副作用が起こります(a ++とb ++)。
第3に、ポストインクリメントの前の* aの値を使用して、ループを開始するか終了するかを決定します。言い換えれば

、次の同等の表現にプログラムを変換することができます:ポストインクリメントオペレータが最初にその値をインクリメントし、その後、その発現の文脈でそのオペランドを使用しています

int main(){ 
    char destination[6]; 
    char source[] = "hello"; 
    char* a = destination; 
    char* b = source; 

    while (1){ 
    *a=*b; 
    int tmp=*a; 
    a = a + 1; 
    b = b + 1; 
    if (!(tmp)) 
     break; 
    // the original loop body comes here 
    } 
    return 0; 
} 
0

この場合、あなたは正しいです。 *a*bに設定した後、増加後の++演算子が逆参照演算子*より高い優先度を持つため、abをインクリメントします。そして割り当てが最後に評価されるので、割り当てられた値は式の値であり、whileは真/偽、すなわち非ゼロまたはゼロをチェックする。

実際のインクリメントは、オペランドが評価された後のある時点で発生します。このため、シーケンスポイントのない同じ式の同じ変数に演算子++または--を使用すると、未定義の動作につながります。

+0

しかし、式 '* a ++ = * b ++'の値は何ですか? – Caleb

-1

割り当て演算子はright-to-leftから評価され、++(ポストインクリメント)演算子より低い優先順位(評価の順序)を持ちます。

while (*a++ = *b++); 

まず*b++、あなたの質問に答えるためには、その後*a++が評価され、評価されます。これはポストインクリメントであるため、前の値*aは前の値の*bになります。最後に、式はブール値に変換され、bがヌルアドレスを指していない場合、式は真と評価され、そうでない場合は偽と評価されます。

それは、これに相当します

while (*a = *b) { 
    ++a, ++b; 
} 
関連する問題