C/C ++の *および++の優先順位に注意してください(およびプログラミング時のキーストローク)[閉じた

StackOverflow https://stackoverflow.com/questions/3110140

質問

誰かがこの機能を書いています

void strToUpper(char *p) {
  while (*p) {
    *p = TOUPPER(*p);
    *p++;                //<-- Line to pay attention
  }
}

私は尋ねました、なぜあなたはP ++の前に *を置くのですか?

回答:「それは同じだ」ので、私はコードを修正して、しばらく怒らせています。

void strToUpper(char *p) {
  while (*p) {
    *p = TOUPPER(*p);
    p++;                //<-- Line to pay attention
  }
}

だから、これをStackOverFlowと共有したいと思います。例:

char s [6] = "hello";

どうしますか?

*++ptr;

これにより、++プレインクリメント(ポインターの上)、次に控除演算子 *が評価されます。したがって、char値「e」(「hello」の2番目の文字)が表示されます(この場合は使用せず、生成できますコンピレーションに関する警告)とポインターは「E」(位置1)から指されます

どうしますか?

*ptr++;

これは、最初に抑制演算子 *を評価するため、少し奇妙です。したがって、char値「H」(この場合は使用されない)、そして++ポストインクリメント(ポインターへ)を使用するため、 (繰り返します)ポインターは「E」から指されます(位置1)

どうしますか?

ptr++;

最後に、charのlvalueはありませんが、使用されていない場合は警告を生成しません。ポインターは「e」(位置1)からも指しています。

これらの3つのフォームは、ポインターアドレスの観点から同じことをします。

IMHOそれはいくつかのコンピューター言語(ほとんどすべての人)の最悪のことです。

「コードとバグの間には、距離が悪い」

プログラミング時に冗長性はありません。法律の本を取り、ランダムチャーを内部に書くと読み取り可能になりますが、プログラミング時にランダムを入力すると、バグ、100%の精度が得られます。

役に立ちましたか?

解決

++には優先順位があります。しかし、私は同意します、あなたが両方を同じ声明に混ぜることは不明です。

他のヒント

Cのオペレーターの優先順位によると、 ++ 最初にのみ評価します *. 。だから *p++, ptr その価値が削減され、その後、声明はopbjectの価値を取得します ptr 今指しています。もちろん、これは違いはありません ptr++, 、声明の値を使用していないためです。

++、 - 、 +=などを他の演算子と混合する人は誰でも、読みやすいコードの作成にすでに失敗しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top