C/C ++の *および++の優先順位に注意してください(およびプログラミング時のキーストローク)[閉じた
-
29-09-2019 - |
質問
誰かがこの機能を書いています
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++
, 、声明の値を使用していないためです。
++、 - 、 +=などを他の演算子と混合する人は誰でも、読みやすいコードの作成にすでに失敗しています。